2 * Copyright (c) 1983, 1989, 1993
3 * The Regents of the University of California. All rights reserved.
5 * This code is derived from software contributed to Berkeley by
6 * Rick Macklem at The University of Guelph.
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
11 * 1. Redistributions of source code must retain the above copyright
12 * notice, this list of conditions and the following disclaimer.
13 * 2. Redistributions in binary form must reproduce the above copyright
14 * notice, this list of conditions and the following disclaimer in the
15 * documentation and/or other materials provided with the distribution.
16 * 4. Neither the name of the University nor the names of its contributors
17 * may be used to endorse or promote products derived from this software
18 * without specific prior written permission.
20 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
21 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
24 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
34 static const char copyright[] =
35 "@(#) Copyright (c) 1983, 1989, 1993\n\
36 The Regents of the University of California. All rights reserved.\n";
41 static char sccsid[] = "@(#)nfsstat.c 8.2 (Berkeley) 3/31/95";
43 static const char rcsid[] =
47 #include <sys/param.h>
48 #include <sys/module.h>
49 #include <sys/mount.h>
51 #include <sys/sysctl.h>
52 #include <nfs/nfsproto.h>
53 #include <nfsclient/nfs.h>
54 #include <nfsserver/nfs.h>
55 #include <nfs/nfssvc.h>
57 #include <fs/nfs/nfsport.h>
72 static int widemode = 0;
74 static int printtitle = 1;
75 static struct ext_nfsstats ext_nfsstats;
76 static int extra_output = 0;
78 static void intpr(int, int);
79 static void printhdr(int, int);
80 static void usage(void);
81 static char *sperc1(int, int);
82 static char *sperc2(int, int);
83 static void exp_intpr(int, int);
84 static void exp_sidewaysintpr(u_int, int, int);
86 #define DELTA(field) (nfsstats.field - lastst.field)
89 main(int argc, char **argv)
98 struct statfs *mntbuf;
99 struct nfscl_dumpmntopts dumpmntopts;
102 memf = nlistf = NULL;
103 while ((ch = getopt(argc, argv, "cesWM:mN:w:z")) != -1)
109 /* Display mount options for NFS mount points. */
110 mntlen = getmntinfo(&mntbuf, MNT_NOWAIT);
111 for (i = 0; i < mntlen; i++) {
112 if (strcmp(mntbuf->f_fstypename, "nfs") == 0) {
113 dumpmntopts.ndmnt_fname =
115 dumpmntopts.ndmnt_buf = buf;
116 dumpmntopts.ndmnt_blen = sizeof(buf);
117 if (nfssvc(NFSSVC_DUMPMNTOPTS,
119 printf("%s on %s\n%s\n",
120 mntbuf->f_mntfromname,
121 mntbuf->f_mntonname, buf);
122 else if (errno == EPERM)
123 errx(1, "Only priviledged users"
124 " can use the -m option");
136 interval = atoi(optarg);
161 #define BACKWARD_COMPATIBILITY
162 #ifdef BACKWARD_COMPATIBILITY
164 interval = atoi(*argv);
172 if (modfind("nfscommon") < 0)
173 errx(1, "NFS client/server not loaded");
176 exp_sidewaysintpr(interval, clientOnly, serverOnly);
178 if (extra_output != 0)
179 exp_intpr(clientOnly, serverOnly);
181 intpr(clientOnly, serverOnly);
187 * Print a description of the nfs stats.
190 intpr(int clientOnly, int serverOnly)
194 nfssvc_flag = NFSSVC_GETSTATS;
197 nfssvc_flag |= NFSSVC_ZEROCLTSTATS;
199 nfssvc_flag |= NFSSVC_ZEROSRVSTATS;
201 if (nfssvc(nfssvc_flag, &ext_nfsstats) < 0)
202 err(1, "Can't get stats");
204 printf("Client Info:\n");
205 printf("Rpc Counts:\n");
206 printf("%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n",
207 "Getattr", "Setattr", "Lookup", "Readlink", "Read",
208 "Write", "Create", "Remove");
209 printf("%9d %9d %9d %9d %9d %9d %9d %9d\n",
210 ext_nfsstats.rpccnt[NFSPROC_GETATTR],
211 ext_nfsstats.rpccnt[NFSPROC_SETATTR],
212 ext_nfsstats.rpccnt[NFSPROC_LOOKUP],
213 ext_nfsstats.rpccnt[NFSPROC_READLINK],
214 ext_nfsstats.rpccnt[NFSPROC_READ],
215 ext_nfsstats.rpccnt[NFSPROC_WRITE],
216 ext_nfsstats.rpccnt[NFSPROC_CREATE],
217 ext_nfsstats.rpccnt[NFSPROC_REMOVE]);
218 printf("%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n",
219 "Rename", "Link", "Symlink", "Mkdir", "Rmdir",
220 "Readdir", "RdirPlus", "Access");
221 printf("%9d %9d %9d %9d %9d %9d %9d %9d\n",
222 ext_nfsstats.rpccnt[NFSPROC_RENAME],
223 ext_nfsstats.rpccnt[NFSPROC_LINK],
224 ext_nfsstats.rpccnt[NFSPROC_SYMLINK],
225 ext_nfsstats.rpccnt[NFSPROC_MKDIR],
226 ext_nfsstats.rpccnt[NFSPROC_RMDIR],
227 ext_nfsstats.rpccnt[NFSPROC_READDIR],
228 ext_nfsstats.rpccnt[NFSPROC_READDIRPLUS],
229 ext_nfsstats.rpccnt[NFSPROC_ACCESS]);
230 printf("%9.9s %9.9s %9.9s %9.9s %9.9s\n",
231 "Mknod", "Fsstat", "Fsinfo", "PathConf", "Commit");
232 printf("%9d %9d %9d %9d %9d\n",
233 ext_nfsstats.rpccnt[NFSPROC_MKNOD],
234 ext_nfsstats.rpccnt[NFSPROC_FSSTAT],
235 ext_nfsstats.rpccnt[NFSPROC_FSINFO],
236 ext_nfsstats.rpccnt[NFSPROC_PATHCONF],
237 ext_nfsstats.rpccnt[NFSPROC_COMMIT]);
238 printf("Rpc Info:\n");
239 printf("%9.9s %9.9s %9.9s %9.9s %9.9s\n",
240 "TimedOut", "Invalid", "X Replies", "Retries",
242 printf("%9d %9d %9d %9d %9d\n",
243 ext_nfsstats.rpctimeouts,
244 ext_nfsstats.rpcinvalid,
245 ext_nfsstats.rpcunexpected,
246 ext_nfsstats.rpcretries,
247 ext_nfsstats.rpcrequests);
248 printf("Cache Info:\n");
249 printf("%9.9s %9.9s %9.9s %9.9s",
250 "Attr Hits", "Misses", "Lkup Hits", "Misses");
251 printf(" %9.9s %9.9s %9.9s %9.9s\n",
252 "BioR Hits", "Misses", "BioW Hits", "Misses");
253 printf("%9d %9d %9d %9d",
254 ext_nfsstats.attrcache_hits,
255 ext_nfsstats.attrcache_misses,
256 ext_nfsstats.lookupcache_hits,
257 ext_nfsstats.lookupcache_misses);
258 printf(" %9d %9d %9d %9d\n",
259 ext_nfsstats.biocache_reads -
260 ext_nfsstats.read_bios,
261 ext_nfsstats.read_bios,
262 ext_nfsstats.biocache_writes -
263 ext_nfsstats.write_bios,
264 ext_nfsstats.write_bios);
265 printf("%9.9s %9.9s %9.9s %9.9s",
266 "BioRLHits", "Misses", "BioD Hits", "Misses");
267 printf(" %9.9s %9.9s %9.9s %9.9s\n", "DirE Hits", "Misses", "Accs Hits", "Misses");
268 printf("%9d %9d %9d %9d",
269 ext_nfsstats.biocache_readlinks -
270 ext_nfsstats.readlink_bios,
271 ext_nfsstats.readlink_bios,
272 ext_nfsstats.biocache_readdirs -
273 ext_nfsstats.readdir_bios,
274 ext_nfsstats.readdir_bios);
275 printf(" %9d %9d %9d %9d\n",
276 ext_nfsstats.direofcache_hits,
277 ext_nfsstats.direofcache_misses,
278 ext_nfsstats.accesscache_hits,
279 ext_nfsstats.accesscache_misses);
282 printf("\nServer Info:\n");
283 printf("%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n",
284 "Getattr", "Setattr", "Lookup", "Readlink", "Read",
285 "Write", "Create", "Remove");
286 printf("%9d %9d %9d %9d %9d %9d %9d %9d\n",
287 ext_nfsstats.srvrpccnt[NFSV4OP_GETATTR],
288 ext_nfsstats.srvrpccnt[NFSV4OP_SETATTR],
289 ext_nfsstats.srvrpccnt[NFSV4OP_LOOKUP],
290 ext_nfsstats.srvrpccnt[NFSV4OP_READLINK],
291 ext_nfsstats.srvrpccnt[NFSV4OP_READ],
292 ext_nfsstats.srvrpccnt[NFSV4OP_WRITE],
293 ext_nfsstats.srvrpccnt[NFSV4OP_CREATE],
294 ext_nfsstats.srvrpccnt[NFSV4OP_REMOVE]);
295 printf("%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n",
296 "Rename", "Link", "Symlink", "Mkdir", "Rmdir",
297 "Readdir", "RdirPlus", "Access");
298 printf("%9d %9d %9d %9d %9d %9d %9d %9d\n",
299 ext_nfsstats.srvrpccnt[NFSV4OP_RENAME],
300 ext_nfsstats.srvrpccnt[NFSV4OP_LINK],
301 ext_nfsstats.srvrpccnt[NFSV4OP_SYMLINK],
302 ext_nfsstats.srvrpccnt[NFSV4OP_MKDIR],
303 ext_nfsstats.srvrpccnt[NFSV4OP_RMDIR],
304 ext_nfsstats.srvrpccnt[NFSV4OP_READDIR],
305 ext_nfsstats.srvrpccnt[NFSV4OP_READDIRPLUS],
306 ext_nfsstats.srvrpccnt[NFSV4OP_ACCESS]);
307 printf("%9.9s %9.9s %9.9s %9.9s %9.9s\n",
308 "Mknod", "Fsstat", "Fsinfo", "PathConf", "Commit");
309 printf("%9d %9d %9d %9d %9d\n",
310 ext_nfsstats.srvrpccnt[NFSV4OP_MKNOD],
311 ext_nfsstats.srvrpccnt[NFSV4OP_FSSTAT],
312 ext_nfsstats.srvrpccnt[NFSV4OP_FSINFO],
313 ext_nfsstats.srvrpccnt[NFSV4OP_PATHCONF],
314 ext_nfsstats.srvrpccnt[NFSV4OP_COMMIT]);
315 printf("Server Ret-Failed\n");
316 printf("%17d\n", ext_nfsstats.srvrpc_errs);
317 printf("Server Faults\n");
318 printf("%13d\n", ext_nfsstats.srv_errs);
319 printf("Server Cache Stats:\n");
320 printf("%9.9s %9.9s %9.9s %9.9s\n",
321 "Inprog", "Idem", "Non-idem", "Misses");
322 printf("%9d %9d %9d %9d\n",
323 ext_nfsstats.srvcache_inproghits,
324 ext_nfsstats.srvcache_idemdonehits,
325 ext_nfsstats.srvcache_nonidemdonehits,
326 ext_nfsstats.srvcache_misses);
327 printf("Server Write Gathering:\n");
328 printf("%9.9s %9.9s %9.9s\n",
329 "WriteOps", "WriteRPC", "Opsaved");
331 * The new client doesn't do write gathering. It was
332 * only useful for NFSv2.
334 printf("%9d %9d %9d\n",
335 ext_nfsstats.srvrpccnt[NFSV4OP_WRITE],
336 ext_nfsstats.srvrpccnt[NFSV4OP_WRITE], 0);
341 printhdr(int clientOnly, int serverOnly)
343 printf("%s%6.6s %6.6s %6.6s %6.6s %6.6s %6.6s %6.6s %6.6s",
344 ((serverOnly && clientOnly) ? " " : " "),
345 "GtAttr", "Lookup", "Rdlink", "Read", "Write", "Rename",
347 if (widemode && clientOnly) {
348 printf(" Attr Lkup BioR BioW Accs BioD");
357 (void)fprintf(stderr,
358 "usage: nfsstat [-cemszW] [-M core] [-N system] [-w wait]\n");
362 static char SPBuf[64][8];
366 sperc1(int hits, int misses)
368 char *p = SPBuf[SPIndex];
372 (int)(char)((quad_t)hits * 100 / (hits + misses)));
376 SPIndex = (SPIndex + 1) & 63;
381 sperc2(int ttl, int misses)
383 char *p = SPBuf[SPIndex];
387 (int)(char)((quad_t)(ttl - misses) * 100 / ttl));
391 SPIndex = (SPIndex + 1) & 63;
396 * Print a description of the nfs stats for the experimental client/server.
399 exp_intpr(int clientOnly, int serverOnly)
403 nfssvc_flag = NFSSVC_GETSTATS;
406 nfssvc_flag |= NFSSVC_ZEROCLTSTATS;
408 nfssvc_flag |= NFSSVC_ZEROSRVSTATS;
410 if (nfssvc(nfssvc_flag, &ext_nfsstats) < 0)
411 err(1, "Can't get stats");
412 if (clientOnly != 0) {
414 printf("Client Info:\n");
415 printf("Rpc Counts:\n");
417 "%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n"
418 , "Getattr", "Setattr", "Lookup", "Readlink",
419 "Read", "Write", "Create", "Remove");
421 printf("%9d %9d %9d %9d %9d %9d %9d %9d\n",
422 ext_nfsstats.rpccnt[NFSPROC_GETATTR],
423 ext_nfsstats.rpccnt[NFSPROC_SETATTR],
424 ext_nfsstats.rpccnt[NFSPROC_LOOKUP],
425 ext_nfsstats.rpccnt[NFSPROC_READLINK],
426 ext_nfsstats.rpccnt[NFSPROC_READ],
427 ext_nfsstats.rpccnt[NFSPROC_WRITE],
428 ext_nfsstats.rpccnt[NFSPROC_CREATE],
429 ext_nfsstats.rpccnt[NFSPROC_REMOVE]);
432 "%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n"
433 , "Rename", "Link", "Symlink", "Mkdir", "Rmdir",
434 "Readdir", "RdirPlus", "Access");
435 printf("%9d %9d %9d %9d %9d %9d %9d %9d\n",
436 ext_nfsstats.rpccnt[NFSPROC_RENAME],
437 ext_nfsstats.rpccnt[NFSPROC_LINK],
438 ext_nfsstats.rpccnt[NFSPROC_SYMLINK],
439 ext_nfsstats.rpccnt[NFSPROC_MKDIR],
440 ext_nfsstats.rpccnt[NFSPROC_RMDIR],
441 ext_nfsstats.rpccnt[NFSPROC_READDIR],
442 ext_nfsstats.rpccnt[NFSPROC_READDIRPLUS],
443 ext_nfsstats.rpccnt[NFSPROC_ACCESS]);
446 "%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n"
447 , "Mknod", "Fsstat", "Fsinfo", "PathConf",
448 "Commit", "SetClId", "SetClIdCf", "Lock");
449 printf("%9d %9d %9d %9d %9d %9d %9d %9d\n",
450 ext_nfsstats.rpccnt[NFSPROC_MKNOD],
451 ext_nfsstats.rpccnt[NFSPROC_FSSTAT],
452 ext_nfsstats.rpccnt[NFSPROC_FSINFO],
453 ext_nfsstats.rpccnt[NFSPROC_PATHCONF],
454 ext_nfsstats.rpccnt[NFSPROC_COMMIT],
455 ext_nfsstats.rpccnt[NFSPROC_SETCLIENTID],
456 ext_nfsstats.rpccnt[NFSPROC_SETCLIENTIDCFRM],
457 ext_nfsstats.rpccnt[NFSPROC_LOCK]);
459 printf("%9.9s %9.9s %9.9s %9.9s\n",
460 "LockT", "LockU", "Open", "OpenCfr");
461 printf("%9d %9d %9d %9d\n",
462 ext_nfsstats.rpccnt[NFSPROC_LOCKT],
463 ext_nfsstats.rpccnt[NFSPROC_LOCKU],
464 ext_nfsstats.rpccnt[NFSPROC_OPEN],
465 ext_nfsstats.rpccnt[NFSPROC_OPENCONFIRM]);
468 "%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n"
469 , "OpenOwner", "Opens", "LockOwner",
470 "Locks", "Delegs", "LocalOwn",
471 "LocalOpen", "LocalLOwn");
472 printf("%9d %9d %9d %9d %9d %9d %9d %9d\n",
473 ext_nfsstats.clopenowners,
474 ext_nfsstats.clopens,
475 ext_nfsstats.cllockowners,
476 ext_nfsstats.cllocks,
477 ext_nfsstats.cldelegates,
478 ext_nfsstats.cllocalopenowners,
479 ext_nfsstats.cllocalopens,
480 ext_nfsstats.cllocallockowners);
482 printf("%9.9s\n", "LocalLock");
483 printf("%9d\n", ext_nfsstats.cllocallocks);
485 printf("Rpc Info:\n");
486 printf("%9.9s %9.9s %9.9s %9.9s %9.9s\n",
487 "TimedOut", "Invalid", "X Replies", "Retries",
490 printf("%9d %9d %9d %9d %9d\n",
491 ext_nfsstats.rpctimeouts,
492 ext_nfsstats.rpcinvalid,
493 ext_nfsstats.rpcunexpected,
494 ext_nfsstats.rpcretries,
495 ext_nfsstats.rpcrequests);
497 printf("Cache Info:\n");
498 printf("%9.9s %9.9s %9.9s %9.9s",
499 "Attr Hits", "Misses", "Lkup Hits", "Misses");
500 printf(" %9.9s %9.9s %9.9s %9.9s\n",
501 "BioR Hits", "Misses", "BioW Hits", "Misses");
503 printf("%9d %9d %9d %9d",
504 ext_nfsstats.attrcache_hits,
505 ext_nfsstats.attrcache_misses,
506 ext_nfsstats.lookupcache_hits,
507 ext_nfsstats.lookupcache_misses);
508 printf(" %9d %9d %9d %9d\n",
509 ext_nfsstats.biocache_reads - ext_nfsstats.read_bios,
510 ext_nfsstats.read_bios,
511 ext_nfsstats.biocache_writes - ext_nfsstats.write_bios,
512 ext_nfsstats.write_bios);
514 printf("%9.9s %9.9s %9.9s %9.9s",
515 "BioRLHits", "Misses", "BioD Hits", "Misses");
516 printf(" %9.9s %9.9s\n", "DirE Hits", "Misses");
518 printf("%9d %9d %9d %9d",
519 ext_nfsstats.biocache_readlinks -
520 ext_nfsstats.readlink_bios,
521 ext_nfsstats.readlink_bios,
522 ext_nfsstats.biocache_readdirs -
523 ext_nfsstats.readdir_bios,
524 ext_nfsstats.readdir_bios);
526 ext_nfsstats.direofcache_hits,
527 ext_nfsstats.direofcache_misses);
529 if (serverOnly != 0) {
531 printf("\nServer Info:\n");
533 "%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n"
534 , "Getattr", "Setattr", "Lookup", "Readlink",
535 "Read", "Write", "Create", "Remove");
537 printf("%9d %9d %9d %9d %9d %9d %9d %9d\n",
538 ext_nfsstats.srvrpccnt[NFSV4OP_GETATTR],
539 ext_nfsstats.srvrpccnt[NFSV4OP_SETATTR],
540 ext_nfsstats.srvrpccnt[NFSV4OP_LOOKUP],
541 ext_nfsstats.srvrpccnt[NFSV4OP_READLINK],
542 ext_nfsstats.srvrpccnt[NFSV4OP_READ],
543 ext_nfsstats.srvrpccnt[NFSV4OP_WRITE],
544 ext_nfsstats.srvrpccnt[NFSV4OP_V3CREATE],
545 ext_nfsstats.srvrpccnt[NFSV4OP_REMOVE]);
548 "%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n"
549 , "Rename", "Link", "Symlink", "Mkdir", "Rmdir",
550 "Readdir", "RdirPlus", "Access");
551 printf("%9d %9d %9d %9d %9d %9d %9d %9d\n",
552 ext_nfsstats.srvrpccnt[NFSV4OP_RENAME],
553 ext_nfsstats.srvrpccnt[NFSV4OP_LINK],
554 ext_nfsstats.srvrpccnt[NFSV4OP_SYMLINK],
555 ext_nfsstats.srvrpccnt[NFSV4OP_MKDIR],
556 ext_nfsstats.srvrpccnt[NFSV4OP_RMDIR],
557 ext_nfsstats.srvrpccnt[NFSV4OP_READDIR],
558 ext_nfsstats.srvrpccnt[NFSV4OP_READDIRPLUS],
559 ext_nfsstats.srvrpccnt[NFSV4OP_ACCESS]);
562 "%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n"
563 , "Mknod", "Fsstat", "Fsinfo", "PathConf",
564 "Commit", "LookupP", "SetClId", "SetClIdCf");
565 printf("%9d %9d %9d %9d %9d %9d %9d %9d\n",
566 ext_nfsstats.srvrpccnt[NFSV4OP_MKNOD],
567 ext_nfsstats.srvrpccnt[NFSV4OP_FSSTAT],
568 ext_nfsstats.srvrpccnt[NFSV4OP_FSINFO],
569 ext_nfsstats.srvrpccnt[NFSV4OP_PATHCONF],
570 ext_nfsstats.srvrpccnt[NFSV4OP_COMMIT],
571 ext_nfsstats.srvrpccnt[NFSV4OP_LOOKUPP],
572 ext_nfsstats.srvrpccnt[NFSV4OP_SETCLIENTID],
573 ext_nfsstats.srvrpccnt[NFSV4OP_SETCLIENTIDCFRM]);
576 "%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n"
577 , "Open", "OpenAttr", "OpenDwnGr", "OpenCfrm",
578 "DelePurge", "DeleRet", "GetFH", "Lock");
579 printf("%9d %9d %9d %9d %9d %9d %9d %9d\n",
580 ext_nfsstats.srvrpccnt[NFSV4OP_OPEN],
581 ext_nfsstats.srvrpccnt[NFSV4OP_OPENATTR],
582 ext_nfsstats.srvrpccnt[NFSV4OP_OPENDOWNGRADE],
583 ext_nfsstats.srvrpccnt[NFSV4OP_OPENCONFIRM],
584 ext_nfsstats.srvrpccnt[NFSV4OP_DELEGPURGE],
585 ext_nfsstats.srvrpccnt[NFSV4OP_DELEGRETURN],
586 ext_nfsstats.srvrpccnt[NFSV4OP_GETFH],
587 ext_nfsstats.srvrpccnt[NFSV4OP_LOCK]);
590 "%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n"
591 , "LockT", "LockU", "Close", "Verify", "NVerify",
592 "PutFH", "PutPubFH", "PutRootFH");
593 printf("%9d %9d %9d %9d %9d %9d %9d %9d\n",
594 ext_nfsstats.srvrpccnt[NFSV4OP_LOCKT],
595 ext_nfsstats.srvrpccnt[NFSV4OP_LOCKU],
596 ext_nfsstats.srvrpccnt[NFSV4OP_CLOSE],
597 ext_nfsstats.srvrpccnt[NFSV4OP_VERIFY],
598 ext_nfsstats.srvrpccnt[NFSV4OP_NVERIFY],
599 ext_nfsstats.srvrpccnt[NFSV4OP_PUTFH],
600 ext_nfsstats.srvrpccnt[NFSV4OP_PUTPUBFH],
601 ext_nfsstats.srvrpccnt[NFSV4OP_PUTROOTFH]);
603 printf("%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n",
604 "Renew", "RestoreFH", "SaveFH", "Secinfo",
605 "RelLckOwn", "V4Create");
606 printf("%9d %9d %9d %9d %9d %9d\n",
607 ext_nfsstats.srvrpccnt[NFSV4OP_RENEW],
608 ext_nfsstats.srvrpccnt[NFSV4OP_RESTOREFH],
609 ext_nfsstats.srvrpccnt[NFSV4OP_SAVEFH],
610 ext_nfsstats.srvrpccnt[NFSV4OP_SECINFO],
611 ext_nfsstats.srvrpccnt[NFSV4OP_RELEASELCKOWN],
612 ext_nfsstats.srvrpccnt[NFSV4OP_CREATE]);
615 printf("%9.9s %9.9s %9.9s\n",
616 "Retfailed", "Faults", "Clients");
618 printf("%9d %9d %9d\n",
619 ext_nfsstats.srv_errs, ext_nfsstats.srvrpc_errs,
620 ext_nfsstats.srvclients);
622 printf("%9.9s %9.9s %9.9s %9.9s %9.9s \n",
623 "OpenOwner", "Opens", "LockOwner",
625 printf("%9d %9d %9d %9d %9d \n",
626 ext_nfsstats.srvopenowners,
627 ext_nfsstats.srvopens,
628 ext_nfsstats.srvlockowners,
629 ext_nfsstats.srvlocks,
630 ext_nfsstats.srvdelegates);
632 printf("Server Cache Stats:\n");
633 printf("%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n",
634 "Inprog", "Idem", "Non-idem", "Misses",
635 "CacheSize", "TCPPeak");
637 printf("%9d %9d %9d %9d %9d %9d\n",
638 ext_nfsstats.srvcache_inproghits,
639 ext_nfsstats.srvcache_idemdonehits,
640 ext_nfsstats.srvcache_nonidemdonehits,
641 ext_nfsstats.srvcache_misses,
642 ext_nfsstats.srvcache_size,
643 ext_nfsstats.srvcache_tcppeak);
648 * Print a running summary of nfs statistics for the experimental client and/or
650 * Repeat display every interval seconds, showing statistics
651 * collected over that interval. Assumes that interval is non-zero.
652 * First line printed at top of screen is always cumulative.
655 exp_sidewaysintpr(u_int interval, int clientOnly, int serverOnly)
657 struct ext_nfsstats nfsstats, lastst, *ext_nfsstatsp;
660 ext_nfsstatsp = &lastst;
661 if (nfssvc(NFSSVC_GETSTATS, ext_nfsstatsp) < 0)
662 err(1, "Can't get stats");
666 ext_nfsstatsp = &nfsstats;
667 if (nfssvc(NFSSVC_GETSTATS, ext_nfsstatsp) < 0)
668 err(1, "Can't get stats");
671 printhdr(clientOnly, serverOnly);
672 if (clientOnly && serverOnly)
678 printf("%s %6d %6d %6d %6d %6d %6d %6d %6d",
679 ((clientOnly && serverOnly) ? "Client:" : ""),
680 DELTA(rpccnt[NFSPROC_GETATTR]),
681 DELTA(rpccnt[NFSPROC_LOOKUP]),
682 DELTA(rpccnt[NFSPROC_READLINK]),
683 DELTA(rpccnt[NFSPROC_READ]),
684 DELTA(rpccnt[NFSPROC_WRITE]),
685 DELTA(rpccnt[NFSPROC_RENAME]),
686 DELTA(rpccnt[NFSPROC_ACCESS]),
687 DELTA(rpccnt[NFSPROC_READDIR]) +
688 DELTA(rpccnt[NFSPROC_READDIRPLUS])
691 printf(" %s %s %s %s %s %s",
692 sperc1(DELTA(attrcache_hits),
693 DELTA(attrcache_misses)),
694 sperc1(DELTA(lookupcache_hits),
695 DELTA(lookupcache_misses)),
696 sperc2(DELTA(biocache_reads),
698 sperc2(DELTA(biocache_writes),
700 sperc1(DELTA(accesscache_hits),
701 DELTA(accesscache_misses)),
702 sperc2(DELTA(biocache_readdirs),
709 printf("%s %6d %6d %6d %6d %6d %6d %6d %6d",
710 ((clientOnly && serverOnly) ? "Server:" : ""),
711 DELTA(srvrpccnt[NFSV4OP_GETATTR]),
712 DELTA(srvrpccnt[NFSV4OP_LOOKUP]),
713 DELTA(srvrpccnt[NFSV4OP_READLINK]),
714 DELTA(srvrpccnt[NFSV4OP_READ]),
715 DELTA(srvrpccnt[NFSV4OP_WRITE]),
716 DELTA(srvrpccnt[NFSV4OP_RENAME]),
717 DELTA(srvrpccnt[NFSV4OP_ACCESS]),
718 DELTA(srvrpccnt[NFSV4OP_READDIR]) +
719 DELTA(srvrpccnt[NFSV4OP_READDIRPLUS]));