nfsstat.c revision 221435
1153151Sjkim/* 2181648Sjkim * Copyright (c) 1983, 1989, 1993 3181648Sjkim * The Regents of the University of California. All rights reserved. 4153151Sjkim * 5153151Sjkim * This code is derived from software contributed to Berkeley by 6153151Sjkim * Rick Macklem at The University of Guelph. 7153151Sjkim * 8153151Sjkim * Redistribution and use in source and binary forms, with or without 9153151Sjkim * modification, are permitted provided that the following conditions 10153151Sjkim * are met: 11153151Sjkim * 1. Redistributions of source code must retain the above copyright 12153151Sjkim * notice, this list of conditions and the following disclaimer. 13153151Sjkim * 2. Redistributions in binary form must reproduce the above copyright 14153151Sjkim * notice, this list of conditions and the following disclaimer in the 15153151Sjkim * documentation and/or other materials provided with the distribution. 16153151Sjkim * 4. Neither the name of the University nor the names of its contributors 17153151Sjkim * may be used to endorse or promote products derived from this software 18153151Sjkim * without specific prior written permission. 19153151Sjkim * 20153151Sjkim * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 21153151Sjkim * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 22153151Sjkim * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 23153151Sjkim * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 24153151Sjkim * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 25153151Sjkim * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 26153151Sjkim * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 27153151Sjkim * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 28153151Sjkim * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 29153151Sjkim * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 30153151Sjkim * SUCH DAMAGE. 31153151Sjkim */ 32153151Sjkim 33153151Sjkim#ifndef lint 34153151Sjkimstatic const char copyright[] = 35181846Sjkim"@(#) Copyright (c) 1983, 1989, 1993\n\ 36153151Sjkim The Regents of the University of California. All rights reserved.\n"; 37153151Sjkim#endif /* not lint */ 38153151Sjkim 39153151Sjkim#ifndef lint 40153151Sjkim#if 0 41153151Sjkimstatic char sccsid[] = "@(#)nfsstat.c 8.2 (Berkeley) 3/31/95"; 42181846Sjkim#endif 43181846Sjkimstatic const char rcsid[] = 44181846Sjkim "$FreeBSD: head/usr.bin/nfsstat/nfsstat.c 221435 2011-05-04 13:20:44Z rmacklem $"; 45181846Sjkim#endif /* not lint */ 46153151Sjkim 47181846Sjkim#include <sys/param.h> 48181846Sjkim#include <sys/module.h> 49153151Sjkim#include <sys/mount.h> 50153151Sjkim#include <sys/time.h> 51153151Sjkim#include <sys/sysctl.h> 52153151Sjkim#include <nfs/nfsproto.h> 53153151Sjkim#include <nfsclient/nfs.h> 54153151Sjkim#include <nfsserver/nfs.h> 55153151Sjkim#include <nfs/nfssvc.h> 56153151Sjkim 57153151Sjkim#include <fs/nfs/nfsport.h> 58153151Sjkim 59153151Sjkim#include <signal.h> 60181846Sjkim#include <fcntl.h> 61153151Sjkim#include <ctype.h> 62153151Sjkim#include <errno.h> 63153151Sjkim#include <kvm.h> 64153151Sjkim#include <limits.h> 65153151Sjkim#include <nlist.h> 66153151Sjkim#include <unistd.h> 67153151Sjkim#include <stdio.h> 68153151Sjkim#include <stdlib.h> 69153151Sjkim#include <string.h> 70153151Sjkim#include <paths.h> 71153151Sjkim#include <err.h> 72153151Sjkim 73153151Sjkimstruct nlist nl[] = { 74153151Sjkim#define N_NFSSTAT 0 75153151Sjkim { .n_name = "nfsstats" }, 76153151Sjkim#define N_NFSRVSTAT 1 77153151Sjkim { .n_name = "nfsrvstats" }, 78153151Sjkim { .n_name = NULL }, 79153151Sjkim}; 80153151Sjkimkvm_t *kd; 81153151Sjkim 82153151Sjkimstatic int deadkernel = 0; 83153151Sjkimstatic int widemode = 0; 84153151Sjkimstatic int zflag = 0; 85153151Sjkimstatic int run_v4 = 0; 86153151Sjkimstatic int printtitle = 1; 87153151Sjkimstatic struct ext_nfsstats ext_nfsstats; 88153151Sjkim 89153151Sjkimvoid intpr(int, int); 90153151Sjkimvoid printhdr(int, int); 91153151Sjkimvoid sidewaysintpr(u_int, int, int); 92153151Sjkimvoid usage(void); 93153151Sjkimchar *sperc1(int, int); 94153151Sjkimchar *sperc2(int, int); 95153151Sjkimvoid exp_intpr(int, int); 96153151Sjkimvoid exp_sidewaysintpr(u_int, int, int); 97153151Sjkim 98153151Sjkim#define DELTA(field) (nfsstats.field - lastst.field) 99153151Sjkim 100153151Sjkimint 101153151Sjkimmain(int argc, char **argv) 102153151Sjkim{ 103153151Sjkim u_int interval; 104153151Sjkim int clientOnly = -1; 105153151Sjkim int serverOnly = -1; 106153151Sjkim int ch; 107153151Sjkim char *memf, *nlistf; 108153151Sjkim char errbuf[_POSIX2_LINE_MAX]; 109153151Sjkim 110153995Sjkim interval = 0; 111153995Sjkim memf = nlistf = NULL; 112181648Sjkim while ((ch = getopt(argc, argv, "cesWM:N:w:z")) != -1) 113153995Sjkim switch(ch) { 114153151Sjkim case 'M': 115181846Sjkim memf = optarg; 116153151Sjkim break; 117153157Sjkim case 'N': 118181846Sjkim nlistf = optarg; 119181846Sjkim break; 120181846Sjkim case 'W': 121153151Sjkim widemode = 1; 122181648Sjkim break; 123153151Sjkim case 'w': 124153151Sjkim interval = atoi(optarg); 125153151Sjkim break; 126153151Sjkim case 'c': 127153151Sjkim clientOnly = 1; 128153151Sjkim if (serverOnly < 0) 129153151Sjkim serverOnly = 0; 130153151Sjkim break; 131153151Sjkim case 's': 132153151Sjkim serverOnly = 1; 133153151Sjkim if (clientOnly < 0) 134153151Sjkim clientOnly = 0; 135153151Sjkim break; 136153151Sjkim case 'z': 137153151Sjkim zflag = 1; 138153151Sjkim break; 139153151Sjkim case 'e': 140153151Sjkim run_v4 = 1; 141153151Sjkim break; 142153151Sjkim case '?': 143179968Sjkim default: 144153151Sjkim usage(); 145153151Sjkim } 146153151Sjkim argc -= optind; 147179968Sjkim argv += optind; 148181645Sjkim 149153151Sjkim#define BACKWARD_COMPATIBILITY 150153151Sjkim#ifdef BACKWARD_COMPATIBILITY 151153151Sjkim if (*argv) { 152153151Sjkim interval = atoi(*argv); 153153151Sjkim if (*++argv) { 154153151Sjkim nlistf = *argv; 155181846Sjkim if (*++argv) 156181648Sjkim memf = *argv; 157181846Sjkim } 158181846Sjkim } 159181846Sjkim#endif 160153151Sjkim if (run_v4 != 0 && modfind("nfscommon") < 0) 161153151Sjkim errx(1, "experimental client/server not loaded"); 162179968Sjkim 163153151Sjkim if (run_v4 != 0) { 164153151Sjkim if (nfssvc(NFSSVC_GETSTATS, &ext_nfsstats) < 0) 165153151Sjkim err(1, "Can't get stats"); 166153151Sjkim } else if (nlistf != NULL || memf != NULL) { 167153151Sjkim deadkernel = 1; 168153151Sjkim 169153151Sjkim if ((kd = kvm_openfiles(nlistf, memf, NULL, O_RDONLY, 170153151Sjkim errbuf)) == 0) { 171153151Sjkim errx(1, "kvm_openfiles: %s", errbuf); 172153151Sjkim } 173153151Sjkim if (kvm_nlist(kd, nl) != 0) { 174153151Sjkim errx(1, "kvm_nlist: can't get names"); 175153151Sjkim } 176153151Sjkim } 177181853Sjkim 178181853Sjkim if (interval) { 179181853Sjkim if (run_v4 > 0) 180181853Sjkim exp_sidewaysintpr(interval, clientOnly, serverOnly); 181181853Sjkim else 182181853Sjkim sidewaysintpr(interval, clientOnly, serverOnly); 183181853Sjkim } else { 184179978Sjkim if (run_v4 > 0) 185153151Sjkim exp_intpr(clientOnly, serverOnly); 186153151Sjkim else 187153151Sjkim intpr(clientOnly, serverOnly); 188153151Sjkim } 189179968Sjkim exit(0); 190153151Sjkim} 191153151Sjkim 192153151Sjkim/* 193153151Sjkim * Read the nfs stats using sysctl(3) for live kernels, or kvm_read 194179978Sjkim * for dead ones. 195181853Sjkim */ 196181853Sjkimstatic void 197181853Sjkimreadstats(struct nfsstats **stp, struct nfsrvstats **srvstp, int zero) 198181853Sjkim{ 199181853Sjkim union { 200181853Sjkim struct nfsstats client; 201181853Sjkim struct nfsrvstats server; 202153151Sjkim } zerostat; 203153151Sjkim size_t buflen; 204153151Sjkim 205153151Sjkim if (deadkernel) { 206179968Sjkim if (*stp != NULL && kvm_read(kd, (u_long)nl[N_NFSSTAT].n_value, 207153151Sjkim *stp, sizeof(struct nfsstats)) < 0) { 208153151Sjkim *stp = NULL; 209153151Sjkim } 210153151Sjkim if (*srvstp != NULL && kvm_read(kd, 211179978Sjkim (u_long)nl[N_NFSRVSTAT].n_value, *srvstp, 212181853Sjkim sizeof(struct nfsrvstats)) < 0) { 213181853Sjkim *srvstp = NULL; 214181853Sjkim } 215153151Sjkim } else { 216153151Sjkim if (zero) 217153151Sjkim bzero(&zerostat, sizeof(zerostat)); 218153151Sjkim buflen = sizeof(struct nfsstats); 219181853Sjkim if (*stp != NULL && sysctlbyname("vfs.nfs.nfsstats", *stp, 220153151Sjkim &buflen, zero ? &zerostat : NULL, zero ? buflen : 0) < 0) { 221153151Sjkim if (errno != ENOENT) 222153151Sjkim err(1, "sysctl: vfs.nfs.nfsstats"); 223181648Sjkim *stp = NULL; 224153151Sjkim } 225153151Sjkim buflen = sizeof(struct nfsrvstats); 226153151Sjkim if (*srvstp != NULL && sysctlbyname("vfs.nfsrv.nfsrvstats", 227181648Sjkim *srvstp, &buflen, zero ? &zerostat : NULL, 228153151Sjkim zero ? buflen : 0) < 0) { 229153151Sjkim if (errno != ENOENT) 230153151Sjkim err(1, "sysctl: vfs.nfsrv.nfsrvstats"); 231181853Sjkim *srvstp = NULL; 232181853Sjkim } 233181853Sjkim } 234181853Sjkim} 235181853Sjkim 236181853Sjkim/* 237181853Sjkim * Print a description of the nfs stats. 238181853Sjkim */ 239181853Sjkimvoid 240181853Sjkimintpr(int clientOnly, int serverOnly) 241181853Sjkim{ 242181853Sjkim struct nfsstats nfsstats, *nfsstatsp; 243179978Sjkim struct nfsrvstats nfsrvstats, *nfsrvstatsp; 244153151Sjkim 245153151Sjkim /* 246153151Sjkim * Only read the stats we are going to display to avoid zeroing 247153151Sjkim * stats the user didn't request. 248179968Sjkim */ 249153151Sjkim if (clientOnly) 250153151Sjkim nfsstatsp = &nfsstats; 251153151Sjkim else 252153151Sjkim nfsstatsp = NULL; 253179978Sjkim if (serverOnly) 254181853Sjkim nfsrvstatsp = &nfsrvstats; 255181853Sjkim else 256181853Sjkim nfsrvstatsp = NULL; 257181853Sjkim 258181853Sjkim readstats(&nfsstatsp, &nfsrvstatsp, zflag); 259181853Sjkim 260181853Sjkim if (clientOnly && !nfsstatsp) { 261181853Sjkim printf("Client not present!\n"); 262181853Sjkim clientOnly = 0; 263181853Sjkim } 264181853Sjkim if (clientOnly) { 265181853Sjkim printf("Client Info:\n"); 266153151Sjkim printf("Rpc Counts:\n"); 267153151Sjkim printf("%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n", 268153151Sjkim "Getattr", "Setattr", "Lookup", "Readlink", "Read", 269153151Sjkim "Write", "Create", "Remove"); 270179968Sjkim printf("%9d %9d %9d %9d %9d %9d %9d %9d\n", 271153151Sjkim nfsstats.rpccnt[NFSPROC_GETATTR], 272153151Sjkim nfsstats.rpccnt[NFSPROC_SETATTR], 273153151Sjkim nfsstats.rpccnt[NFSPROC_LOOKUP], 274153151Sjkim nfsstats.rpccnt[NFSPROC_READLINK], 275179978Sjkim nfsstats.rpccnt[NFSPROC_READ], 276181853Sjkim nfsstats.rpccnt[NFSPROC_WRITE], 277181853Sjkim nfsstats.rpccnt[NFSPROC_CREATE], 278181853Sjkim nfsstats.rpccnt[NFSPROC_REMOVE]); 279181853Sjkim printf("%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n", 280181853Sjkim "Rename", "Link", "Symlink", "Mkdir", "Rmdir", 281181853Sjkim "Readdir", "RdirPlus", "Access"); 282181853Sjkim printf("%9d %9d %9d %9d %9d %9d %9d %9d\n", 283153151Sjkim nfsstats.rpccnt[NFSPROC_RENAME], 284153151Sjkim nfsstats.rpccnt[NFSPROC_LINK], 285153151Sjkim nfsstats.rpccnt[NFSPROC_SYMLINK], 286153151Sjkim nfsstats.rpccnt[NFSPROC_MKDIR], 287181853Sjkim nfsstats.rpccnt[NFSPROC_RMDIR], 288181853Sjkim nfsstats.rpccnt[NFSPROC_READDIR], 289153151Sjkim nfsstats.rpccnt[NFSPROC_READDIRPLUS], 290153151Sjkim nfsstats.rpccnt[NFSPROC_ACCESS]); 291153151Sjkim printf("%9.9s %9.9s %9.9s %9.9s %9.9s\n", 292181853Sjkim "Mknod", "Fsstat", "Fsinfo", "PathConf", "Commit"); 293181853Sjkim printf("%9d %9d %9d %9d %9d\n", 294181853Sjkim nfsstats.rpccnt[NFSPROC_MKNOD], 295179978Sjkim nfsstats.rpccnt[NFSPROC_FSSTAT], 296153151Sjkim nfsstats.rpccnt[NFSPROC_FSINFO], 297153151Sjkim nfsstats.rpccnt[NFSPROC_PATHCONF], 298153151Sjkim nfsstats.rpccnt[NFSPROC_COMMIT]); 299153151Sjkim printf("Rpc Info:\n"); 300179978Sjkim printf("%9.9s %9.9s %9.9s %9.9s %9.9s\n", 301181853Sjkim "TimedOut", "Invalid", "X Replies", "Retries", 302181648Sjkim "Requests"); 303179968Sjkim printf("%9d %9d %9d %9d %9d\n", 304153151Sjkim nfsstats.rpctimeouts, 305153151Sjkim nfsstats.rpcinvalid, 306153151Sjkim nfsstats.rpcunexpected, 307179968Sjkim nfsstats.rpcretries, 308153151Sjkim nfsstats.rpcrequests); 309153151Sjkim printf("Cache Info:\n"); 310153151Sjkim printf("%9.9s %9.9s %9.9s %9.9s", 311179968Sjkim "Attr Hits", "Misses", "Lkup Hits", "Misses"); 312153151Sjkim printf(" %9.9s %9.9s %9.9s %9.9s\n", 313153151Sjkim "BioR Hits", "Misses", "BioW Hits", "Misses"); 314153151Sjkim printf("%9d %9d %9d %9d", 315179968Sjkim nfsstats.attrcache_hits, nfsstats.attrcache_misses, 316179968Sjkim nfsstats.lookupcache_hits, nfsstats.lookupcache_misses); 317179968Sjkim printf(" %9d %9d %9d %9d\n", 318153151Sjkim nfsstats.biocache_reads-nfsstats.read_bios, 319153151Sjkim nfsstats.read_bios, 320153151Sjkim nfsstats.biocache_writes-nfsstats.write_bios, 321179968Sjkim nfsstats.write_bios); 322179968Sjkim printf("%9.9s %9.9s %9.9s %9.9s", 323179968Sjkim "BioRLHits", "Misses", "BioD Hits", "Misses"); 324153151Sjkim printf(" %9.9s %9.9s %9.9s %9.9s\n", "DirE Hits", "Misses", "Accs Hits", "Misses"); 325153151Sjkim printf("%9d %9d %9d %9d", 326153151Sjkim nfsstats.biocache_readlinks-nfsstats.readlink_bios, 327153151Sjkim nfsstats.readlink_bios, 328153151Sjkim nfsstats.biocache_readdirs-nfsstats.readdir_bios, 329153151Sjkim nfsstats.readdir_bios); 330153151Sjkim printf(" %9d %9d %9d %9d\n", 331153151Sjkim nfsstats.direofcache_hits, nfsstats.direofcache_misses, 332179968Sjkim nfsstats.accesscache_hits, nfsstats.accesscache_misses); 333179968Sjkim } 334179968Sjkim if (serverOnly && !nfsrvstatsp) { 335153151Sjkim printf("Server not present!\n"); 336153151Sjkim serverOnly = 0; 337153151Sjkim } 338179968Sjkim if (serverOnly) { 339179968Sjkim printf("\nServer Info:\n"); 340179968Sjkim printf("%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n", 341153151Sjkim "Getattr", "Setattr", "Lookup", "Readlink", "Read", 342153151Sjkim "Write", "Create", "Remove"); 343153151Sjkim printf("%9d %9d %9d %9d %9d %9d %9d %9d\n", 344153151Sjkim nfsrvstats.srvrpccnt[NFSPROC_GETATTR], 345153151Sjkim nfsrvstats.srvrpccnt[NFSPROC_SETATTR], 346153151Sjkim nfsrvstats.srvrpccnt[NFSPROC_LOOKUP], 347153151Sjkim nfsrvstats.srvrpccnt[NFSPROC_READLINK], 348153151Sjkim nfsrvstats.srvrpccnt[NFSPROC_READ], 349181697Sjkim nfsrvstats.srvrpccnt[NFSPROC_WRITE], 350181697Sjkim nfsrvstats.srvrpccnt[NFSPROC_CREATE], 351179968Sjkim nfsrvstats.srvrpccnt[NFSPROC_REMOVE]); 352181697Sjkim printf("%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n", 353153151Sjkim "Rename", "Link", "Symlink", "Mkdir", "Rmdir", 354153151Sjkim "Readdir", "RdirPlus", "Access"); 355153151Sjkim printf("%9d %9d %9d %9d %9d %9d %9d %9d\n", 356181697Sjkim nfsrvstats.srvrpccnt[NFSPROC_RENAME], 357181697Sjkim nfsrvstats.srvrpccnt[NFSPROC_LINK], 358179968Sjkim nfsrvstats.srvrpccnt[NFSPROC_SYMLINK], 359181697Sjkim nfsrvstats.srvrpccnt[NFSPROC_MKDIR], 360153151Sjkim nfsrvstats.srvrpccnt[NFSPROC_RMDIR], 361153151Sjkim nfsrvstats.srvrpccnt[NFSPROC_READDIR], 362153151Sjkim nfsrvstats.srvrpccnt[NFSPROC_READDIRPLUS], 363181697Sjkim nfsrvstats.srvrpccnt[NFSPROC_ACCESS]); 364181697Sjkim printf("%9.9s %9.9s %9.9s %9.9s %9.9s\n", 365179968Sjkim "Mknod", "Fsstat", "Fsinfo", "PathConf", "Commit"); 366181697Sjkim printf("%9d %9d %9d %9d %9d\n", 367153151Sjkim nfsrvstats.srvrpccnt[NFSPROC_MKNOD], 368153151Sjkim nfsrvstats.srvrpccnt[NFSPROC_FSSTAT], 369153151Sjkim nfsrvstats.srvrpccnt[NFSPROC_FSINFO], 370181697Sjkim nfsrvstats.srvrpccnt[NFSPROC_PATHCONF], 371181697Sjkim nfsrvstats.srvrpccnt[NFSPROC_COMMIT]); 372181697Sjkim printf("Server Ret-Failed\n"); 373181697Sjkim printf("%17d\n", nfsrvstats.srvrpc_errs); 374153151Sjkim printf("Server Faults\n"); 375153151Sjkim printf("%13d\n", nfsrvstats.srv_errs); 376153151Sjkim printf("Server Cache Stats:\n"); 377181697Sjkim printf("%9.9s %9.9s %9.9s %9.9s\n", 378181697Sjkim "Inprog", "Idem", "Non-idem", "Misses"); 379179968Sjkim printf("%9d %9d %9d %9d\n", 380181697Sjkim nfsrvstats.srvcache_inproghits, 381153151Sjkim nfsrvstats.srvcache_idemdonehits, 382153151Sjkim nfsrvstats.srvcache_nonidemdonehits, 383153151Sjkim nfsrvstats.srvcache_misses); 384181697Sjkim printf("Server Write Gathering:\n"); 385181697Sjkim printf("%9.9s %9.9s %9.9s\n", 386179968Sjkim "WriteOps", "WriteRPC", "Opsaved"); 387181697Sjkim printf("%9d %9d %9d\n", 388153151Sjkim nfsrvstats.srvvop_writes, 389153151Sjkim nfsrvstats.srvrpccnt[NFSPROC_WRITE], 390153151Sjkim nfsrvstats.srvrpccnt[NFSPROC_WRITE] - 391181697Sjkim nfsrvstats.srvvop_writes); 392181697Sjkim } 393179968Sjkim} 394181697Sjkim 395153151Sjkimu_char signalled; /* set if alarm goes off "early" */ 396153151Sjkim 397153151Sjkim/* 398181697Sjkim * Print a running summary of nfs statistics. 399181697Sjkim * Repeat display every interval seconds, showing statistics 400181697Sjkim * collected over that interval. Assumes that interval is non-zero. 401181697Sjkim * First line printed at top of screen is always cumulative. 402153151Sjkim */ 403153151Sjkimvoid 404153151Sjkimsidewaysintpr(u_int interval, int clientOnly, int serverOnly) 405179968Sjkim{ 406153151Sjkim struct nfsstats nfsstats, lastst, *nfsstatsp; 407153151Sjkim struct nfsrvstats nfsrvstats, lastsrvst, *nfsrvstatsp; 408153151Sjkim int hdrcnt = 1; 409179968Sjkim 410153151Sjkim nfsstatsp = &lastst; 411153151Sjkim nfsrvstatsp = &lastsrvst; 412153151Sjkim readstats(&nfsstatsp, &nfsrvstatsp, 0); 413179968Sjkim if (clientOnly && !nfsstatsp) { 414179968Sjkim printf("Client not present!\n"); 415153151Sjkim clientOnly = 0; 416153151Sjkim } 417153151Sjkim if (serverOnly && !nfsrvstatsp) { 418153151Sjkim printf("Server not present!\n"); 419181697Sjkim serverOnly = 0; 420153151Sjkim } 421179978Sjkim sleep(interval); 422153151Sjkim 423153151Sjkim for (;;) { 424153151Sjkim nfsstatsp = &nfsstats; 425153151Sjkim nfsrvstatsp = &nfsrvstats; 426179968Sjkim readstats(&nfsstatsp, &nfsrvstatsp, 0); 427179978Sjkim 428153151Sjkim if (--hdrcnt == 0) { 429179968Sjkim printhdr(clientOnly, serverOnly); 430153151Sjkim if (clientOnly && serverOnly) 431153151Sjkim hdrcnt = 10; 432153151Sjkim else 433179968Sjkim hdrcnt = 20; 434153151Sjkim } 435153151Sjkim if (clientOnly) { 436153151Sjkim printf("%s %6d %6d %6d %6d %6d %6d %6d %6d", 437179968Sjkim ((clientOnly && serverOnly) ? "Client:" : ""), 438153151Sjkim DELTA(attrcache_hits) + DELTA(attrcache_misses), 439153151Sjkim DELTA(lookupcache_hits) + DELTA(lookupcache_misses), 440153151Sjkim DELTA(biocache_readlinks), 441179968Sjkim DELTA(biocache_reads), 442153151Sjkim DELTA(biocache_writes), 443153151Sjkim nfsstats.rpccnt[NFSPROC_RENAME]-lastst.rpccnt[NFSPROC_RENAME], 444153151Sjkim DELTA(accesscache_hits) + DELTA(accesscache_misses), 445153151Sjkim DELTA(biocache_readdirs) 446179968Sjkim ); 447153151Sjkim if (widemode) { 448153151Sjkim printf(" %s %s %s %s %s %s", 449153151Sjkim sperc1(DELTA(attrcache_hits), 450153151Sjkim DELTA(attrcache_misses)), 451153151Sjkim sperc1(DELTA(lookupcache_hits), 452153151Sjkim DELTA(lookupcache_misses)), 453153151Sjkim sperc2(DELTA(biocache_reads), 454153151Sjkim DELTA(read_bios)), 455153151Sjkim sperc2(DELTA(biocache_writes), 456153151Sjkim DELTA(write_bios)), 457153151Sjkim sperc1(DELTA(accesscache_hits), 458153151Sjkim DELTA(accesscache_misses)), 459179968Sjkim sperc2(DELTA(biocache_readdirs), 460179968Sjkim DELTA(readdir_bios)) 461179968Sjkim ); 462153151Sjkim } 463153151Sjkim printf("\n"); 464153151Sjkim lastst = nfsstats; 465153151Sjkim } 466179968Sjkim if (serverOnly) { 467179978Sjkim printf("%s %6d %6d %6d %6d %6d %6d %6d %6d", 468179968Sjkim ((clientOnly && serverOnly) ? "Server:" : ""), 469153151Sjkim nfsrvstats.srvrpccnt[NFSPROC_GETATTR]-lastsrvst.srvrpccnt[NFSPROC_GETATTR], 470179968Sjkim nfsrvstats.srvrpccnt[NFSPROC_LOOKUP]-lastsrvst.srvrpccnt[NFSPROC_LOOKUP], 471153151Sjkim nfsrvstats.srvrpccnt[NFSPROC_READLINK]-lastsrvst.srvrpccnt[NFSPROC_READLINK], 472153151Sjkim nfsrvstats.srvrpccnt[NFSPROC_READ]-lastsrvst.srvrpccnt[NFSPROC_READ], 473153151Sjkim nfsrvstats.srvrpccnt[NFSPROC_WRITE]-lastsrvst.srvrpccnt[NFSPROC_WRITE], 474179968Sjkim nfsrvstats.srvrpccnt[NFSPROC_RENAME]-lastsrvst.srvrpccnt[NFSPROC_RENAME], 475153151Sjkim nfsrvstats.srvrpccnt[NFSPROC_ACCESS]-lastsrvst.srvrpccnt[NFSPROC_ACCESS], 476153151Sjkim (nfsrvstats.srvrpccnt[NFSPROC_READDIR]-lastsrvst.srvrpccnt[NFSPROC_READDIR]) 477153151Sjkim +(nfsrvstats.srvrpccnt[NFSPROC_READDIRPLUS]-lastsrvst.srvrpccnt[NFSPROC_READDIRPLUS])); 478179968Sjkim printf("\n"); 479153151Sjkim lastsrvst = nfsrvstats; 480153151Sjkim } 481153151Sjkim fflush(stdout); 482179968Sjkim sleep(interval); 483153151Sjkim } 484153151Sjkim /*NOTREACHED*/ 485153151Sjkim} 486179968Sjkim 487153151Sjkimvoid 488153151Sjkimprinthdr(int clientOnly, int serverOnly) 489153151Sjkim{ 490153151Sjkim printf("%s%6.6s %6.6s %6.6s %6.6s %6.6s %6.6s %6.6s %6.6s", 491153151Sjkim ((serverOnly && clientOnly) ? " " : " "), 492153151Sjkim "GtAttr", "Lookup", "Rdlink", "Read", "Write", "Rename", 493153151Sjkim "Access", "Rddir"); 494179968Sjkim if (widemode && clientOnly) { 495153151Sjkim printf(" Attr Lkup BioR BioW Accs BioD"); 496153151Sjkim } 497153151Sjkim printf("\n"); 498179968Sjkim fflush(stdout); 499153151Sjkim} 500153151Sjkim 501153151Sjkimvoid 502153151Sjkimusage(void) 503153151Sjkim{ 504153151Sjkim (void)fprintf(stderr, 505153151Sjkim "usage: nfsstat [-ceszW] [-M core] [-N system] [-w interval]\n"); 506153151Sjkim exit(1); 507153151Sjkim} 508181846Sjkim 509153157Sjkimstatic char SPBuf[64][8]; 510153151Sjkimstatic int SPIndex; 511153151Sjkim 512181648Sjkimchar * 513153151Sjkimsperc1(int hits, int misses) 514181846Sjkim{ 515181846Sjkim char *p = SPBuf[SPIndex]; 516181846Sjkim 517181846Sjkim if (hits + misses) { 518181846Sjkim sprintf(p, "%3d%%", 519181846Sjkim (int)(char)((quad_t)hits * 100 / (hits + misses))); 520181846Sjkim } else { 521153151Sjkim sprintf(p, " -"); 522153151Sjkim } 523153151Sjkim SPIndex = (SPIndex + 1) & 63; 524153151Sjkim return(p); 525153151Sjkim} 526153151Sjkim 527153151Sjkimchar * 528153151Sjkimsperc2(int ttl, int misses) 529153151Sjkim{ 530153151Sjkim char *p = SPBuf[SPIndex]; 531153151Sjkim 532153151Sjkim if (ttl) { 533153151Sjkim sprintf(p, "%3d%%", 534153151Sjkim (int)(char)((quad_t)(ttl - misses) * 100 / ttl)); 535153151Sjkim } else { 536153151Sjkim sprintf(p, " -"); 537153151Sjkim } 538153151Sjkim SPIndex = (SPIndex + 1) & 63; 539153151Sjkim return(p); 540153151Sjkim} 541181846Sjkim 542153151Sjkim/* 543181846Sjkim * Print a description of the nfs stats for the experimental client/server. 544181846Sjkim */ 545181846Sjkimvoid 546153151Sjkimexp_intpr(int clientOnly, int serverOnly) 547181648Sjkim{ 548153151Sjkim 549 if (clientOnly != 0) { 550 if (printtitle) { 551 printf("Client Info:\n"); 552 printf("Rpc Counts:\n"); 553 printf( 554 "%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n" 555 , "Getattr", "Setattr", "Lookup", "Readlink", 556 "Read", "Write", "Create", "Remove"); 557 } 558 printf("%9d %9d %9d %9d %9d %9d %9d %9d\n", 559 ext_nfsstats.rpccnt[NFSPROC_GETATTR], 560 ext_nfsstats.rpccnt[NFSPROC_SETATTR], 561 ext_nfsstats.rpccnt[NFSPROC_LOOKUP], 562 ext_nfsstats.rpccnt[NFSPROC_READLINK], 563 ext_nfsstats.rpccnt[NFSPROC_READ], 564 ext_nfsstats.rpccnt[NFSPROC_WRITE], 565 ext_nfsstats.rpccnt[NFSPROC_CREATE], 566 ext_nfsstats.rpccnt[NFSPROC_REMOVE]); 567 if (printtitle) 568 printf( 569 "%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n" 570 , "Rename", "Link", "Symlink", "Mkdir", "Rmdir", 571 "Readdir", "RdirPlus", "Access"); 572 printf("%9d %9d %9d %9d %9d %9d %9d %9d\n", 573 ext_nfsstats.rpccnt[NFSPROC_RENAME], 574 ext_nfsstats.rpccnt[NFSPROC_LINK], 575 ext_nfsstats.rpccnt[NFSPROC_SYMLINK], 576 ext_nfsstats.rpccnt[NFSPROC_MKDIR], 577 ext_nfsstats.rpccnt[NFSPROC_RMDIR], 578 ext_nfsstats.rpccnt[NFSPROC_READDIR], 579 ext_nfsstats.rpccnt[NFSPROC_READDIRPLUS], 580 ext_nfsstats.rpccnt[NFSPROC_ACCESS]); 581 if (printtitle) 582 printf( 583 "%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n" 584 , "Mknod", "Fsstat", "Fsinfo", "PathConf", 585 "Commit", "SetClId", "SetClIdCf", "Lock"); 586 printf("%9d %9d %9d %9d %9d %9d %9d %9d\n", 587 ext_nfsstats.rpccnt[NFSPROC_MKNOD], 588 ext_nfsstats.rpccnt[NFSPROC_FSSTAT], 589 ext_nfsstats.rpccnt[NFSPROC_FSINFO], 590 ext_nfsstats.rpccnt[NFSPROC_PATHCONF], 591 ext_nfsstats.rpccnt[NFSPROC_COMMIT], 592 ext_nfsstats.rpccnt[NFSPROC_SETCLIENTID], 593 ext_nfsstats.rpccnt[NFSPROC_SETCLIENTIDCFRM], 594 ext_nfsstats.rpccnt[NFSPROC_LOCK]); 595 if (printtitle) 596 printf("%9.9s %9.9s %9.9s %9.9s\n", 597 "LockT", "LockU", "Open", "OpenCfr"); 598 printf("%9d %9d %9d %9d\n", 599 ext_nfsstats.rpccnt[NFSPROC_LOCKT], 600 ext_nfsstats.rpccnt[NFSPROC_LOCKU], 601 ext_nfsstats.rpccnt[NFSPROC_OPEN], 602 ext_nfsstats.rpccnt[NFSPROC_OPENCONFIRM]); 603 if (printtitle) 604 printf( 605 "%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n" 606 , "OpenOwner", "Opens", "LockOwner", 607 "Locks", "Delegs", "LocalOwn", 608 "LocalOpen", "LocalLOwn"); 609 printf("%9d %9d %9d %9d %9d %9d %9d %9d\n", 610 ext_nfsstats.clopenowners, 611 ext_nfsstats.clopens, 612 ext_nfsstats.cllockowners, 613 ext_nfsstats.cllocks, 614 ext_nfsstats.cldelegates, 615 ext_nfsstats.cllocalopenowners, 616 ext_nfsstats.cllocalopens, 617 ext_nfsstats.cllocallockowners); 618 if (printtitle) 619 printf("%9.9s\n", "LocalLock"); 620 printf("%9d\n", ext_nfsstats.cllocallocks); 621 if (printtitle) { 622 printf("Rpc Info:\n"); 623 printf("%9.9s %9.9s %9.9s %9.9s %9.9s\n", 624 "TimedOut", "Invalid", "X Replies", "Retries", 625 "Requests"); 626 } 627 printf("%9d %9d %9d %9d %9d\n", 628 ext_nfsstats.rpctimeouts, 629 ext_nfsstats.rpcinvalid, 630 ext_nfsstats.rpcunexpected, 631 ext_nfsstats.rpcretries, 632 ext_nfsstats.rpcrequests); 633 if (printtitle) { 634 printf("Cache Info:\n"); 635 printf("%9.9s %9.9s %9.9s %9.9s", 636 "Attr Hits", "Misses", "Lkup Hits", "Misses"); 637 printf(" %9.9s %9.9s %9.9s %9.9s\n", 638 "BioR Hits", "Misses", "BioW Hits", "Misses"); 639 } 640 printf("%9d %9d %9d %9d", 641 ext_nfsstats.attrcache_hits, 642 ext_nfsstats.attrcache_misses, 643 ext_nfsstats.lookupcache_hits, 644 ext_nfsstats.lookupcache_misses); 645 printf(" %9d %9d %9d %9d\n", 646 ext_nfsstats.biocache_reads, 647 ext_nfsstats.read_bios, 648 ext_nfsstats.biocache_writes, 649 ext_nfsstats.write_bios); 650 if (printtitle) { 651 printf("%9.9s %9.9s %9.9s %9.9s", 652 "BioRLHits", "Misses", "BioD Hits", "Misses"); 653 printf(" %9.9s %9.9s\n", "DirE Hits", "Misses"); 654 } 655 printf("%9d %9d %9d %9d", 656 ext_nfsstats.biocache_readlinks, 657 ext_nfsstats.readlink_bios, 658 ext_nfsstats.biocache_readdirs, 659 ext_nfsstats.readdir_bios); 660 printf(" %9d %9d\n", 661 ext_nfsstats.direofcache_hits, 662 ext_nfsstats.direofcache_misses); 663 } 664 if (serverOnly != 0) { 665 if (printtitle) { 666 printf("\nServer Info:\n"); 667 printf( 668 "%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n" 669 , "Getattr", "Setattr", "Lookup", "Readlink", 670 "Read", "Write", "Create", "Remove"); 671 } 672 printf("%9d %9d %9d %9d %9d %9d %9d %9d\n", 673 ext_nfsstats.srvrpccnt[NFSV4OP_GETATTR], 674 ext_nfsstats.srvrpccnt[NFSV4OP_SETATTR], 675 ext_nfsstats.srvrpccnt[NFSV4OP_LOOKUP], 676 ext_nfsstats.srvrpccnt[NFSV4OP_READLINK], 677 ext_nfsstats.srvrpccnt[NFSV4OP_READ], 678 ext_nfsstats.srvrpccnt[NFSV4OP_WRITE], 679 ext_nfsstats.srvrpccnt[NFSV4OP_V3CREATE], 680 ext_nfsstats.srvrpccnt[NFSV4OP_REMOVE]); 681 if (printtitle) 682 printf( 683 "%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n" 684 , "Rename", "Link", "Symlink", "Mkdir", "Rmdir", 685 "Readdir", "RdirPlus", "Access"); 686 printf("%9d %9d %9d %9d %9d %9d %9d %9d\n", 687 ext_nfsstats.srvrpccnt[NFSV4OP_RENAME], 688 ext_nfsstats.srvrpccnt[NFSV4OP_LINK], 689 ext_nfsstats.srvrpccnt[NFSV4OP_SYMLINK], 690 ext_nfsstats.srvrpccnt[NFSV4OP_MKDIR], 691 ext_nfsstats.srvrpccnt[NFSV4OP_RMDIR], 692 ext_nfsstats.srvrpccnt[NFSV4OP_READDIR], 693 ext_nfsstats.srvrpccnt[NFSV4OP_READDIRPLUS], 694 ext_nfsstats.srvrpccnt[NFSV4OP_ACCESS]); 695 if (printtitle) 696 printf( 697 "%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n" 698 , "Mknod", "Fsstat", "Fsinfo", "PathConf", 699 "Commit", "LookupP", "SetClId", "SetClIdCf"); 700 printf("%9d %9d %9d %9d %9d %9d %9d %9d\n", 701 ext_nfsstats.srvrpccnt[NFSV4OP_MKNOD], 702 ext_nfsstats.srvrpccnt[NFSV4OP_FSSTAT], 703 ext_nfsstats.srvrpccnt[NFSV4OP_FSINFO], 704 ext_nfsstats.srvrpccnt[NFSV4OP_PATHCONF], 705 ext_nfsstats.srvrpccnt[NFSV4OP_COMMIT], 706 ext_nfsstats.srvrpccnt[NFSV4OP_LOOKUPP], 707 ext_nfsstats.srvrpccnt[NFSV4OP_SETCLIENTID], 708 ext_nfsstats.srvrpccnt[NFSV4OP_SETCLIENTIDCFRM]); 709 if (printtitle) 710 printf( 711 "%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n" 712 , "Open", "OpenAttr", "OpenDwnGr", "OpenCfrm", 713 "DelePurge", "DeleRet", "GetFH", "Lock"); 714 printf("%9d %9d %9d %9d %9d %9d %9d %9d\n", 715 ext_nfsstats.srvrpccnt[NFSV4OP_OPEN], 716 ext_nfsstats.srvrpccnt[NFSV4OP_OPENATTR], 717 ext_nfsstats.srvrpccnt[NFSV4OP_OPENDOWNGRADE], 718 ext_nfsstats.srvrpccnt[NFSV4OP_OPENCONFIRM], 719 ext_nfsstats.srvrpccnt[NFSV4OP_DELEGPURGE], 720 ext_nfsstats.srvrpccnt[NFSV4OP_DELEGRETURN], 721 ext_nfsstats.srvrpccnt[NFSV4OP_GETFH], 722 ext_nfsstats.srvrpccnt[NFSV4OP_LOCK]); 723 if (printtitle) 724 printf( 725 "%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n" 726 , "LockT", "LockU", "Close", "Verify", "NVerify", 727 "PutFH", "PutPubFH", "PutRootFH"); 728 printf("%9d %9d %9d %9d %9d %9d %9d %9d\n", 729 ext_nfsstats.srvrpccnt[NFSV4OP_LOCKT], 730 ext_nfsstats.srvrpccnt[NFSV4OP_LOCKU], 731 ext_nfsstats.srvrpccnt[NFSV4OP_CLOSE], 732 ext_nfsstats.srvrpccnt[NFSV4OP_VERIFY], 733 ext_nfsstats.srvrpccnt[NFSV4OP_NVERIFY], 734 ext_nfsstats.srvrpccnt[NFSV4OP_PUTFH], 735 ext_nfsstats.srvrpccnt[NFSV4OP_PUTPUBFH], 736 ext_nfsstats.srvrpccnt[NFSV4OP_PUTROOTFH]); 737 if (printtitle) 738 printf("%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n", 739 "Renew", "RestoreFH", "SaveFH", "Secinfo", 740 "RelLckOwn", "V4Create"); 741 printf("%9d %9d %9d %9d %9d %9d\n", 742 ext_nfsstats.srvrpccnt[NFSV4OP_RENEW], 743 ext_nfsstats.srvrpccnt[NFSV4OP_RESTOREFH], 744 ext_nfsstats.srvrpccnt[NFSV4OP_SAVEFH], 745 ext_nfsstats.srvrpccnt[NFSV4OP_SECINFO], 746 ext_nfsstats.srvrpccnt[NFSV4OP_RELEASELCKOWN], 747 ext_nfsstats.srvrpccnt[NFSV4OP_CREATE]); 748 if (printtitle) { 749 printf("Server:\n"); 750 printf("%9.9s %9.9s %9.9s\n", 751 "Retfailed", "Faults", "Clients"); 752 } 753 printf("%9d %9d %9d\n", 754 ext_nfsstats.srv_errs, ext_nfsstats.srvrpc_errs, 755 ext_nfsstats.srvclients); 756 if (printtitle) 757 printf("%9.9s %9.9s %9.9s %9.9s %9.9s \n", 758 "OpenOwner", "Opens", "LockOwner", 759 "Locks", "Delegs"); 760 printf("%9d %9d %9d %9d %9d \n", 761 ext_nfsstats.srvopenowners, 762 ext_nfsstats.srvopens, 763 ext_nfsstats.srvlockowners, 764 ext_nfsstats.srvlocks, 765 ext_nfsstats.srvdelegates); 766 if (printtitle) { 767 printf("Server Cache Stats:\n"); 768 printf("%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n", 769 "Inprog", "Idem", "Non-idem", "Misses", 770 "CacheSize", "TCPPeak"); 771 } 772 printf("%9d %9d %9d %9d %9d %9d\n", 773 ext_nfsstats.srvcache_inproghits, 774 ext_nfsstats.srvcache_idemdonehits, 775 ext_nfsstats.srvcache_nonidemdonehits, 776 ext_nfsstats.srvcache_misses, 777 ext_nfsstats.srvcache_size, 778 ext_nfsstats.srvcache_tcppeak); 779 } 780} 781 782/* 783 * Print a running summary of nfs statistics for the experimental client and/or 784 * server. 785 * Repeat display every interval seconds, showing statistics 786 * collected over that interval. Assumes that interval is non-zero. 787 * First line printed at top of screen is always cumulative. 788 */ 789void 790exp_sidewaysintpr(u_int interval, int clientOnly, int serverOnly) 791{ 792 struct ext_nfsstats nfsstats, lastst, *ext_nfsstatsp; 793 int hdrcnt = 1; 794 795 ext_nfsstatsp = &lastst; 796 if (nfssvc(NFSSVC_GETSTATS, ext_nfsstatsp) < 0) 797 err(1, "Can't get stats"); 798 sleep(interval); 799 800 for (;;) { 801 ext_nfsstatsp = &nfsstats; 802 if (nfssvc(NFSSVC_GETSTATS, ext_nfsstatsp) < 0) 803 err(1, "Can't get stats"); 804 805 if (--hdrcnt == 0) { 806 printhdr(clientOnly, serverOnly); 807 if (clientOnly && serverOnly) 808 hdrcnt = 10; 809 else 810 hdrcnt = 20; 811 } 812 if (clientOnly) { 813 printf("%s %6d %6d %6d %6d %6d %6d %6d %6d", 814 ((clientOnly && serverOnly) ? "Client:" : ""), 815 DELTA(attrcache_hits) + DELTA(attrcache_misses), 816 DELTA(lookupcache_hits) + DELTA(lookupcache_misses), 817 DELTA(biocache_readlinks), 818 DELTA(biocache_reads), 819 DELTA(biocache_writes), 820 nfsstats.rpccnt[NFSPROC_RENAME] - 821 lastst.rpccnt[NFSPROC_RENAME], 822 DELTA(accesscache_hits) + DELTA(accesscache_misses), 823 DELTA(biocache_readdirs) 824 ); 825 if (widemode) { 826 printf(" %s %s %s %s %s %s", 827 sperc1(DELTA(attrcache_hits), 828 DELTA(attrcache_misses)), 829 sperc1(DELTA(lookupcache_hits), 830 DELTA(lookupcache_misses)), 831 sperc2(DELTA(biocache_reads), 832 DELTA(read_bios)), 833 sperc2(DELTA(biocache_writes), 834 DELTA(write_bios)), 835 sperc1(DELTA(accesscache_hits), 836 DELTA(accesscache_misses)), 837 sperc2(DELTA(biocache_readdirs), 838 DELTA(readdir_bios)) 839 ); 840 } 841 printf("\n"); 842 lastst = nfsstats; 843 } 844 if (serverOnly) { 845 printf("%s %6d %6d %6d %6d %6d %6d %6d %6d", 846 ((clientOnly && serverOnly) ? "Server:" : ""), 847 nfsstats.srvrpccnt[NFSPROC_GETATTR] - 848 lastst.srvrpccnt[NFSPROC_GETATTR], 849 nfsstats.srvrpccnt[NFSPROC_LOOKUP] - 850 lastst.srvrpccnt[NFSPROC_LOOKUP], 851 nfsstats.srvrpccnt[NFSPROC_READLINK] - 852 lastst.srvrpccnt[NFSPROC_READLINK], 853 nfsstats.srvrpccnt[NFSPROC_READ] - 854 lastst.srvrpccnt[NFSPROC_READ], 855 nfsstats.srvrpccnt[NFSPROC_WRITE] - 856 lastst.srvrpccnt[NFSPROC_WRITE], 857 nfsstats.srvrpccnt[NFSPROC_RENAME] - 858 lastst.srvrpccnt[NFSPROC_RENAME], 859 nfsstats.srvrpccnt[NFSPROC_ACCESS] - 860 lastst.srvrpccnt[NFSPROC_ACCESS], 861 (nfsstats.srvrpccnt[NFSPROC_READDIR] - 862 lastst.srvrpccnt[NFSPROC_READDIR]) + 863 (nfsstats.srvrpccnt[NFSPROC_READDIRPLUS] - 864 lastst.srvrpccnt[NFSPROC_READDIRPLUS])); 865 printf("\n"); 866 lastst = nfsstats; 867 } 868 fflush(stdout); 869 sleep(interval); 870 } 871 /*NOTREACHED*/ 872} 873 874