Import Upstream version 1.8.5
[hcoop/debian/openafs.git] / src / viced / fs_stats.h
1 /*
2 * Copyright 2000, International Business Machines Corporation and others.
3 * All Rights Reserved.
4 *
5 * This software has been released under the terms of the IBM Public
6 * License. For details, see the LICENSE file in the top-level source
7 * directory or online at http://www.openafs.org/dl/license10.html
8 */
9
10 #ifndef __fs_stats_h
11 #define __fs_stats_h 1
12
13 /*------------------------------------------------------------------------
14 * fs_stats.h
15 *
16 * Definitions supporting call and performance information gathering for
17 * the FileServer xstat (extended statistics) interface.
18 *
19 *------------------------------------------------------------------------*/
20
21
22 #include <afs/param.h> /*System configuration info */
23
24
25 /*
26 * Performance numbers.
27 */
28 struct afs_PerfStats {
29 afs_int32 numPerfCalls; /*# of performance calls rcvd */
30
31 /*
32 * Vnode cache section.
33 */
34 afs_int32 vcache_L_Entries; /*Num entries in LARGE vnode cache */
35 afs_int32 vcache_L_Allocs; /*# allocs, large */
36 afs_int32 vcache_L_Gets; /*# gets, large */
37 afs_int32 vcache_L_Reads; /*# reads, large */
38 afs_int32 vcache_L_Writes; /*# writes, large */
39
40 afs_int32 vcache_S_Entries; /*Num entries in SMALL vnode cache */
41 afs_int32 vcache_S_Allocs; /*# allocs, small */
42 afs_int32 vcache_S_Gets; /*# gets, small */
43 afs_int32 vcache_S_Reads; /*# reads, small */
44 afs_int32 vcache_S_Writes; /*# writes, small */
45
46 afs_int32 vcache_H_Entries; /*Num entries in HEADER vnode cache */
47 afs_int32 vcache_H_Gets; /*# gets */
48 afs_int32 vcache_H_Replacements; /*# replacements */
49
50 /*
51 * Directory package section.
52 */
53 afs_int32 dir_Buffers; /*Num buffers in use */
54 afs_int32 dir_Calls; /*Num read calls made */
55 afs_int32 dir_IOs; /*I/O ops performed */
56
57 /*
58 * Rx section. These numbers represent the contents of the
59 * rx_stats structure maintained by Rx. All other Rx info,
60 * including struct rx_debug and connection stuff is available
61 * via the rxdebug interface.
62 */
63 afs_int32 rx_packetRequests; /*Packet alloc requests */
64 afs_int32 rx_noPackets_RcvClass; /*Failed pkt requests, receives */
65 afs_int32 rx_noPackets_SendClass; /*Ditto, sends */
66 afs_int32 rx_noPackets_SpecialClass; /*Ditto, specials */
67 afs_int32 rx_socketGreedy; /*Did SO_GREEDY succeed? */
68 afs_int32 rx_bogusPacketOnRead; /*Short pkts rcvd */
69 afs_int32 rx_bogusHost; /*Host addr from bogus pkts */
70 afs_int32 rx_noPacketOnRead; /*Read pkts w/no packet there */
71 afs_int32 rx_noPacketBuffersOnRead; /*Pkts dropped from buff shortage */
72 afs_int32 rx_selects; /*Selects waiting on pkt or timeout */
73 afs_int32 rx_sendSelects; /*Selects forced upon sends */
74 afs_int32 rx_packetsRead_RcvClass; /*Packets read, rcv class */
75 afs_int32 rx_packetsRead_SendClass; /*Packets read, send class */
76 afs_int32 rx_packetsRead_SpecialClass; /*Packets read, special class */
77 afs_int32 rx_dataPacketsRead; /*Uniq data packets read off wire */
78 afs_int32 rx_ackPacketsRead; /*Ack packets read */
79 afs_int32 rx_dupPacketsRead; /*Duplicate data packets read */
80 afs_int32 rx_spuriousPacketsRead; /*Inappropriate packets read */
81 afs_int32 rx_packetsSent_RcvClass; /*Packets sent, rcv class */
82 afs_int32 rx_packetsSent_SendClass; /*Packets sent, send class */
83 afs_int32 rx_packetsSent_SpecialClass; /*Packets sent, special class */
84 afs_int32 rx_ackPacketsSent; /*Ack packets sent */
85 afs_int32 rx_pingPacketsSent; /*Ping packets sent */
86 afs_int32 rx_abortPacketsSent; /*Abort packets sent */
87 afs_int32 rx_busyPacketsSent; /*Busy packets sent */
88 afs_int32 rx_dataPacketsSent; /*Unique data packets sent */
89 afs_int32 rx_dataPacketsReSent; /*Retransmissions sent */
90 afs_int32 rx_dataPacketsPushed; /*Retransmissions pushed by NACK */
91 afs_int32 rx_ignoreAckedPacket; /*Packets w/acked flag on rxi_Start */
92 afs_int32 rx_totalRtt_Sec; /*Ttl round trip time, secs */
93 afs_int32 rx_totalRtt_Usec; /*Ttl round trip time, usecs */
94 afs_int32 rx_minRtt_Sec; /*Min round trip time, secs */
95 afs_int32 rx_minRtt_Usec; /*Min round trip time, usecs */
96 afs_int32 rx_maxRtt_Sec; /*Max round trip time, secs */
97 afs_int32 rx_maxRtt_Usec; /*Max round trip time, usecs */
98 afs_int32 rx_nRttSamples; /*Round trip samples */
99 afs_int32 rx_nServerConns; /*Ttl server connections */
100 afs_int32 rx_nClientConns; /*Ttl client connections */
101 afs_int32 rx_nPeerStructs; /*Ttl peer structures */
102 afs_int32 rx_nCallStructs; /*Ttl call structures */
103 afs_int32 rx_nFreeCallStructs; /*Ttl free call structures */
104
105 /*
106 * Host module fields.
107 */
108 afs_int32 host_NumHostEntries; /*Number of host entries */
109 afs_int32 host_HostBlocks; /*Blocks in use for hosts */
110 afs_int32 host_NonDeletedHosts; /*Non-deleted hosts */
111 afs_int32 host_HostsInSameNetOrSubnet; /*" in same [sub]net as server */
112 afs_int32 host_HostsInDiffSubnet; /*" in different subnet as server */
113 afs_int32 host_HostsInDiffNetwork; /*" in different network as server */
114 afs_int32 host_NumClients; /*Number of client entries */
115 afs_int32 host_ClientBlocks; /*Blocks in use for clients */
116
117 /*
118 * Host systype
119 */
120 afs_int32 sysname_ID; /*Unique hardware/OS identifier */
121
122 afs_int32 rx_nBusies; /*Ttl VBUSYs sent to shed load */
123 afs_int32 fs_nBusies; /*Ttl VBUSYs sent during restart/vol clone */
124
125 /*
126 * Can't count this as an RPC because it breaks the data structure
127 */
128 afs_int32 fs_nGetCaps; /* Number of GetCapabilities calls */
129 /*
130 * Spares
131 */
132 afs_int32 spare[28];
133 };
134
135 /*
136 * Assign each of the File Server's RPC interface routines an index.
137 */
138 #define FS_STATS_RPCIDX_FETCHDATA 0
139 #define FS_STATS_RPCIDX_FETCHACL 1
140 #define FS_STATS_RPCIDX_FETCHSTATUS 2
141 #define FS_STATS_RPCIDX_STOREDATA 3
142 #define FS_STATS_RPCIDX_STOREACL 4
143 #define FS_STATS_RPCIDX_STORESTATUS 5
144 #define FS_STATS_RPCIDX_REMOVEFILE 6
145 #define FS_STATS_RPCIDX_CREATEFILE 7
146 #define FS_STATS_RPCIDX_RENAME 8
147 #define FS_STATS_RPCIDX_SYMLINK 9
148 #define FS_STATS_RPCIDX_LINK 10
149 #define FS_STATS_RPCIDX_MAKEDIR 11
150 #define FS_STATS_RPCIDX_REMOVEDIR 12
151 #define FS_STATS_RPCIDX_SETLOCK 13
152 #define FS_STATS_RPCIDX_EXTENDLOCK 14
153 #define FS_STATS_RPCIDX_RELEASELOCK 15
154 #define FS_STATS_RPCIDX_GETSTATISTICS 16
155 #define FS_STATS_RPCIDX_GIVEUPCALLBACKS 17
156 #define FS_STATS_RPCIDX_GETVOLUMEINFO 18
157 #define FS_STATS_RPCIDX_GETVOLUMESTATUS 19
158 #define FS_STATS_RPCIDX_SETVOLUMESTATUS 20
159 #define FS_STATS_RPCIDX_GETROOTVOLUME 21
160 #define FS_STATS_RPCIDX_CHECKTOKEN 22
161 #define FS_STATS_RPCIDX_GETTIME 23
162 #define FS_STATS_RPCIDX_NGETVOLUMEINFO 24
163 #define FS_STATS_RPCIDX_BULKSTATUS 25
164 #define FS_STATS_RPCIDX_XSTATSVERSION 26
165 #define FS_STATS_RPCIDX_GETXSTATS 27
166
167 #define FS_STATS_NUM_RPC_OPS 28
168
169 /*
170 * Assign an index to each of the File Server's RPC interface routines
171 * that transfer any data to speak of.
172 */
173 #define FS_STATS_XFERIDX_FETCHDATA 0
174 #define FS_STATS_XFERIDX_STOREDATA 1
175
176 #define FS_STATS_NUM_XFER_OPS 2
177
178 /*
179 * Record to track timing numbers for each File Server RPC operation.
180 */
181 struct fs_stats_opTimingData {
182 afs_int32 numOps; /*Number of operations executed */
183 afs_int32 numSuccesses; /*Number of successful ops */
184 struct timeval sumTime; /*Sum of sample timings */
185 struct timeval sqrTime; /*Sum of squares of sample timings */
186 struct timeval minTime; /*Minimum timing value observed */
187 struct timeval maxTime; /*Minimum timing value observed */
188 };
189
190 /*
191 * We discriminate byte size transfers into this many buckets.
192 */
193 #define FS_STATS_NUM_XFER_BUCKETS 9
194
195 #define FS_STATS_MAXBYTES_BUCKET0 128
196 #define FS_STATS_MAXBYTES_BUCKET1 1024
197 #define FS_STATS_MAXBYTES_BUCKET2 8192
198 #define FS_STATS_MAXBYTES_BUCKET3 16384
199 #define FS_STATS_MAXBYTES_BUCKET4 32768
200 #define FS_STATS_MAXBYTES_BUCKET5 131072
201 #define FS_STATS_MAXBYTES_BUCKET6 524288
202 #define FS_STATS_MAXBYTES_BUCKET7 1048576
203
204
205 /*
206 * Record to track timings and byte sizes for data transfers.
207 */
208 struct fs_stats_xferData {
209 afs_int32 numXfers; /*Number of xfers */
210 afs_int32 numSuccesses; /*Number of successful xfers */
211 struct timeval sumTime; /*Sum of timing values */
212 struct timeval sqrTime; /*Sum of squares of timing values */
213 struct timeval minTime; /*Minimum xfer time recorded */
214 struct timeval maxTime; /*Maximum xfer time recorded */
215 afs_int32 sumBytes; /*Sum of bytes transferred */
216 afs_int32 minBytes; /*Minimum value observed */
217 afs_int32 maxBytes; /*Maximum value observed */
218 afs_int32 count[FS_STATS_NUM_XFER_BUCKETS]; /*Tally for each range of bytes */
219 };
220
221 /*
222 * Macros to operate on time values.
223 *
224 * fs_stats_TimeLessThan(t1, t2) Non-zero if t1 is less than t2
225 * fs_stats_TimeGreaterThan(t1, t2) Non-zero if t1 is greater than t2
226 * fs_stats_GetDiff(t3, t1, t2) Set t3 to the difference between
227 * t1 and t2 (t1 is less than or
228 * equal to t2).
229 * fs_stats_AddTo(t1, t2) Add t2 to t1
230 * fs_stats_TimeAssign(t1, t2) Assign time t2 to t1
231 * afs_stats_SquareAddTo(t1,t2) Add square of t2 to t1
232 */
233 #define fs_stats_TimeLessThan(t1, t2) \
234 ((t1.tv_sec < t2.tv_sec) ? 1 : \
235 (t1.tv_sec > t2.tv_sec) ? 0 : \
236 (t1.tv_usec < t2.tv_usec) ? 1 : \
237 0)
238
239 #define fs_stats_TimeGreaterThan(t1, t2) \
240 ((t1.tv_sec > t2.tv_sec) ? 1 : \
241 (t1.tv_sec < t2.tv_sec) ? 0 : \
242 (t1.tv_usec > t2.tv_usec) ? 1 : \
243 0)
244
245 #define fs_stats_GetDiff(t3, t1, t2) \
246 { \
247 /* \
248 * If the microseconds of the later time are smaller than \
249 * the earlier time, set up for proper subtraction (doing \
250 * the carry). \
251 */ \
252 if (t2.tv_usec < t1.tv_usec) { \
253 t2.tv_usec += 1000000; \
254 t2.tv_sec -= 1; \
255 } \
256 t3.tv_sec = t2.tv_sec - t1.tv_sec; \
257 t3.tv_usec = t2.tv_usec - t1.tv_usec; \
258 }
259
260 #define fs_stats_AddTo(t1, t2) \
261 { \
262 t1.tv_sec += t2.tv_sec; \
263 t1.tv_usec += t2.tv_usec; \
264 if (t1.tv_usec > 1000000) { \
265 t1.tv_usec -= 1000000; \
266 t1.tv_sec++; \
267 } \
268 }
269
270 #define fs_stats_TimeAssign(t1, t2) \
271 { \
272 t1.tv_sec = t2.tv_sec; \
273 t1.tv_usec = t2.tv_usec; \
274 }
275
276 #define fs_stats_SquareAddTo(t1, t2) \
277 { \
278 if (t2.tv_sec > 0) \
279 { \
280 t1.tv_sec += (int) (t2.tv_sec * t2.tv_sec \
281 + (0.000002 * t2.tv_sec) * t2.tv_usec) ; \
282 t1.tv_usec += (int) ((2 * t2.tv_sec * t2.tv_usec) % 1000000 \
283 + (0.000001 * t2.tv_usec) * t2.tv_usec); \
284 } \
285 else \
286 { \
287 t1.tv_usec += (int) ((0.000001 * t2.tv_usec) * t2.tv_usec); \
288 } \
289 if (t1.tv_usec > 1000000) { \
290 t1.tv_usec -= 1000000; \
291 t1.tv_sec++; \
292 } \
293 }
294
295 /*
296 * This is the detailed performance data collection for the File Server.
297 */
298 struct fs_stats_DetailedStats {
299 struct timeval epoch; /*Time when data collection began */
300 struct fs_stats_opTimingData
301 rpcOpTimes[FS_STATS_NUM_RPC_OPS]; /*Individual RPC operation timings */
302 struct fs_stats_xferData
303 xferOpTimes[FS_STATS_NUM_XFER_OPS]; /*Byte info for certain ops */
304 };
305
306 /*
307 * This is all of the performance data, both overall and detailed.
308 */
309 struct fs_stats_FullPerfStats {
310 struct afs_PerfStats overall;
311 struct fs_stats_DetailedStats det;
312 };
313
314 /*
315 * This is the structure accessible by specifying the
316 * AFS_XSTATSCOLL_FULL_PERF_INFO collection to the xstat package.
317 */
318 extern struct fs_stats_FullPerfStats afs_FullPerfStats;
319
320
321 /*
322 * This is the structure accessible by specifying the
323 * AFS_XSTATSCOLL_PERF_INFO collection to the xstat package.
324 */
325 extern struct afs_PerfStats afs_perfstats;
326
327 /*
328 * FileServer's name and IP address, both network byte order and
329 * host byte order.
330 */
331 extern char FS_HostName[];
332 extern afs_uint32 FS_HostAddr_NBO;
333 extern afs_uint32 FS_HostAddr_HBO;
334
335 /* Logging helper functions */
336 struct fsstats {
337 struct fs_stats_opTimingData *opP;
338 struct fs_stats_xferData *xferP;
339 struct timeval opStartTime;
340 struct timeval xferStartTime;
341 };
342
343 extern void fsstats_StartOp(struct fsstats *stats, int index);
344 extern void fsstats_FinishOp(struct fsstats *stats, int code);
345 extern void fsstats_StartXfer(struct fsstats *stats, int index);
346 extern void fsstats_FinishXfer(struct fsstats *, int, afs_sfsize_t,
347 afs_sfsize_t, int *);
348
349 #endif /* __fs_stats_h */