nfsstat.c revision 281691
1/* 2 * Copyright (c) 1983, 1989, 1993 3 * The Regents of the University of California. All rights reserved. 4 * 5 * This code is derived from software contributed to Berkeley by 6 * Rick Macklem at The University of Guelph. 7 * 8 * Redistribution and use in source and binary forms, with or without 9 * modification, are permitted provided that the following conditions 10 * are met: 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. 19 * 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 30 * SUCH DAMAGE. 31 */ 32 33#ifndef lint 34static const char copyright[] = 35"@(#) Copyright (c) 1983, 1989, 1993\n\ 36 The Regents of the University of California. All rights reserved.\n"; 37#endif /* not lint */ 38 39#ifndef lint 40#if 0 41static char sccsid[] = "@(#)nfsstat.c 8.2 (Berkeley) 3/31/95"; 42#endif 43static const char rcsid[] = 44 "$FreeBSD: head/usr.bin/nfsstat/nfsstat.c 281691 2015-04-18 16:08:06Z trasz $"; 45#endif /* not lint */ 46 47#include <sys/param.h> 48#include <sys/module.h> 49#include <sys/mount.h> 50#include <sys/time.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> 56 57#include <fs/nfs/nfsport.h> 58 59#include <signal.h> 60#include <fcntl.h> 61#include <ctype.h> 62#include <errno.h> 63#include <kvm.h> 64#include <limits.h> 65#include <nlist.h> 66#include <unistd.h> 67#include <stdio.h> 68#include <stdlib.h> 69#include <string.h> 70#include <paths.h> 71#include <err.h> 72 73struct nlist nl[] = { 74#define N_NFSSTAT 0 75 { .n_name = "nfsstats" }, 76#define N_NFSRVSTAT 1 77 { .n_name = "nfsrvstats" }, 78 { .n_name = NULL }, 79}; 80kvm_t *kd; 81 82static int deadkernel = 0; 83static int widemode = 0; 84static int zflag = 0; 85static int run_v4 = 1; 86static int printtitle = 1; 87static struct ext_nfsstats ext_nfsstats; 88static int extra_output = 0; 89 90void intpr(int, int); 91void printhdr(int, int); 92void sidewaysintpr(u_int, int, int); 93void usage(void); 94char *sperc1(int, int); 95char *sperc2(int, int); 96void exp_intpr(int, int); 97void exp_sidewaysintpr(u_int, int, int); 98 99#define DELTA(field) (nfsstats.field - lastst.field) 100 101int 102main(int argc, char **argv) 103{ 104 u_int interval; 105 int clientOnly = -1; 106 int serverOnly = -1; 107 int ch; 108 char *memf, *nlistf; 109 char errbuf[_POSIX2_LINE_MAX]; 110 int mntlen, i; 111 char buf[1024]; 112 struct statfs *mntbuf; 113 struct nfscl_dumpmntopts dumpmntopts; 114 115 interval = 0; 116 memf = nlistf = NULL; 117 while ((ch = getopt(argc, argv, "cesWM:mN:ow:z")) != -1) 118 switch(ch) { 119 case 'M': 120 memf = optarg; 121 break; 122 case 'm': 123 /* Display mount options for NFS mount points. */ 124 mntlen = getmntinfo(&mntbuf, MNT_NOWAIT); 125 for (i = 0; i < mntlen; i++) { 126 if (strcmp(mntbuf->f_fstypename, "nfs") == 0) { 127 dumpmntopts.ndmnt_fname = 128 mntbuf->f_mntonname; 129 dumpmntopts.ndmnt_buf = buf; 130 dumpmntopts.ndmnt_blen = sizeof(buf); 131 if (nfssvc(NFSSVC_DUMPMNTOPTS, 132 &dumpmntopts) >= 0) 133 printf("%s on %s\n%s\n", 134 mntbuf->f_mntfromname, 135 mntbuf->f_mntonname, buf); 136 else if (errno == EPERM) 137 errx(1, "Only priviledged users" 138 " can use the -m option"); 139 } 140 mntbuf++; 141 } 142 exit(0); 143 case 'N': 144 nlistf = optarg; 145 break; 146 case 'W': 147 widemode = 1; 148 break; 149 case 'w': 150 interval = atoi(optarg); 151 break; 152 case 'c': 153 clientOnly = 1; 154 if (serverOnly < 0) 155 serverOnly = 0; 156 break; 157 case 's': 158 serverOnly = 1; 159 if (clientOnly < 0) 160 clientOnly = 0; 161 break; 162 case 'z': 163 zflag = 1; 164 break; 165 case 'o': 166 if (extra_output != 0) 167 err(1, "-o incompatible with -e"); 168 run_v4 = 0; 169 break; 170 case 'e': 171 if (run_v4 == 0) 172 err(1, "-e incompatible with -o"); 173 extra_output = 1; 174 break; 175 case '?': 176 default: 177 usage(); 178 } 179 argc -= optind; 180 argv += optind; 181 182#define BACKWARD_COMPATIBILITY 183#ifdef BACKWARD_COMPATIBILITY 184 if (*argv) { 185 interval = atoi(*argv); 186 if (*++argv) { 187 nlistf = *argv; 188 if (*++argv) 189 memf = *argv; 190 } 191 } 192#endif 193 if (run_v4 != 0 && modfind("nfscommon") < 0) 194 errx(1, "new client/server not loaded"); 195 196 if (run_v4 == 0 && (nlistf != NULL || memf != NULL)) { 197 deadkernel = 1; 198 199 if ((kd = kvm_openfiles(nlistf, memf, NULL, O_RDONLY, 200 errbuf)) == 0) { 201 errx(1, "kvm_openfiles: %s", errbuf); 202 } 203 if (kvm_nlist(kd, nl) != 0) { 204 errx(1, "kvm_nlist: can't get names"); 205 } 206 } 207 208 if (interval) { 209 if (run_v4 > 0) 210 exp_sidewaysintpr(interval, clientOnly, serverOnly); 211 else 212 sidewaysintpr(interval, clientOnly, serverOnly); 213 } else { 214 if (extra_output != 0) 215 exp_intpr(clientOnly, serverOnly); 216 else 217 intpr(clientOnly, serverOnly); 218 } 219 exit(0); 220} 221 222/* 223 * Read the nfs stats using sysctl(3) for live kernels, or kvm_read 224 * for dead ones. 225 */ 226static void 227readstats(struct nfsstats **stp, struct nfsrvstats **srvstp, int zero) 228{ 229 union { 230 struct nfsstats client; 231 struct nfsrvstats server; 232 } zerostat; 233 size_t buflen; 234 235 if (deadkernel) { 236 if (*stp != NULL && kvm_read(kd, (u_long)nl[N_NFSSTAT].n_value, 237 *stp, sizeof(struct nfsstats)) < 0) { 238 *stp = NULL; 239 } 240 if (*srvstp != NULL && kvm_read(kd, 241 (u_long)nl[N_NFSRVSTAT].n_value, *srvstp, 242 sizeof(struct nfsrvstats)) < 0) { 243 *srvstp = NULL; 244 } 245 } else { 246 if (zero) 247 bzero(&zerostat, sizeof(zerostat)); 248 buflen = sizeof(struct nfsrvstats); 249 if (*srvstp != NULL && sysctlbyname("vfs.nfsrv.nfsrvstats", 250 *srvstp, &buflen, zero ? &zerostat : NULL, 251 zero ? buflen : 0) < 0) { 252 if (errno != ENOENT) 253 err(1, "sysctl: vfs.nfsrv.nfsrvstats"); 254 *srvstp = NULL; 255 } 256 } 257} 258 259/* 260 * Print a description of the nfs stats. 261 */ 262void 263intpr(int clientOnly, int serverOnly) 264{ 265 struct nfsstats nfsstats, *nfsstatsp; 266 struct nfsrvstats nfsrvstats, *nfsrvstatsp; 267 int nfssvc_flag; 268 269 if (run_v4 == 0) { 270 /* 271 * Only read the stats we are going to display to avoid zeroing 272 * stats the user didn't request. 273 */ 274 if (clientOnly) 275 nfsstatsp = &nfsstats; 276 else 277 nfsstatsp = NULL; 278 if (serverOnly) 279 nfsrvstatsp = &nfsrvstats; 280 else 281 nfsrvstatsp = NULL; 282 283 readstats(&nfsstatsp, &nfsrvstatsp, zflag); 284 285 if (clientOnly && !nfsstatsp) { 286 printf("Client not present!\n"); 287 clientOnly = 0; 288 } 289 } else { 290 nfssvc_flag = NFSSVC_GETSTATS; 291 if (zflag != 0) { 292 if (clientOnly != 0) 293 nfssvc_flag |= NFSSVC_ZEROCLTSTATS; 294 if (serverOnly != 0) 295 nfssvc_flag |= NFSSVC_ZEROSRVSTATS; 296 } 297 if (nfssvc(nfssvc_flag, &ext_nfsstats) < 0) 298 err(1, "Can't get stats"); 299 } 300 if (clientOnly) { 301 printf("Client Info:\n"); 302 printf("Rpc Counts:\n"); 303 printf("%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n", 304 "Getattr", "Setattr", "Lookup", "Readlink", "Read", 305 "Write", "Create", "Remove"); 306 if (run_v4 == 0) 307 printf("%9d %9d %9d %9d %9d %9d %9d %9d\n", 308 nfsstats.rpccnt[NFSPROC_GETATTR], 309 nfsstats.rpccnt[NFSPROC_SETATTR], 310 nfsstats.rpccnt[NFSPROC_LOOKUP], 311 nfsstats.rpccnt[NFSPROC_READLINK], 312 nfsstats.rpccnt[NFSPROC_READ], 313 nfsstats.rpccnt[NFSPROC_WRITE], 314 nfsstats.rpccnt[NFSPROC_CREATE], 315 nfsstats.rpccnt[NFSPROC_REMOVE]); 316 else 317 printf("%9d %9d %9d %9d %9d %9d %9d %9d\n", 318 ext_nfsstats.rpccnt[NFSPROC_GETATTR], 319 ext_nfsstats.rpccnt[NFSPROC_SETATTR], 320 ext_nfsstats.rpccnt[NFSPROC_LOOKUP], 321 ext_nfsstats.rpccnt[NFSPROC_READLINK], 322 ext_nfsstats.rpccnt[NFSPROC_READ], 323 ext_nfsstats.rpccnt[NFSPROC_WRITE], 324 ext_nfsstats.rpccnt[NFSPROC_CREATE], 325 ext_nfsstats.rpccnt[NFSPROC_REMOVE]); 326 printf("%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n", 327 "Rename", "Link", "Symlink", "Mkdir", "Rmdir", 328 "Readdir", "RdirPlus", "Access"); 329 if (run_v4 == 0) 330 printf("%9d %9d %9d %9d %9d %9d %9d %9d\n", 331 nfsstats.rpccnt[NFSPROC_RENAME], 332 nfsstats.rpccnt[NFSPROC_LINK], 333 nfsstats.rpccnt[NFSPROC_SYMLINK], 334 nfsstats.rpccnt[NFSPROC_MKDIR], 335 nfsstats.rpccnt[NFSPROC_RMDIR], 336 nfsstats.rpccnt[NFSPROC_READDIR], 337 nfsstats.rpccnt[NFSPROC_READDIRPLUS], 338 nfsstats.rpccnt[NFSPROC_ACCESS]); 339 else 340 printf("%9d %9d %9d %9d %9d %9d %9d %9d\n", 341 ext_nfsstats.rpccnt[NFSPROC_RENAME], 342 ext_nfsstats.rpccnt[NFSPROC_LINK], 343 ext_nfsstats.rpccnt[NFSPROC_SYMLINK], 344 ext_nfsstats.rpccnt[NFSPROC_MKDIR], 345 ext_nfsstats.rpccnt[NFSPROC_RMDIR], 346 ext_nfsstats.rpccnt[NFSPROC_READDIR], 347 ext_nfsstats.rpccnt[NFSPROC_READDIRPLUS], 348 ext_nfsstats.rpccnt[NFSPROC_ACCESS]); 349 printf("%9.9s %9.9s %9.9s %9.9s %9.9s\n", 350 "Mknod", "Fsstat", "Fsinfo", "PathConf", "Commit"); 351 if (run_v4 == 0) 352 printf("%9d %9d %9d %9d %9d\n", 353 nfsstats.rpccnt[NFSPROC_MKNOD], 354 nfsstats.rpccnt[NFSPROC_FSSTAT], 355 nfsstats.rpccnt[NFSPROC_FSINFO], 356 nfsstats.rpccnt[NFSPROC_PATHCONF], 357 nfsstats.rpccnt[NFSPROC_COMMIT]); 358 else 359 printf("%9d %9d %9d %9d %9d\n", 360 ext_nfsstats.rpccnt[NFSPROC_MKNOD], 361 ext_nfsstats.rpccnt[NFSPROC_FSSTAT], 362 ext_nfsstats.rpccnt[NFSPROC_FSINFO], 363 ext_nfsstats.rpccnt[NFSPROC_PATHCONF], 364 ext_nfsstats.rpccnt[NFSPROC_COMMIT]); 365 printf("Rpc Info:\n"); 366 printf("%9.9s %9.9s %9.9s %9.9s %9.9s\n", 367 "TimedOut", "Invalid", "X Replies", "Retries", 368 "Requests"); 369 if (run_v4 == 0) 370 printf("%9d %9d %9d %9d %9d\n", 371 nfsstats.rpctimeouts, 372 nfsstats.rpcinvalid, 373 nfsstats.rpcunexpected, 374 nfsstats.rpcretries, 375 nfsstats.rpcrequests); 376 else 377 printf("%9d %9d %9d %9d %9d\n", 378 ext_nfsstats.rpctimeouts, 379 ext_nfsstats.rpcinvalid, 380 ext_nfsstats.rpcunexpected, 381 ext_nfsstats.rpcretries, 382 ext_nfsstats.rpcrequests); 383 printf("Cache Info:\n"); 384 printf("%9.9s %9.9s %9.9s %9.9s", 385 "Attr Hits", "Misses", "Lkup Hits", "Misses"); 386 printf(" %9.9s %9.9s %9.9s %9.9s\n", 387 "BioR Hits", "Misses", "BioW Hits", "Misses"); 388 if (run_v4 == 0) { 389 printf("%9d %9d %9d %9d", 390 nfsstats.attrcache_hits, 391 nfsstats.attrcache_misses, 392 nfsstats.lookupcache_hits, 393 nfsstats.lookupcache_misses); 394 printf(" %9d %9d %9d %9d\n", 395 nfsstats.biocache_reads-nfsstats.read_bios, 396 nfsstats.read_bios, 397 nfsstats.biocache_writes-nfsstats.write_bios, 398 nfsstats.write_bios); 399 } else { 400 printf("%9d %9d %9d %9d", 401 ext_nfsstats.attrcache_hits, 402 ext_nfsstats.attrcache_misses, 403 ext_nfsstats.lookupcache_hits, 404 ext_nfsstats.lookupcache_misses); 405 printf(" %9d %9d %9d %9d\n", 406 ext_nfsstats.biocache_reads - 407 ext_nfsstats.read_bios, 408 ext_nfsstats.read_bios, 409 ext_nfsstats.biocache_writes - 410 ext_nfsstats.write_bios, 411 ext_nfsstats.write_bios); 412 } 413 printf("%9.9s %9.9s %9.9s %9.9s", 414 "BioRLHits", "Misses", "BioD Hits", "Misses"); 415 printf(" %9.9s %9.9s %9.9s %9.9s\n", "DirE Hits", "Misses", "Accs Hits", "Misses"); 416 if (run_v4 == 0) { 417 printf("%9d %9d %9d %9d", 418 nfsstats.biocache_readlinks - 419 nfsstats.readlink_bios, 420 nfsstats.readlink_bios, 421 nfsstats.biocache_readdirs - 422 nfsstats.readdir_bios, 423 nfsstats.readdir_bios); 424 printf(" %9d %9d %9d %9d\n", 425 nfsstats.direofcache_hits, 426 nfsstats.direofcache_misses, 427 nfsstats.accesscache_hits, 428 nfsstats.accesscache_misses); 429 } else { 430 printf("%9d %9d %9d %9d", 431 ext_nfsstats.biocache_readlinks - 432 ext_nfsstats.readlink_bios, 433 ext_nfsstats.readlink_bios, 434 ext_nfsstats.biocache_readdirs - 435 ext_nfsstats.readdir_bios, 436 ext_nfsstats.readdir_bios); 437 printf(" %9d %9d %9d %9d\n", 438 ext_nfsstats.direofcache_hits, 439 ext_nfsstats.direofcache_misses, 440 ext_nfsstats.accesscache_hits, 441 ext_nfsstats.accesscache_misses); 442 } 443 } 444 if (run_v4 == 0 && serverOnly && !nfsrvstatsp) { 445 printf("Server not present!\n"); 446 serverOnly = 0; 447 } 448 if (serverOnly) { 449 printf("\nServer Info:\n"); 450 printf("%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n", 451 "Getattr", "Setattr", "Lookup", "Readlink", "Read", 452 "Write", "Create", "Remove"); 453 if (run_v4 == 0) 454 printf("%9d %9d %9d %9d %9d %9d %9d %9d\n", 455 nfsrvstats.srvrpccnt[NFSPROC_GETATTR], 456 nfsrvstats.srvrpccnt[NFSPROC_SETATTR], 457 nfsrvstats.srvrpccnt[NFSPROC_LOOKUP], 458 nfsrvstats.srvrpccnt[NFSPROC_READLINK], 459 nfsrvstats.srvrpccnt[NFSPROC_READ], 460 nfsrvstats.srvrpccnt[NFSPROC_WRITE], 461 nfsrvstats.srvrpccnt[NFSPROC_CREATE], 462 nfsrvstats.srvrpccnt[NFSPROC_REMOVE]); 463 else 464 printf("%9d %9d %9d %9d %9d %9d %9d %9d\n", 465 ext_nfsstats.srvrpccnt[NFSV4OP_GETATTR], 466 ext_nfsstats.srvrpccnt[NFSV4OP_SETATTR], 467 ext_nfsstats.srvrpccnt[NFSV4OP_LOOKUP], 468 ext_nfsstats.srvrpccnt[NFSV4OP_READLINK], 469 ext_nfsstats.srvrpccnt[NFSV4OP_READ], 470 ext_nfsstats.srvrpccnt[NFSV4OP_WRITE], 471 ext_nfsstats.srvrpccnt[NFSV4OP_CREATE], 472 ext_nfsstats.srvrpccnt[NFSV4OP_REMOVE]); 473 printf("%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n", 474 "Rename", "Link", "Symlink", "Mkdir", "Rmdir", 475 "Readdir", "RdirPlus", "Access"); 476 if (run_v4 == 0) 477 printf("%9d %9d %9d %9d %9d %9d %9d %9d\n", 478 nfsrvstats.srvrpccnt[NFSPROC_RENAME], 479 nfsrvstats.srvrpccnt[NFSPROC_LINK], 480 nfsrvstats.srvrpccnt[NFSPROC_SYMLINK], 481 nfsrvstats.srvrpccnt[NFSPROC_MKDIR], 482 nfsrvstats.srvrpccnt[NFSPROC_RMDIR], 483 nfsrvstats.srvrpccnt[NFSPROC_READDIR], 484 nfsrvstats.srvrpccnt[NFSPROC_READDIRPLUS], 485 nfsrvstats.srvrpccnt[NFSPROC_ACCESS]); 486 else 487 printf("%9d %9d %9d %9d %9d %9d %9d %9d\n", 488 ext_nfsstats.srvrpccnt[NFSV4OP_RENAME], 489 ext_nfsstats.srvrpccnt[NFSV4OP_LINK], 490 ext_nfsstats.srvrpccnt[NFSV4OP_SYMLINK], 491 ext_nfsstats.srvrpccnt[NFSV4OP_MKDIR], 492 ext_nfsstats.srvrpccnt[NFSV4OP_RMDIR], 493 ext_nfsstats.srvrpccnt[NFSV4OP_READDIR], 494 ext_nfsstats.srvrpccnt[NFSV4OP_READDIRPLUS], 495 ext_nfsstats.srvrpccnt[NFSV4OP_ACCESS]); 496 printf("%9.9s %9.9s %9.9s %9.9s %9.9s\n", 497 "Mknod", "Fsstat", "Fsinfo", "PathConf", "Commit"); 498 if (run_v4 == 0) 499 printf("%9d %9d %9d %9d %9d\n", 500 nfsrvstats.srvrpccnt[NFSPROC_MKNOD], 501 nfsrvstats.srvrpccnt[NFSPROC_FSSTAT], 502 nfsrvstats.srvrpccnt[NFSPROC_FSINFO], 503 nfsrvstats.srvrpccnt[NFSPROC_PATHCONF], 504 nfsrvstats.srvrpccnt[NFSPROC_COMMIT]); 505 else 506 printf("%9d %9d %9d %9d %9d\n", 507 ext_nfsstats.srvrpccnt[NFSV4OP_MKNOD], 508 ext_nfsstats.srvrpccnt[NFSV4OP_FSSTAT], 509 ext_nfsstats.srvrpccnt[NFSV4OP_FSINFO], 510 ext_nfsstats.srvrpccnt[NFSV4OP_PATHCONF], 511 ext_nfsstats.srvrpccnt[NFSV4OP_COMMIT]); 512 printf("Server Ret-Failed\n"); 513 if (run_v4 == 0) 514 printf("%17d\n", nfsrvstats.srvrpc_errs); 515 else 516 printf("%17d\n", ext_nfsstats.srvrpc_errs); 517 printf("Server Faults\n"); 518 if (run_v4 == 0) 519 printf("%13d\n", nfsrvstats.srv_errs); 520 else 521 printf("%13d\n", ext_nfsstats.srv_errs); 522 printf("Server Cache Stats:\n"); 523 printf("%9.9s %9.9s %9.9s %9.9s\n", 524 "Inprog", "Idem", "Non-idem", "Misses"); 525 if (run_v4 == 0) 526 printf("%9d %9d %9d %9d\n", 527 nfsrvstats.srvcache_inproghits, 528 nfsrvstats.srvcache_idemdonehits, 529 nfsrvstats.srvcache_nonidemdonehits, 530 nfsrvstats.srvcache_misses); 531 else 532 printf("%9d %9d %9d %9d\n", 533 ext_nfsstats.srvcache_inproghits, 534 ext_nfsstats.srvcache_idemdonehits, 535 ext_nfsstats.srvcache_nonidemdonehits, 536 ext_nfsstats.srvcache_misses); 537 printf("Server Write Gathering:\n"); 538 printf("%9.9s %9.9s %9.9s\n", 539 "WriteOps", "WriteRPC", "Opsaved"); 540 if (run_v4 == 0) 541 printf("%9d %9d %9d\n", 542 nfsrvstats.srvvop_writes, 543 nfsrvstats.srvrpccnt[NFSPROC_WRITE], 544 nfsrvstats.srvrpccnt[NFSPROC_WRITE] - 545 nfsrvstats.srvvop_writes); 546 else 547 /* 548 * The new client doesn't do write gathering. It was 549 * only useful for NFSv2. 550 */ 551 printf("%9d %9d %9d\n", 552 ext_nfsstats.srvrpccnt[NFSV4OP_WRITE], 553 ext_nfsstats.srvrpccnt[NFSV4OP_WRITE], 0); 554 } 555} 556 557u_char signalled; /* set if alarm goes off "early" */ 558 559/* 560 * Print a running summary of nfs statistics. 561 * Repeat display every interval seconds, showing statistics 562 * collected over that interval. Assumes that interval is non-zero. 563 * First line printed at top of screen is always cumulative. 564 */ 565void 566sidewaysintpr(u_int interval, int clientOnly, int serverOnly) 567{ 568 struct nfsstats nfsstats, lastst, *nfsstatsp; 569 struct nfsrvstats nfsrvstats, lastsrvst, *nfsrvstatsp; 570 int hdrcnt = 1; 571 572 nfsstatsp = &lastst; 573 nfsrvstatsp = &lastsrvst; 574 readstats(&nfsstatsp, &nfsrvstatsp, 0); 575 if (clientOnly && !nfsstatsp) { 576 printf("Client not present!\n"); 577 clientOnly = 0; 578 } 579 if (serverOnly && !nfsrvstatsp) { 580 printf("Server not present!\n"); 581 serverOnly = 0; 582 } 583 sleep(interval); 584 585 for (;;) { 586 nfsstatsp = &nfsstats; 587 nfsrvstatsp = &nfsrvstats; 588 readstats(&nfsstatsp, &nfsrvstatsp, 0); 589 590 if (--hdrcnt == 0) { 591 printhdr(clientOnly, serverOnly); 592 if (clientOnly && serverOnly) 593 hdrcnt = 10; 594 else 595 hdrcnt = 20; 596 } 597 if (clientOnly) { 598 printf("%s %6d %6d %6d %6d %6d %6d %6d %6d", 599 ((clientOnly && serverOnly) ? "Client:" : ""), 600 DELTA(rpccnt[NFSPROC_GETATTR]), 601 DELTA(rpccnt[NFSPROC_LOOKUP]), 602 DELTA(rpccnt[NFSPROC_READLINK]), 603 DELTA(rpccnt[NFSPROC_READ]), 604 DELTA(rpccnt[NFSPROC_WRITE]), 605 DELTA(rpccnt[NFSPROC_RENAME]), 606 DELTA(rpccnt[NFSPROC_ACCESS]), 607 DELTA(rpccnt[NFSPROC_READDIR]) + 608 DELTA(rpccnt[NFSPROC_READDIRPLUS]) 609 ); 610 if (widemode) { 611 printf(" %s %s %s %s %s %s", 612 sperc1(DELTA(attrcache_hits), 613 DELTA(attrcache_misses)), 614 sperc1(DELTA(lookupcache_hits), 615 DELTA(lookupcache_misses)), 616 sperc2(DELTA(biocache_reads), 617 DELTA(read_bios)), 618 sperc2(DELTA(biocache_writes), 619 DELTA(write_bios)), 620 sperc1(DELTA(accesscache_hits), 621 DELTA(accesscache_misses)), 622 sperc2(DELTA(biocache_readdirs), 623 DELTA(readdir_bios)) 624 ); 625 } 626 printf("\n"); 627 lastst = nfsstats; 628 } 629 if (serverOnly) { 630 printf("%s %6d %6d %6d %6d %6d %6d %6d %6d", 631 ((clientOnly && serverOnly) ? "Server:" : ""), 632 nfsrvstats.srvrpccnt[NFSPROC_GETATTR]-lastsrvst.srvrpccnt[NFSPROC_GETATTR], 633 nfsrvstats.srvrpccnt[NFSPROC_LOOKUP]-lastsrvst.srvrpccnt[NFSPROC_LOOKUP], 634 nfsrvstats.srvrpccnt[NFSPROC_READLINK]-lastsrvst.srvrpccnt[NFSPROC_READLINK], 635 nfsrvstats.srvrpccnt[NFSPROC_READ]-lastsrvst.srvrpccnt[NFSPROC_READ], 636 nfsrvstats.srvrpccnt[NFSPROC_WRITE]-lastsrvst.srvrpccnt[NFSPROC_WRITE], 637 nfsrvstats.srvrpccnt[NFSPROC_RENAME]-lastsrvst.srvrpccnt[NFSPROC_RENAME], 638 nfsrvstats.srvrpccnt[NFSPROC_ACCESS]-lastsrvst.srvrpccnt[NFSPROC_ACCESS], 639 (nfsrvstats.srvrpccnt[NFSPROC_READDIR]-lastsrvst.srvrpccnt[NFSPROC_READDIR]) 640 +(nfsrvstats.srvrpccnt[NFSPROC_READDIRPLUS]-lastsrvst.srvrpccnt[NFSPROC_READDIRPLUS])); 641 printf("\n"); 642 lastsrvst = nfsrvstats; 643 } 644 fflush(stdout); 645 sleep(interval); 646 } 647 /*NOTREACHED*/ 648} 649 650void 651printhdr(int clientOnly, int serverOnly) 652{ 653 printf("%s%6.6s %6.6s %6.6s %6.6s %6.6s %6.6s %6.6s %6.6s", 654 ((serverOnly && clientOnly) ? " " : " "), 655 "GtAttr", "Lookup", "Rdlink", "Read", "Write", "Rename", 656 "Access", "Rddir"); 657 if (widemode && clientOnly) { 658 printf(" Attr Lkup BioR BioW Accs BioD"); 659 } 660 printf("\n"); 661 fflush(stdout); 662} 663 664void 665usage(void) 666{ 667 (void)fprintf(stderr, 668 "usage: nfsstat [-cemoszW] [-M core] [-N system] [-w wait]\n"); 669 exit(1); 670} 671 672static char SPBuf[64][8]; 673static int SPIndex; 674 675char * 676sperc1(int hits, int misses) 677{ 678 char *p = SPBuf[SPIndex]; 679 680 if (hits + misses) { 681 sprintf(p, "%3d%%", 682 (int)(char)((quad_t)hits * 100 / (hits + misses))); 683 } else { 684 sprintf(p, " -"); 685 } 686 SPIndex = (SPIndex + 1) & 63; 687 return(p); 688} 689 690char * 691sperc2(int ttl, int misses) 692{ 693 char *p = SPBuf[SPIndex]; 694 695 if (ttl) { 696 sprintf(p, "%3d%%", 697 (int)(char)((quad_t)(ttl - misses) * 100 / ttl)); 698 } else { 699 sprintf(p, " -"); 700 } 701 SPIndex = (SPIndex + 1) & 63; 702 return(p); 703} 704 705/* 706 * Print a description of the nfs stats for the experimental client/server. 707 */ 708void 709exp_intpr(int clientOnly, int serverOnly) 710{ 711 int nfssvc_flag; 712 713 nfssvc_flag = NFSSVC_GETSTATS; 714 if (zflag != 0) { 715 if (clientOnly != 0) 716 nfssvc_flag |= NFSSVC_ZEROCLTSTATS; 717 if (serverOnly != 0) 718 nfssvc_flag |= NFSSVC_ZEROSRVSTATS; 719 } 720 if (nfssvc(nfssvc_flag, &ext_nfsstats) < 0) 721 err(1, "Can't get stats"); 722 if (clientOnly != 0) { 723 if (printtitle) { 724 printf("Client Info:\n"); 725 printf("Rpc Counts:\n"); 726 printf( 727 "%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n" 728 , "Getattr", "Setattr", "Lookup", "Readlink", 729 "Read", "Write", "Create", "Remove"); 730 } 731 printf("%9d %9d %9d %9d %9d %9d %9d %9d\n", 732 ext_nfsstats.rpccnt[NFSPROC_GETATTR], 733 ext_nfsstats.rpccnt[NFSPROC_SETATTR], 734 ext_nfsstats.rpccnt[NFSPROC_LOOKUP], 735 ext_nfsstats.rpccnt[NFSPROC_READLINK], 736 ext_nfsstats.rpccnt[NFSPROC_READ], 737 ext_nfsstats.rpccnt[NFSPROC_WRITE], 738 ext_nfsstats.rpccnt[NFSPROC_CREATE], 739 ext_nfsstats.rpccnt[NFSPROC_REMOVE]); 740 if (printtitle) 741 printf( 742 "%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n" 743 , "Rename", "Link", "Symlink", "Mkdir", "Rmdir", 744 "Readdir", "RdirPlus", "Access"); 745 printf("%9d %9d %9d %9d %9d %9d %9d %9d\n", 746 ext_nfsstats.rpccnt[NFSPROC_RENAME], 747 ext_nfsstats.rpccnt[NFSPROC_LINK], 748 ext_nfsstats.rpccnt[NFSPROC_SYMLINK], 749 ext_nfsstats.rpccnt[NFSPROC_MKDIR], 750 ext_nfsstats.rpccnt[NFSPROC_RMDIR], 751 ext_nfsstats.rpccnt[NFSPROC_READDIR], 752 ext_nfsstats.rpccnt[NFSPROC_READDIRPLUS], 753 ext_nfsstats.rpccnt[NFSPROC_ACCESS]); 754 if (printtitle) 755 printf( 756 "%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n" 757 , "Mknod", "Fsstat", "Fsinfo", "PathConf", 758 "Commit", "SetClId", "SetClIdCf", "Lock"); 759 printf("%9d %9d %9d %9d %9d %9d %9d %9d\n", 760 ext_nfsstats.rpccnt[NFSPROC_MKNOD], 761 ext_nfsstats.rpccnt[NFSPROC_FSSTAT], 762 ext_nfsstats.rpccnt[NFSPROC_FSINFO], 763 ext_nfsstats.rpccnt[NFSPROC_PATHCONF], 764 ext_nfsstats.rpccnt[NFSPROC_COMMIT], 765 ext_nfsstats.rpccnt[NFSPROC_SETCLIENTID], 766 ext_nfsstats.rpccnt[NFSPROC_SETCLIENTIDCFRM], 767 ext_nfsstats.rpccnt[NFSPROC_LOCK]); 768 if (printtitle) 769 printf("%9.9s %9.9s %9.9s %9.9s\n", 770 "LockT", "LockU", "Open", "OpenCfr"); 771 printf("%9d %9d %9d %9d\n", 772 ext_nfsstats.rpccnt[NFSPROC_LOCKT], 773 ext_nfsstats.rpccnt[NFSPROC_LOCKU], 774 ext_nfsstats.rpccnt[NFSPROC_OPEN], 775 ext_nfsstats.rpccnt[NFSPROC_OPENCONFIRM]); 776 if (printtitle) 777 printf( 778 "%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n" 779 , "OpenOwner", "Opens", "LockOwner", 780 "Locks", "Delegs", "LocalOwn", 781 "LocalOpen", "LocalLOwn"); 782 printf("%9d %9d %9d %9d %9d %9d %9d %9d\n", 783 ext_nfsstats.clopenowners, 784 ext_nfsstats.clopens, 785 ext_nfsstats.cllockowners, 786 ext_nfsstats.cllocks, 787 ext_nfsstats.cldelegates, 788 ext_nfsstats.cllocalopenowners, 789 ext_nfsstats.cllocalopens, 790 ext_nfsstats.cllocallockowners); 791 if (printtitle) 792 printf("%9.9s\n", "LocalLock"); 793 printf("%9d\n", ext_nfsstats.cllocallocks); 794 if (printtitle) { 795 printf("Rpc Info:\n"); 796 printf("%9.9s %9.9s %9.9s %9.9s %9.9s\n", 797 "TimedOut", "Invalid", "X Replies", "Retries", 798 "Requests"); 799 } 800 printf("%9d %9d %9d %9d %9d\n", 801 ext_nfsstats.rpctimeouts, 802 ext_nfsstats.rpcinvalid, 803 ext_nfsstats.rpcunexpected, 804 ext_nfsstats.rpcretries, 805 ext_nfsstats.rpcrequests); 806 if (printtitle) { 807 printf("Cache Info:\n"); 808 printf("%9.9s %9.9s %9.9s %9.9s", 809 "Attr Hits", "Misses", "Lkup Hits", "Misses"); 810 printf(" %9.9s %9.9s %9.9s %9.9s\n", 811 "BioR Hits", "Misses", "BioW Hits", "Misses"); 812 } 813 printf("%9d %9d %9d %9d", 814 ext_nfsstats.attrcache_hits, 815 ext_nfsstats.attrcache_misses, 816 ext_nfsstats.lookupcache_hits, 817 ext_nfsstats.lookupcache_misses); 818 printf(" %9d %9d %9d %9d\n", 819 ext_nfsstats.biocache_reads - ext_nfsstats.read_bios, 820 ext_nfsstats.read_bios, 821 ext_nfsstats.biocache_writes - ext_nfsstats.write_bios, 822 ext_nfsstats.write_bios); 823 if (printtitle) { 824 printf("%9.9s %9.9s %9.9s %9.9s", 825 "BioRLHits", "Misses", "BioD Hits", "Misses"); 826 printf(" %9.9s %9.9s\n", "DirE Hits", "Misses"); 827 } 828 printf("%9d %9d %9d %9d", 829 ext_nfsstats.biocache_readlinks - 830 ext_nfsstats.readlink_bios, 831 ext_nfsstats.readlink_bios, 832 ext_nfsstats.biocache_readdirs - 833 ext_nfsstats.readdir_bios, 834 ext_nfsstats.readdir_bios); 835 printf(" %9d %9d\n", 836 ext_nfsstats.direofcache_hits, 837 ext_nfsstats.direofcache_misses); 838 } 839 if (serverOnly != 0) { 840 if (printtitle) { 841 printf("\nServer Info:\n"); 842 printf( 843 "%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n" 844 , "Getattr", "Setattr", "Lookup", "Readlink", 845 "Read", "Write", "Create", "Remove"); 846 } 847 printf("%9d %9d %9d %9d %9d %9d %9d %9d\n", 848 ext_nfsstats.srvrpccnt[NFSV4OP_GETATTR], 849 ext_nfsstats.srvrpccnt[NFSV4OP_SETATTR], 850 ext_nfsstats.srvrpccnt[NFSV4OP_LOOKUP], 851 ext_nfsstats.srvrpccnt[NFSV4OP_READLINK], 852 ext_nfsstats.srvrpccnt[NFSV4OP_READ], 853 ext_nfsstats.srvrpccnt[NFSV4OP_WRITE], 854 ext_nfsstats.srvrpccnt[NFSV4OP_V3CREATE], 855 ext_nfsstats.srvrpccnt[NFSV4OP_REMOVE]); 856 if (printtitle) 857 printf( 858 "%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n" 859 , "Rename", "Link", "Symlink", "Mkdir", "Rmdir", 860 "Readdir", "RdirPlus", "Access"); 861 printf("%9d %9d %9d %9d %9d %9d %9d %9d\n", 862 ext_nfsstats.srvrpccnt[NFSV4OP_RENAME], 863 ext_nfsstats.srvrpccnt[NFSV4OP_LINK], 864 ext_nfsstats.srvrpccnt[NFSV4OP_SYMLINK], 865 ext_nfsstats.srvrpccnt[NFSV4OP_MKDIR], 866 ext_nfsstats.srvrpccnt[NFSV4OP_RMDIR], 867 ext_nfsstats.srvrpccnt[NFSV4OP_READDIR], 868 ext_nfsstats.srvrpccnt[NFSV4OP_READDIRPLUS], 869 ext_nfsstats.srvrpccnt[NFSV4OP_ACCESS]); 870 if (printtitle) 871 printf( 872 "%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n" 873 , "Mknod", "Fsstat", "Fsinfo", "PathConf", 874 "Commit", "LookupP", "SetClId", "SetClIdCf"); 875 printf("%9d %9d %9d %9d %9d %9d %9d %9d\n", 876 ext_nfsstats.srvrpccnt[NFSV4OP_MKNOD], 877 ext_nfsstats.srvrpccnt[NFSV4OP_FSSTAT], 878 ext_nfsstats.srvrpccnt[NFSV4OP_FSINFO], 879 ext_nfsstats.srvrpccnt[NFSV4OP_PATHCONF], 880 ext_nfsstats.srvrpccnt[NFSV4OP_COMMIT], 881 ext_nfsstats.srvrpccnt[NFSV4OP_LOOKUPP], 882 ext_nfsstats.srvrpccnt[NFSV4OP_SETCLIENTID], 883 ext_nfsstats.srvrpccnt[NFSV4OP_SETCLIENTIDCFRM]); 884 if (printtitle) 885 printf( 886 "%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n" 887 , "Open", "OpenAttr", "OpenDwnGr", "OpenCfrm", 888 "DelePurge", "DeleRet", "GetFH", "Lock"); 889 printf("%9d %9d %9d %9d %9d %9d %9d %9d\n", 890 ext_nfsstats.srvrpccnt[NFSV4OP_OPEN], 891 ext_nfsstats.srvrpccnt[NFSV4OP_OPENATTR], 892 ext_nfsstats.srvrpccnt[NFSV4OP_OPENDOWNGRADE], 893 ext_nfsstats.srvrpccnt[NFSV4OP_OPENCONFIRM], 894 ext_nfsstats.srvrpccnt[NFSV4OP_DELEGPURGE], 895 ext_nfsstats.srvrpccnt[NFSV4OP_DELEGRETURN], 896 ext_nfsstats.srvrpccnt[NFSV4OP_GETFH], 897 ext_nfsstats.srvrpccnt[NFSV4OP_LOCK]); 898 if (printtitle) 899 printf( 900 "%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n" 901 , "LockT", "LockU", "Close", "Verify", "NVerify", 902 "PutFH", "PutPubFH", "PutRootFH"); 903 printf("%9d %9d %9d %9d %9d %9d %9d %9d\n", 904 ext_nfsstats.srvrpccnt[NFSV4OP_LOCKT], 905 ext_nfsstats.srvrpccnt[NFSV4OP_LOCKU], 906 ext_nfsstats.srvrpccnt[NFSV4OP_CLOSE], 907 ext_nfsstats.srvrpccnt[NFSV4OP_VERIFY], 908 ext_nfsstats.srvrpccnt[NFSV4OP_NVERIFY], 909 ext_nfsstats.srvrpccnt[NFSV4OP_PUTFH], 910 ext_nfsstats.srvrpccnt[NFSV4OP_PUTPUBFH], 911 ext_nfsstats.srvrpccnt[NFSV4OP_PUTROOTFH]); 912 if (printtitle) 913 printf("%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n", 914 "Renew", "RestoreFH", "SaveFH", "Secinfo", 915 "RelLckOwn", "V4Create"); 916 printf("%9d %9d %9d %9d %9d %9d\n", 917 ext_nfsstats.srvrpccnt[NFSV4OP_RENEW], 918 ext_nfsstats.srvrpccnt[NFSV4OP_RESTOREFH], 919 ext_nfsstats.srvrpccnt[NFSV4OP_SAVEFH], 920 ext_nfsstats.srvrpccnt[NFSV4OP_SECINFO], 921 ext_nfsstats.srvrpccnt[NFSV4OP_RELEASELCKOWN], 922 ext_nfsstats.srvrpccnt[NFSV4OP_CREATE]); 923 if (printtitle) { 924 printf("Server:\n"); 925 printf("%9.9s %9.9s %9.9s\n", 926 "Retfailed", "Faults", "Clients"); 927 } 928 printf("%9d %9d %9d\n", 929 ext_nfsstats.srv_errs, ext_nfsstats.srvrpc_errs, 930 ext_nfsstats.srvclients); 931 if (printtitle) 932 printf("%9.9s %9.9s %9.9s %9.9s %9.9s \n", 933 "OpenOwner", "Opens", "LockOwner", 934 "Locks", "Delegs"); 935 printf("%9d %9d %9d %9d %9d \n", 936 ext_nfsstats.srvopenowners, 937 ext_nfsstats.srvopens, 938 ext_nfsstats.srvlockowners, 939 ext_nfsstats.srvlocks, 940 ext_nfsstats.srvdelegates); 941 if (printtitle) { 942 printf("Server Cache Stats:\n"); 943 printf("%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n", 944 "Inprog", "Idem", "Non-idem", "Misses", 945 "CacheSize", "TCPPeak"); 946 } 947 printf("%9d %9d %9d %9d %9d %9d\n", 948 ext_nfsstats.srvcache_inproghits, 949 ext_nfsstats.srvcache_idemdonehits, 950 ext_nfsstats.srvcache_nonidemdonehits, 951 ext_nfsstats.srvcache_misses, 952 ext_nfsstats.srvcache_size, 953 ext_nfsstats.srvcache_tcppeak); 954 } 955} 956 957/* 958 * Print a running summary of nfs statistics for the experimental client and/or 959 * server. 960 * Repeat display every interval seconds, showing statistics 961 * collected over that interval. Assumes that interval is non-zero. 962 * First line printed at top of screen is always cumulative. 963 */ 964void 965exp_sidewaysintpr(u_int interval, int clientOnly, int serverOnly) 966{ 967 struct ext_nfsstats nfsstats, lastst, *ext_nfsstatsp; 968 int hdrcnt = 1; 969 970 ext_nfsstatsp = &lastst; 971 if (nfssvc(NFSSVC_GETSTATS, ext_nfsstatsp) < 0) 972 err(1, "Can't get stats"); 973 sleep(interval); 974 975 for (;;) { 976 ext_nfsstatsp = &nfsstats; 977 if (nfssvc(NFSSVC_GETSTATS, ext_nfsstatsp) < 0) 978 err(1, "Can't get stats"); 979 980 if (--hdrcnt == 0) { 981 printhdr(clientOnly, serverOnly); 982 if (clientOnly && serverOnly) 983 hdrcnt = 10; 984 else 985 hdrcnt = 20; 986 } 987 if (clientOnly) { 988 printf("%s %6d %6d %6d %6d %6d %6d %6d %6d", 989 ((clientOnly && serverOnly) ? "Client:" : ""), 990 DELTA(rpccnt[NFSPROC_GETATTR]), 991 DELTA(rpccnt[NFSPROC_LOOKUP]), 992 DELTA(rpccnt[NFSPROC_READLINK]), 993 DELTA(rpccnt[NFSPROC_READ]), 994 DELTA(rpccnt[NFSPROC_WRITE]), 995 DELTA(rpccnt[NFSPROC_RENAME]), 996 DELTA(rpccnt[NFSPROC_ACCESS]), 997 DELTA(rpccnt[NFSPROC_READDIR]) + 998 DELTA(rpccnt[NFSPROC_READDIRPLUS]) 999 ); 1000 if (widemode) { 1001 printf(" %s %s %s %s %s %s", 1002 sperc1(DELTA(attrcache_hits), 1003 DELTA(attrcache_misses)), 1004 sperc1(DELTA(lookupcache_hits), 1005 DELTA(lookupcache_misses)), 1006 sperc2(DELTA(biocache_reads), 1007 DELTA(read_bios)), 1008 sperc2(DELTA(biocache_writes), 1009 DELTA(write_bios)), 1010 sperc1(DELTA(accesscache_hits), 1011 DELTA(accesscache_misses)), 1012 sperc2(DELTA(biocache_readdirs), 1013 DELTA(readdir_bios)) 1014 ); 1015 } 1016 printf("\n"); 1017 } 1018 if (serverOnly) { 1019 printf("%s %6d %6d %6d %6d %6d %6d %6d %6d", 1020 ((clientOnly && serverOnly) ? "Server:" : ""), 1021 DELTA(srvrpccnt[NFSV4OP_GETATTR]), 1022 DELTA(srvrpccnt[NFSV4OP_LOOKUP]), 1023 DELTA(srvrpccnt[NFSV4OP_READLINK]), 1024 DELTA(srvrpccnt[NFSV4OP_READ]), 1025 DELTA(srvrpccnt[NFSV4OP_WRITE]), 1026 DELTA(srvrpccnt[NFSV4OP_RENAME]), 1027 DELTA(srvrpccnt[NFSV4OP_ACCESS]), 1028 DELTA(srvrpccnt[NFSV4OP_READDIR]) + 1029 DELTA(srvrpccnt[NFSV4OP_READDIRPLUS])); 1030 printf("\n"); 1031 } 1032 lastst = nfsstats; 1033 fflush(stdout); 1034 sleep(interval); 1035 } 1036 /*NOTREACHED*/ 1037} 1038 1039