11590Srgrimes/* 21590Srgrimes * Copyright (c) 1983, 1989, 1993 31590Srgrimes * The Regents of the University of California. All rights reserved. 41590Srgrimes * 51590Srgrimes * This code is derived from software contributed to Berkeley by 61590Srgrimes * Rick Macklem at The University of Guelph. 71590Srgrimes * 81590Srgrimes * Redistribution and use in source and binary forms, with or without 91590Srgrimes * modification, are permitted provided that the following conditions 101590Srgrimes * are met: 111590Srgrimes * 1. Redistributions of source code must retain the above copyright 121590Srgrimes * notice, this list of conditions and the following disclaimer. 131590Srgrimes * 2. Redistributions in binary form must reproduce the above copyright 141590Srgrimes * notice, this list of conditions and the following disclaimer in the 151590Srgrimes * documentation and/or other materials provided with the distribution. 161590Srgrimes * 4. Neither the name of the University nor the names of its contributors 171590Srgrimes * may be used to endorse or promote products derived from this software 181590Srgrimes * without specific prior written permission. 191590Srgrimes * 201590Srgrimes * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 211590Srgrimes * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 221590Srgrimes * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 231590Srgrimes * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 241590Srgrimes * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 251590Srgrimes * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 261590Srgrimes * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 271590Srgrimes * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 281590Srgrimes * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 291590Srgrimes * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 301590Srgrimes * SUCH DAMAGE. 311590Srgrimes */ 321590Srgrimes 331590Srgrimes#ifndef lint 34194792Sdelphijstatic const char copyright[] = 351590Srgrimes"@(#) Copyright (c) 1983, 1989, 1993\n\ 361590Srgrimes The Regents of the University of California. All rights reserved.\n"; 371590Srgrimes#endif /* not lint */ 381590Srgrimes 391590Srgrimes#ifndef lint 4032649Sbde#if 0 4132649Sbdestatic char sccsid[] = "@(#)nfsstat.c 8.2 (Berkeley) 3/31/95"; 4232649Sbde#endif 433819Swollmanstatic const char rcsid[] = 4450477Speter "$FreeBSD$"; 451590Srgrimes#endif /* not lint */ 461590Srgrimes 471590Srgrimes#include <sys/param.h> 48194190Sed#include <sys/module.h> 491590Srgrimes#include <sys/mount.h> 5011936Sphk#include <sys/time.h> 513819Swollman#include <sys/sysctl.h> 529336Sdfr#include <nfs/nfsproto.h> 5383653Speter#include <nfsclient/nfs.h> 5483653Speter#include <nfsserver/nfs.h> 55192762Srmacklem#include <nfs/nfssvc.h> 56192762Srmacklem 57192762Srmacklem#include <fs/nfs/nfsport.h> 58192762Srmacklem 591590Srgrimes#include <signal.h> 601590Srgrimes#include <fcntl.h> 61200462Sdelphij#include <ctype.h> 621590Srgrimes#include <errno.h> 631590Srgrimes#include <kvm.h> 6477207Stmm#include <limits.h> 651590Srgrimes#include <nlist.h> 661590Srgrimes#include <unistd.h> 671590Srgrimes#include <stdio.h> 681590Srgrimes#include <stdlib.h> 691590Srgrimes#include <string.h> 70200462Sdelphij#include <paths.h> 713819Swollman#include <err.h> 721590Srgrimes 731590Srgrimesstruct nlist nl[] = { 741590Srgrimes#define N_NFSSTAT 0 75194792Sdelphij { .n_name = "nfsstats" }, 7683653Speter#define N_NFSRVSTAT 1 77194792Sdelphij { .n_name = "nfsrvstats" }, 78194792Sdelphij { .n_name = NULL }, 791590Srgrimes}; 801590Srgrimeskvm_t *kd; 811590Srgrimes 823819Swollmanstatic int deadkernel = 0; 8352493Sdillonstatic int widemode = 0; 84172759Sjhbstatic int zflag = 0; 85221455Srmacklemstatic int run_v4 = 1; 86192762Srmacklemstatic int printtitle = 1; 87192762Srmacklemstatic struct ext_nfsstats ext_nfsstats; 88221455Srmacklemstatic int extra_output = 0; 891590Srgrimes 9092921Simpvoid intpr(int, int); 9192921Simpvoid printhdr(int, int); 9292921Simpvoid sidewaysintpr(u_int, int, int); 9392921Simpvoid usage(void); 9492921Simpchar *sperc1(int, int); 9592921Simpchar *sperc2(int, int); 96192762Srmacklemvoid exp_intpr(int, int); 97192762Srmacklemvoid exp_sidewaysintpr(u_int, int, int); 983819Swollman 9952493Sdillon#define DELTA(field) (nfsstats.field - lastst.field) 10052493Sdillon 101131990Sstefanfint 102172759Sjhbmain(int argc, char **argv) 1031590Srgrimes{ 1041590Srgrimes u_int interval; 10552493Sdillon int clientOnly = -1; 10652493Sdillon int serverOnly = -1; 1071590Srgrimes int ch; 1081590Srgrimes char *memf, *nlistf; 10977207Stmm char errbuf[_POSIX2_LINE_MAX]; 110243783Srmacklem int mntlen, i; 111243783Srmacklem char buf[1024]; 112243783Srmacklem struct statfs *mntbuf; 113243783Srmacklem struct nfscl_dumpmntopts dumpmntopts; 1141590Srgrimes 1151590Srgrimes interval = 0; 1161590Srgrimes memf = nlistf = NULL; 117243783Srmacklem while ((ch = getopt(argc, argv, "cesWM:mN:ow:z")) != -1) 1181590Srgrimes switch(ch) { 1191590Srgrimes case 'M': 1201590Srgrimes memf = optarg; 1211590Srgrimes break; 122243783Srmacklem case 'm': 123243783Srmacklem /* Display mount options for NFS mount points. */ 124243783Srmacklem mntlen = getmntinfo(&mntbuf, MNT_NOWAIT); 125243783Srmacklem for (i = 0; i < mntlen; i++) { 126243783Srmacklem if (strcmp(mntbuf->f_fstypename, "nfs") == 0) { 127243783Srmacklem dumpmntopts.ndmnt_fname = 128243783Srmacklem mntbuf->f_mntonname; 129243783Srmacklem dumpmntopts.ndmnt_buf = buf; 130243783Srmacklem dumpmntopts.ndmnt_blen = sizeof(buf); 131243783Srmacklem if (nfssvc(NFSSVC_DUMPMNTOPTS, 132243783Srmacklem &dumpmntopts) >= 0) 133243783Srmacklem printf("%s on %s\n%s\n", 134243783Srmacklem mntbuf->f_mntfromname, 135243783Srmacklem mntbuf->f_mntonname, buf); 136251585Srmacklem else if (errno == EPERM) 137251585Srmacklem errx(1, "Only priviledged users" 138251585Srmacklem " can use the -m option"); 139243783Srmacklem } 140243783Srmacklem mntbuf++; 141243783Srmacklem } 142243783Srmacklem exit(0); 1431590Srgrimes case 'N': 1441590Srgrimes nlistf = optarg; 1451590Srgrimes break; 14652493Sdillon case 'W': 14752493Sdillon widemode = 1; 14852493Sdillon break; 1491590Srgrimes case 'w': 1501590Srgrimes interval = atoi(optarg); 1511590Srgrimes break; 15252493Sdillon case 'c': 15352493Sdillon clientOnly = 1; 15452493Sdillon if (serverOnly < 0) 15552493Sdillon serverOnly = 0; 15652493Sdillon break; 15752493Sdillon case 's': 15852493Sdillon serverOnly = 1; 15952493Sdillon if (clientOnly < 0) 16052493Sdillon clientOnly = 0; 16152493Sdillon break; 162172759Sjhb case 'z': 163172759Sjhb zflag = 1; 164172759Sjhb break; 165221455Srmacklem case 'o': 166221455Srmacklem if (extra_output != 0) 167221455Srmacklem err(1, "-o incompatible with -e"); 168221455Srmacklem run_v4 = 0; 169221455Srmacklem break; 170193258Srmacklem case 'e': 171221455Srmacklem if (run_v4 == 0) 172221455Srmacklem err(1, "-e incompatible with -o"); 173221455Srmacklem extra_output = 1; 174192762Srmacklem break; 1751590Srgrimes case '?': 1761590Srgrimes default: 1771590Srgrimes usage(); 1781590Srgrimes } 1791590Srgrimes argc -= optind; 1801590Srgrimes argv += optind; 1811590Srgrimes 1821590Srgrimes#define BACKWARD_COMPATIBILITY 1831590Srgrimes#ifdef BACKWARD_COMPATIBILITY 1841590Srgrimes if (*argv) { 1851590Srgrimes interval = atoi(*argv); 1861590Srgrimes if (*++argv) { 1871590Srgrimes nlistf = *argv; 1881590Srgrimes if (*++argv) 1891590Srgrimes memf = *argv; 1901590Srgrimes } 1911590Srgrimes } 1921590Srgrimes#endif 193192762Srmacklem if (run_v4 != 0 && modfind("nfscommon") < 0) 194221455Srmacklem errx(1, "new client/server not loaded"); 195192762Srmacklem 196221440Srmacklem if (run_v4 == 0 && (nlistf != NULL || memf != NULL)) { 1973819Swollman deadkernel = 1; 1981590Srgrimes 1993819Swollman if ((kd = kvm_openfiles(nlistf, memf, NULL, O_RDONLY, 2003819Swollman errbuf)) == 0) { 2013819Swollman errx(1, "kvm_openfiles: %s", errbuf); 2023819Swollman } 2033819Swollman if (kvm_nlist(kd, nl) != 0) { 2043819Swollman errx(1, "kvm_nlist: can't get names"); 2053819Swollman } 2061590Srgrimes } 2071590Srgrimes 208192762Srmacklem if (interval) { 209192762Srmacklem if (run_v4 > 0) 210192762Srmacklem exp_sidewaysintpr(interval, clientOnly, serverOnly); 211192762Srmacklem else 212192762Srmacklem sidewaysintpr(interval, clientOnly, serverOnly); 213192762Srmacklem } else { 214221455Srmacklem if (extra_output != 0) 215192762Srmacklem exp_intpr(clientOnly, serverOnly); 216192762Srmacklem else 217192762Srmacklem intpr(clientOnly, serverOnly); 218192762Srmacklem } 2191590Srgrimes exit(0); 2201590Srgrimes} 2211590Srgrimes 2221590Srgrimes/* 2233819Swollman * Read the nfs stats using sysctl(3) for live kernels, or kvm_read 2243819Swollman * for dead ones. 2253819Swollman */ 226194792Sdelphijstatic void 227172759Sjhbreadstats(struct nfsstats **stp, struct nfsrvstats **srvstp, int zero) 2283819Swollman{ 229172759Sjhb union { 230172759Sjhb struct nfsstats client; 231172759Sjhb struct nfsrvstats server; 232172759Sjhb } zerostat; 23383653Speter size_t buflen; 23483653Speter 23583653Speter if (deadkernel) { 236172759Sjhb if (*stp != NULL && kvm_read(kd, (u_long)nl[N_NFSSTAT].n_value, 237172759Sjhb *stp, sizeof(struct nfsstats)) < 0) { 23883653Speter *stp = NULL; 2393819Swollman } 240172759Sjhb if (*srvstp != NULL && kvm_read(kd, 241172759Sjhb (u_long)nl[N_NFSRVSTAT].n_value, *srvstp, 242172759Sjhb sizeof(struct nfsrvstats)) < 0) { 24383653Speter *srvstp = NULL; 24483653Speter } 2453819Swollman } else { 246172759Sjhb if (zero) 247172759Sjhb bzero(&zerostat, sizeof(zerostat)); 24883653Speter buflen = sizeof(struct nfsstats); 249221973Srmacklem if (*stp != NULL && sysctlbyname("vfs.oldnfs.nfsstats", *stp, 250172759Sjhb &buflen, zero ? &zerostat : NULL, zero ? buflen : 0) < 0) { 251172759Sjhb if (errno != ENOENT) 252221973Srmacklem err(1, "sysctl: vfs.oldnfs.nfsstats"); 25383653Speter *stp = NULL; 2543819Swollman } 25583653Speter buflen = sizeof(struct nfsrvstats); 256172759Sjhb if (*srvstp != NULL && sysctlbyname("vfs.nfsrv.nfsrvstats", 257172759Sjhb *srvstp, &buflen, zero ? &zerostat : NULL, 258172759Sjhb zero ? buflen : 0) < 0) { 259172759Sjhb if (errno != ENOENT) 260172759Sjhb err(1, "sysctl: vfs.nfsrv.nfsrvstats"); 26183653Speter *srvstp = NULL; 26283653Speter } 2633819Swollman } 2643819Swollman} 2653819Swollman 2663819Swollman/* 2671590Srgrimes * Print a description of the nfs stats. 2681590Srgrimes */ 2691590Srgrimesvoid 27052493Sdillonintpr(int clientOnly, int serverOnly) 2711590Srgrimes{ 27283653Speter struct nfsstats nfsstats, *nfsstatsp; 27383653Speter struct nfsrvstats nfsrvstats, *nfsrvstatsp; 274221455Srmacklem int nfssvc_flag; 2751590Srgrimes 276221455Srmacklem if (run_v4 == 0) { 277221455Srmacklem /* 278221455Srmacklem * Only read the stats we are going to display to avoid zeroing 279221455Srmacklem * stats the user didn't request. 280221455Srmacklem */ 281221455Srmacklem if (clientOnly) 282221455Srmacklem nfsstatsp = &nfsstats; 283221455Srmacklem else 284221455Srmacklem nfsstatsp = NULL; 285221455Srmacklem if (serverOnly) 286221455Srmacklem nfsrvstatsp = &nfsrvstats; 287221455Srmacklem else 288221455Srmacklem nfsrvstatsp = NULL; 289221455Srmacklem 290221455Srmacklem readstats(&nfsstatsp, &nfsrvstatsp, zflag); 291221455Srmacklem 292221455Srmacklem if (clientOnly && !nfsstatsp) { 293221455Srmacklem printf("Client not present!\n"); 294221455Srmacklem clientOnly = 0; 295221455Srmacklem } 296221455Srmacklem } else { 297221455Srmacklem nfssvc_flag = NFSSVC_GETSTATS; 298221455Srmacklem if (zflag != 0) { 299221455Srmacklem if (clientOnly != 0) 300221455Srmacklem nfssvc_flag |= NFSSVC_ZEROCLTSTATS; 301221455Srmacklem if (serverOnly != 0) 302221455Srmacklem nfssvc_flag |= NFSSVC_ZEROSRVSTATS; 303221455Srmacklem } 304221455Srmacklem if (nfssvc(nfssvc_flag, &ext_nfsstats) < 0) 305221455Srmacklem err(1, "Can't get stats"); 30683653Speter } 30752493Sdillon if (clientOnly) { 30852493Sdillon printf("Client Info:\n"); 30952493Sdillon printf("Rpc Counts:\n"); 31052493Sdillon printf("%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n", 31152493Sdillon "Getattr", "Setattr", "Lookup", "Readlink", "Read", 31252493Sdillon "Write", "Create", "Remove"); 313221455Srmacklem if (run_v4 == 0) 314221455Srmacklem printf("%9d %9d %9d %9d %9d %9d %9d %9d\n", 315221455Srmacklem nfsstats.rpccnt[NFSPROC_GETATTR], 316221455Srmacklem nfsstats.rpccnt[NFSPROC_SETATTR], 317221455Srmacklem nfsstats.rpccnt[NFSPROC_LOOKUP], 318221455Srmacklem nfsstats.rpccnt[NFSPROC_READLINK], 319221455Srmacklem nfsstats.rpccnt[NFSPROC_READ], 320221455Srmacklem nfsstats.rpccnt[NFSPROC_WRITE], 321221455Srmacklem nfsstats.rpccnt[NFSPROC_CREATE], 322221455Srmacklem nfsstats.rpccnt[NFSPROC_REMOVE]); 323221455Srmacklem else 324221455Srmacklem printf("%9d %9d %9d %9d %9d %9d %9d %9d\n", 325221455Srmacklem ext_nfsstats.rpccnt[NFSPROC_GETATTR], 326221455Srmacklem ext_nfsstats.rpccnt[NFSPROC_SETATTR], 327221455Srmacklem ext_nfsstats.rpccnt[NFSPROC_LOOKUP], 328221455Srmacklem ext_nfsstats.rpccnt[NFSPROC_READLINK], 329221455Srmacklem ext_nfsstats.rpccnt[NFSPROC_READ], 330221455Srmacklem ext_nfsstats.rpccnt[NFSPROC_WRITE], 331221455Srmacklem ext_nfsstats.rpccnt[NFSPROC_CREATE], 332221455Srmacklem ext_nfsstats.rpccnt[NFSPROC_REMOVE]); 33352493Sdillon printf("%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n", 33452493Sdillon "Rename", "Link", "Symlink", "Mkdir", "Rmdir", 33552493Sdillon "Readdir", "RdirPlus", "Access"); 336221455Srmacklem if (run_v4 == 0) 337221455Srmacklem printf("%9d %9d %9d %9d %9d %9d %9d %9d\n", 338221455Srmacklem nfsstats.rpccnt[NFSPROC_RENAME], 339221455Srmacklem nfsstats.rpccnt[NFSPROC_LINK], 340221455Srmacklem nfsstats.rpccnt[NFSPROC_SYMLINK], 341221455Srmacklem nfsstats.rpccnt[NFSPROC_MKDIR], 342221455Srmacklem nfsstats.rpccnt[NFSPROC_RMDIR], 343221455Srmacklem nfsstats.rpccnt[NFSPROC_READDIR], 344221455Srmacklem nfsstats.rpccnt[NFSPROC_READDIRPLUS], 345221455Srmacklem nfsstats.rpccnt[NFSPROC_ACCESS]); 346221455Srmacklem else 347221455Srmacklem printf("%9d %9d %9d %9d %9d %9d %9d %9d\n", 348221455Srmacklem ext_nfsstats.rpccnt[NFSPROC_RENAME], 349221455Srmacklem ext_nfsstats.rpccnt[NFSPROC_LINK], 350221455Srmacklem ext_nfsstats.rpccnt[NFSPROC_SYMLINK], 351221455Srmacklem ext_nfsstats.rpccnt[NFSPROC_MKDIR], 352221455Srmacklem ext_nfsstats.rpccnt[NFSPROC_RMDIR], 353221455Srmacklem ext_nfsstats.rpccnt[NFSPROC_READDIR], 354221455Srmacklem ext_nfsstats.rpccnt[NFSPROC_READDIRPLUS], 355221455Srmacklem ext_nfsstats.rpccnt[NFSPROC_ACCESS]); 35683653Speter printf("%9.9s %9.9s %9.9s %9.9s %9.9s\n", 35783653Speter "Mknod", "Fsstat", "Fsinfo", "PathConf", "Commit"); 358221455Srmacklem if (run_v4 == 0) 359221455Srmacklem printf("%9d %9d %9d %9d %9d\n", 360221455Srmacklem nfsstats.rpccnt[NFSPROC_MKNOD], 361221455Srmacklem nfsstats.rpccnt[NFSPROC_FSSTAT], 362221455Srmacklem nfsstats.rpccnt[NFSPROC_FSINFO], 363221455Srmacklem nfsstats.rpccnt[NFSPROC_PATHCONF], 364221455Srmacklem nfsstats.rpccnt[NFSPROC_COMMIT]); 365221455Srmacklem else 366221455Srmacklem printf("%9d %9d %9d %9d %9d\n", 367221455Srmacklem ext_nfsstats.rpccnt[NFSPROC_MKNOD], 368221455Srmacklem ext_nfsstats.rpccnt[NFSPROC_FSSTAT], 369221455Srmacklem ext_nfsstats.rpccnt[NFSPROC_FSINFO], 370221455Srmacklem ext_nfsstats.rpccnt[NFSPROC_PATHCONF], 371221455Srmacklem ext_nfsstats.rpccnt[NFSPROC_COMMIT]); 37252493Sdillon printf("Rpc Info:\n"); 37352493Sdillon printf("%9.9s %9.9s %9.9s %9.9s %9.9s\n", 37452493Sdillon "TimedOut", "Invalid", "X Replies", "Retries", 37552493Sdillon "Requests"); 376221455Srmacklem if (run_v4 == 0) 377221455Srmacklem printf("%9d %9d %9d %9d %9d\n", 378221455Srmacklem nfsstats.rpctimeouts, 379221455Srmacklem nfsstats.rpcinvalid, 380221455Srmacklem nfsstats.rpcunexpected, 381221455Srmacklem nfsstats.rpcretries, 382221455Srmacklem nfsstats.rpcrequests); 383221455Srmacklem else 384221455Srmacklem printf("%9d %9d %9d %9d %9d\n", 385221455Srmacklem ext_nfsstats.rpctimeouts, 386221455Srmacklem ext_nfsstats.rpcinvalid, 387221455Srmacklem ext_nfsstats.rpcunexpected, 388221455Srmacklem ext_nfsstats.rpcretries, 389221455Srmacklem ext_nfsstats.rpcrequests); 39052493Sdillon printf("Cache Info:\n"); 39152493Sdillon printf("%9.9s %9.9s %9.9s %9.9s", 39252493Sdillon "Attr Hits", "Misses", "Lkup Hits", "Misses"); 39352493Sdillon printf(" %9.9s %9.9s %9.9s %9.9s\n", 39452493Sdillon "BioR Hits", "Misses", "BioW Hits", "Misses"); 395221455Srmacklem if (run_v4 == 0) { 396221455Srmacklem printf("%9d %9d %9d %9d", 397221455Srmacklem nfsstats.attrcache_hits, 398221455Srmacklem nfsstats.attrcache_misses, 399221455Srmacklem nfsstats.lookupcache_hits, 400221455Srmacklem nfsstats.lookupcache_misses); 401221455Srmacklem printf(" %9d %9d %9d %9d\n", 402221455Srmacklem nfsstats.biocache_reads-nfsstats.read_bios, 403221455Srmacklem nfsstats.read_bios, 404221455Srmacklem nfsstats.biocache_writes-nfsstats.write_bios, 405221455Srmacklem nfsstats.write_bios); 406221455Srmacklem } else { 407221455Srmacklem printf("%9d %9d %9d %9d", 408221455Srmacklem ext_nfsstats.attrcache_hits, 409221455Srmacklem ext_nfsstats.attrcache_misses, 410221455Srmacklem ext_nfsstats.lookupcache_hits, 411221455Srmacklem ext_nfsstats.lookupcache_misses); 412221455Srmacklem printf(" %9d %9d %9d %9d\n", 413221455Srmacklem ext_nfsstats.biocache_reads - 414221455Srmacklem ext_nfsstats.read_bios, 415221455Srmacklem ext_nfsstats.read_bios, 416221455Srmacklem ext_nfsstats.biocache_writes - 417221455Srmacklem ext_nfsstats.write_bios, 418221455Srmacklem ext_nfsstats.write_bios); 419221455Srmacklem } 42052493Sdillon printf("%9.9s %9.9s %9.9s %9.9s", 42152493Sdillon "BioRLHits", "Misses", "BioD Hits", "Misses"); 422220596Sru printf(" %9.9s %9.9s %9.9s %9.9s\n", "DirE Hits", "Misses", "Accs Hits", "Misses"); 423221455Srmacklem if (run_v4 == 0) { 424221455Srmacklem printf("%9d %9d %9d %9d", 425221455Srmacklem nfsstats.biocache_readlinks - 426221455Srmacklem nfsstats.readlink_bios, 427221455Srmacklem nfsstats.readlink_bios, 428221455Srmacklem nfsstats.biocache_readdirs - 429221455Srmacklem nfsstats.readdir_bios, 430221455Srmacklem nfsstats.readdir_bios); 431221455Srmacklem printf(" %9d %9d %9d %9d\n", 432221455Srmacklem nfsstats.direofcache_hits, 433221455Srmacklem nfsstats.direofcache_misses, 434221455Srmacklem nfsstats.accesscache_hits, 435221455Srmacklem nfsstats.accesscache_misses); 436221455Srmacklem } else { 437221455Srmacklem printf("%9d %9d %9d %9d", 438221455Srmacklem ext_nfsstats.biocache_readlinks - 439221455Srmacklem ext_nfsstats.readlink_bios, 440221455Srmacklem ext_nfsstats.readlink_bios, 441221455Srmacklem ext_nfsstats.biocache_readdirs - 442221455Srmacklem ext_nfsstats.readdir_bios, 443221455Srmacklem ext_nfsstats.readdir_bios); 444221455Srmacklem printf(" %9d %9d %9d %9d\n", 445221455Srmacklem ext_nfsstats.direofcache_hits, 446221455Srmacklem ext_nfsstats.direofcache_misses, 447221455Srmacklem ext_nfsstats.accesscache_hits, 448221455Srmacklem ext_nfsstats.accesscache_misses); 449221455Srmacklem } 45052493Sdillon } 451221455Srmacklem if (run_v4 == 0 && serverOnly && !nfsrvstatsp) { 45283653Speter printf("Server not present!\n"); 45383653Speter serverOnly = 0; 45483653Speter } 45552493Sdillon if (serverOnly) { 45652493Sdillon printf("\nServer Info:\n"); 45752493Sdillon printf("%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n", 45852493Sdillon "Getattr", "Setattr", "Lookup", "Readlink", "Read", 45952493Sdillon "Write", "Create", "Remove"); 460221455Srmacklem if (run_v4 == 0) 461221455Srmacklem printf("%9d %9d %9d %9d %9d %9d %9d %9d\n", 462221455Srmacklem nfsrvstats.srvrpccnt[NFSPROC_GETATTR], 463221455Srmacklem nfsrvstats.srvrpccnt[NFSPROC_SETATTR], 464221455Srmacklem nfsrvstats.srvrpccnt[NFSPROC_LOOKUP], 465221455Srmacklem nfsrvstats.srvrpccnt[NFSPROC_READLINK], 466221455Srmacklem nfsrvstats.srvrpccnt[NFSPROC_READ], 467221455Srmacklem nfsrvstats.srvrpccnt[NFSPROC_WRITE], 468221455Srmacklem nfsrvstats.srvrpccnt[NFSPROC_CREATE], 469221455Srmacklem nfsrvstats.srvrpccnt[NFSPROC_REMOVE]); 470221455Srmacklem else 471221455Srmacklem printf("%9d %9d %9d %9d %9d %9d %9d %9d\n", 472225113Srmacklem ext_nfsstats.srvrpccnt[NFSV4OP_GETATTR], 473225113Srmacklem ext_nfsstats.srvrpccnt[NFSV4OP_SETATTR], 474225113Srmacklem ext_nfsstats.srvrpccnt[NFSV4OP_LOOKUP], 475225113Srmacklem ext_nfsstats.srvrpccnt[NFSV4OP_READLINK], 476225113Srmacklem ext_nfsstats.srvrpccnt[NFSV4OP_READ], 477225113Srmacklem ext_nfsstats.srvrpccnt[NFSV4OP_WRITE], 478225113Srmacklem ext_nfsstats.srvrpccnt[NFSV4OP_CREATE], 479225113Srmacklem ext_nfsstats.srvrpccnt[NFSV4OP_REMOVE]); 48052493Sdillon printf("%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n", 48152493Sdillon "Rename", "Link", "Symlink", "Mkdir", "Rmdir", 48252493Sdillon "Readdir", "RdirPlus", "Access"); 483221455Srmacklem if (run_v4 == 0) 484221455Srmacklem printf("%9d %9d %9d %9d %9d %9d %9d %9d\n", 485221455Srmacklem nfsrvstats.srvrpccnt[NFSPROC_RENAME], 486221455Srmacklem nfsrvstats.srvrpccnt[NFSPROC_LINK], 487221455Srmacklem nfsrvstats.srvrpccnt[NFSPROC_SYMLINK], 488221455Srmacklem nfsrvstats.srvrpccnt[NFSPROC_MKDIR], 489221455Srmacklem nfsrvstats.srvrpccnt[NFSPROC_RMDIR], 490221455Srmacklem nfsrvstats.srvrpccnt[NFSPROC_READDIR], 491221455Srmacklem nfsrvstats.srvrpccnt[NFSPROC_READDIRPLUS], 492221455Srmacklem nfsrvstats.srvrpccnt[NFSPROC_ACCESS]); 493221455Srmacklem else 494221455Srmacklem printf("%9d %9d %9d %9d %9d %9d %9d %9d\n", 495225113Srmacklem ext_nfsstats.srvrpccnt[NFSV4OP_RENAME], 496225113Srmacklem ext_nfsstats.srvrpccnt[NFSV4OP_LINK], 497225113Srmacklem ext_nfsstats.srvrpccnt[NFSV4OP_SYMLINK], 498225113Srmacklem ext_nfsstats.srvrpccnt[NFSV4OP_MKDIR], 499225113Srmacklem ext_nfsstats.srvrpccnt[NFSV4OP_RMDIR], 500225113Srmacklem ext_nfsstats.srvrpccnt[NFSV4OP_READDIR], 501225113Srmacklem ext_nfsstats.srvrpccnt[NFSV4OP_READDIRPLUS], 502225113Srmacklem ext_nfsstats.srvrpccnt[NFSV4OP_ACCESS]); 50383653Speter printf("%9.9s %9.9s %9.9s %9.9s %9.9s\n", 50483653Speter "Mknod", "Fsstat", "Fsinfo", "PathConf", "Commit"); 505221455Srmacklem if (run_v4 == 0) 506221455Srmacklem printf("%9d %9d %9d %9d %9d\n", 507221455Srmacklem nfsrvstats.srvrpccnt[NFSPROC_MKNOD], 508221455Srmacklem nfsrvstats.srvrpccnt[NFSPROC_FSSTAT], 509221455Srmacklem nfsrvstats.srvrpccnt[NFSPROC_FSINFO], 510221455Srmacklem nfsrvstats.srvrpccnt[NFSPROC_PATHCONF], 511221455Srmacklem nfsrvstats.srvrpccnt[NFSPROC_COMMIT]); 512221455Srmacklem else 513221455Srmacklem printf("%9d %9d %9d %9d %9d\n", 514225113Srmacklem ext_nfsstats.srvrpccnt[NFSV4OP_MKNOD], 515225113Srmacklem ext_nfsstats.srvrpccnt[NFSV4OP_FSSTAT], 516225113Srmacklem ext_nfsstats.srvrpccnt[NFSV4OP_FSINFO], 517225113Srmacklem ext_nfsstats.srvrpccnt[NFSV4OP_PATHCONF], 518225113Srmacklem ext_nfsstats.srvrpccnt[NFSV4OP_COMMIT]); 51952493Sdillon printf("Server Ret-Failed\n"); 520221455Srmacklem if (run_v4 == 0) 521221455Srmacklem printf("%17d\n", nfsrvstats.srvrpc_errs); 522221455Srmacklem else 523221455Srmacklem printf("%17d\n", ext_nfsstats.srvrpc_errs); 52452493Sdillon printf("Server Faults\n"); 525221455Srmacklem if (run_v4 == 0) 526221455Srmacklem printf("%13d\n", nfsrvstats.srv_errs); 527221455Srmacklem else 528221455Srmacklem printf("%13d\n", ext_nfsstats.srv_errs); 52952493Sdillon printf("Server Cache Stats:\n"); 53052493Sdillon printf("%9.9s %9.9s %9.9s %9.9s\n", 53152493Sdillon "Inprog", "Idem", "Non-idem", "Misses"); 532221455Srmacklem if (run_v4 == 0) 533221455Srmacklem printf("%9d %9d %9d %9d\n", 534221455Srmacklem nfsrvstats.srvcache_inproghits, 535221455Srmacklem nfsrvstats.srvcache_idemdonehits, 536221455Srmacklem nfsrvstats.srvcache_nonidemdonehits, 537221455Srmacklem nfsrvstats.srvcache_misses); 538221455Srmacklem else 539221455Srmacklem printf("%9d %9d %9d %9d\n", 540221455Srmacklem ext_nfsstats.srvcache_inproghits, 541221455Srmacklem ext_nfsstats.srvcache_idemdonehits, 542221455Srmacklem ext_nfsstats.srvcache_nonidemdonehits, 543221455Srmacklem ext_nfsstats.srvcache_misses); 54452493Sdillon printf("Server Write Gathering:\n"); 54552493Sdillon printf("%9.9s %9.9s %9.9s\n", 54652493Sdillon "WriteOps", "WriteRPC", "Opsaved"); 547221455Srmacklem if (run_v4 == 0) 548221455Srmacklem printf("%9d %9d %9d\n", 549221455Srmacklem nfsrvstats.srvvop_writes, 550221455Srmacklem nfsrvstats.srvrpccnt[NFSPROC_WRITE], 551221455Srmacklem nfsrvstats.srvrpccnt[NFSPROC_WRITE] - 552221455Srmacklem nfsrvstats.srvvop_writes); 553221455Srmacklem else 554221455Srmacklem /* 555221455Srmacklem * The new client doesn't do write gathering. It was 556221455Srmacklem * only useful for NFSv2. 557221455Srmacklem */ 558221455Srmacklem printf("%9d %9d %9d\n", 559225113Srmacklem ext_nfsstats.srvrpccnt[NFSV4OP_WRITE], 560225113Srmacklem ext_nfsstats.srvrpccnt[NFSV4OP_WRITE], 0); 56152493Sdillon } 5621590Srgrimes} 5631590Srgrimes 5641590Srgrimesu_char signalled; /* set if alarm goes off "early" */ 5651590Srgrimes 5661590Srgrimes/* 5671590Srgrimes * Print a running summary of nfs statistics. 5681590Srgrimes * Repeat display every interval seconds, showing statistics 5691590Srgrimes * collected over that interval. Assumes that interval is non-zero. 5701590Srgrimes * First line printed at top of screen is always cumulative. 5711590Srgrimes */ 5721590Srgrimesvoid 57352493Sdillonsidewaysintpr(u_int interval, int clientOnly, int serverOnly) 5741590Srgrimes{ 57583653Speter struct nfsstats nfsstats, lastst, *nfsstatsp; 57683653Speter struct nfsrvstats nfsrvstats, lastsrvst, *nfsrvstatsp; 57752493Sdillon int hdrcnt = 1; 5781590Srgrimes 57983653Speter nfsstatsp = &lastst; 58083653Speter nfsrvstatsp = &lastsrvst; 581172759Sjhb readstats(&nfsstatsp, &nfsrvstatsp, 0); 58283653Speter if (clientOnly && !nfsstatsp) { 58383653Speter printf("Client not present!\n"); 58483653Speter clientOnly = 0; 58583653Speter } 58683653Speter if (serverOnly && !nfsrvstatsp) { 58783653Speter printf("Server not present!\n"); 58883653Speter serverOnly = 0; 58983653Speter } 59052493Sdillon sleep(interval); 5911590Srgrimes 59252493Sdillon for (;;) { 59383653Speter nfsstatsp = &nfsstats; 59483653Speter nfsrvstatsp = &nfsrvstats; 595172759Sjhb readstats(&nfsstatsp, &nfsrvstatsp, 0); 59652493Sdillon 59752493Sdillon if (--hdrcnt == 0) { 59852493Sdillon printhdr(clientOnly, serverOnly); 59952493Sdillon if (clientOnly && serverOnly) 60052493Sdillon hdrcnt = 10; 60152493Sdillon else 60252493Sdillon hdrcnt = 20; 6031590Srgrimes } 60452493Sdillon if (clientOnly) { 60552493Sdillon printf("%s %6d %6d %6d %6d %6d %6d %6d %6d", 60652493Sdillon ((clientOnly && serverOnly) ? "Client:" : ""), 60752493Sdillon DELTA(attrcache_hits) + DELTA(attrcache_misses), 60852493Sdillon DELTA(lookupcache_hits) + DELTA(lookupcache_misses), 60952493Sdillon DELTA(biocache_readlinks), 61052493Sdillon DELTA(biocache_reads), 61152493Sdillon DELTA(biocache_writes), 61252493Sdillon nfsstats.rpccnt[NFSPROC_RENAME]-lastst.rpccnt[NFSPROC_RENAME], 61352493Sdillon DELTA(accesscache_hits) + DELTA(accesscache_misses), 61452493Sdillon DELTA(biocache_readdirs) 61552493Sdillon ); 61652493Sdillon if (widemode) { 61752493Sdillon printf(" %s %s %s %s %s %s", 61852493Sdillon sperc1(DELTA(attrcache_hits), 61952493Sdillon DELTA(attrcache_misses)), 62052493Sdillon sperc1(DELTA(lookupcache_hits), 62152493Sdillon DELTA(lookupcache_misses)), 62252493Sdillon sperc2(DELTA(biocache_reads), 62352493Sdillon DELTA(read_bios)), 62452493Sdillon sperc2(DELTA(biocache_writes), 62552493Sdillon DELTA(write_bios)), 62652493Sdillon sperc1(DELTA(accesscache_hits), 62752493Sdillon DELTA(accesscache_misses)), 62852493Sdillon sperc2(DELTA(biocache_readdirs), 62952493Sdillon DELTA(readdir_bios)) 63052493Sdillon ); 63152493Sdillon } 63252493Sdillon printf("\n"); 63383653Speter lastst = nfsstats; 63452493Sdillon } 63552493Sdillon if (serverOnly) { 63652493Sdillon printf("%s %6d %6d %6d %6d %6d %6d %6d %6d", 63752493Sdillon ((clientOnly && serverOnly) ? "Server:" : ""), 63883653Speter nfsrvstats.srvrpccnt[NFSPROC_GETATTR]-lastsrvst.srvrpccnt[NFSPROC_GETATTR], 63983653Speter nfsrvstats.srvrpccnt[NFSPROC_LOOKUP]-lastsrvst.srvrpccnt[NFSPROC_LOOKUP], 64083653Speter nfsrvstats.srvrpccnt[NFSPROC_READLINK]-lastsrvst.srvrpccnt[NFSPROC_READLINK], 64183653Speter nfsrvstats.srvrpccnt[NFSPROC_READ]-lastsrvst.srvrpccnt[NFSPROC_READ], 64283653Speter nfsrvstats.srvrpccnt[NFSPROC_WRITE]-lastsrvst.srvrpccnt[NFSPROC_WRITE], 64383653Speter nfsrvstats.srvrpccnt[NFSPROC_RENAME]-lastsrvst.srvrpccnt[NFSPROC_RENAME], 64483653Speter nfsrvstats.srvrpccnt[NFSPROC_ACCESS]-lastsrvst.srvrpccnt[NFSPROC_ACCESS], 64583653Speter (nfsrvstats.srvrpccnt[NFSPROC_READDIR]-lastsrvst.srvrpccnt[NFSPROC_READDIR]) 64683653Speter +(nfsrvstats.srvrpccnt[NFSPROC_READDIRPLUS]-lastsrvst.srvrpccnt[NFSPROC_READDIRPLUS])); 64752493Sdillon printf("\n"); 64883653Speter lastsrvst = nfsrvstats; 64952493Sdillon } 6501590Srgrimes fflush(stdout); 65152493Sdillon sleep(interval); 6521590Srgrimes } 6531590Srgrimes /*NOTREACHED*/ 6541590Srgrimes} 6551590Srgrimes 6561590Srgrimesvoid 65752493Sdillonprinthdr(int clientOnly, int serverOnly) 6581590Srgrimes{ 65952493Sdillon printf("%s%6.6s %6.6s %6.6s %6.6s %6.6s %6.6s %6.6s %6.6s", 66052493Sdillon ((serverOnly && clientOnly) ? " " : " "), 66152493Sdillon "GtAttr", "Lookup", "Rdlink", "Read", "Write", "Rename", 66252493Sdillon "Access", "Rddir"); 66352493Sdillon if (widemode && clientOnly) { 66452493Sdillon printf(" Attr Lkup BioR BioW Accs BioD"); 66552493Sdillon } 66652493Sdillon printf("\n"); 6671590Srgrimes fflush(stdout); 6681590Srgrimes} 6691590Srgrimes 6701590Srgrimesvoid 671172759Sjhbusage(void) 6721590Srgrimes{ 6731590Srgrimes (void)fprintf(stderr, 674243783Srmacklem "usage: nfsstat [-cemoszW] [-M core] [-N system] [-w wait]\n"); 6751590Srgrimes exit(1); 6761590Srgrimes} 67752493Sdillon 67852493Sdillonstatic char SPBuf[64][8]; 67952493Sdillonstatic int SPIndex; 68052493Sdillon 68152493Sdillonchar * 68252493Sdillonsperc1(int hits, int misses) 68352493Sdillon{ 68452493Sdillon char *p = SPBuf[SPIndex]; 68552493Sdillon 68652493Sdillon if (hits + misses) { 68752493Sdillon sprintf(p, "%3d%%", 68852493Sdillon (int)(char)((quad_t)hits * 100 / (hits + misses))); 68952493Sdillon } else { 69052493Sdillon sprintf(p, " -"); 69152493Sdillon } 69252493Sdillon SPIndex = (SPIndex + 1) & 63; 69352493Sdillon return(p); 69452493Sdillon} 69552493Sdillon 69652493Sdillonchar * 69752493Sdillonsperc2(int ttl, int misses) 69852493Sdillon{ 69952493Sdillon char *p = SPBuf[SPIndex]; 70052493Sdillon 70152493Sdillon if (ttl) { 70252493Sdillon sprintf(p, "%3d%%", 70352493Sdillon (int)(char)((quad_t)(ttl - misses) * 100 / ttl)); 70452493Sdillon } else { 70552493Sdillon sprintf(p, " -"); 70652493Sdillon } 70752493Sdillon SPIndex = (SPIndex + 1) & 63; 70852493Sdillon return(p); 70952493Sdillon} 71052493Sdillon 711192762Srmacklem/* 712192762Srmacklem * Print a description of the nfs stats for the experimental client/server. 713192762Srmacklem */ 714192762Srmacklemvoid 715192762Srmacklemexp_intpr(int clientOnly, int serverOnly) 716192762Srmacklem{ 717221440Srmacklem int nfssvc_flag; 718192762Srmacklem 719221440Srmacklem nfssvc_flag = NFSSVC_GETSTATS; 720221440Srmacklem if (zflag != 0) { 721221440Srmacklem if (clientOnly != 0) 722221440Srmacklem nfssvc_flag |= NFSSVC_ZEROCLTSTATS; 723221440Srmacklem if (serverOnly != 0) 724221440Srmacklem nfssvc_flag |= NFSSVC_ZEROSRVSTATS; 725221440Srmacklem } 726221440Srmacklem if (nfssvc(nfssvc_flag, &ext_nfsstats) < 0) 727221440Srmacklem err(1, "Can't get stats"); 728192762Srmacklem if (clientOnly != 0) { 729192762Srmacklem if (printtitle) { 730192762Srmacklem printf("Client Info:\n"); 731192762Srmacklem printf("Rpc Counts:\n"); 732192762Srmacklem printf( 733192762Srmacklem "%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n" 734192762Srmacklem , "Getattr", "Setattr", "Lookup", "Readlink", 735192762Srmacklem "Read", "Write", "Create", "Remove"); 736192762Srmacklem } 737192762Srmacklem printf("%9d %9d %9d %9d %9d %9d %9d %9d\n", 738192762Srmacklem ext_nfsstats.rpccnt[NFSPROC_GETATTR], 739192762Srmacklem ext_nfsstats.rpccnt[NFSPROC_SETATTR], 740192762Srmacklem ext_nfsstats.rpccnt[NFSPROC_LOOKUP], 741192762Srmacklem ext_nfsstats.rpccnt[NFSPROC_READLINK], 742192762Srmacklem ext_nfsstats.rpccnt[NFSPROC_READ], 743192762Srmacklem ext_nfsstats.rpccnt[NFSPROC_WRITE], 744192762Srmacklem ext_nfsstats.rpccnt[NFSPROC_CREATE], 745192762Srmacklem ext_nfsstats.rpccnt[NFSPROC_REMOVE]); 746192762Srmacklem if (printtitle) 747192762Srmacklem printf( 748192762Srmacklem "%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n" 749192762Srmacklem , "Rename", "Link", "Symlink", "Mkdir", "Rmdir", 750192762Srmacklem "Readdir", "RdirPlus", "Access"); 751192762Srmacklem printf("%9d %9d %9d %9d %9d %9d %9d %9d\n", 752192762Srmacklem ext_nfsstats.rpccnt[NFSPROC_RENAME], 753192762Srmacklem ext_nfsstats.rpccnt[NFSPROC_LINK], 754192762Srmacklem ext_nfsstats.rpccnt[NFSPROC_SYMLINK], 755192762Srmacklem ext_nfsstats.rpccnt[NFSPROC_MKDIR], 756192762Srmacklem ext_nfsstats.rpccnt[NFSPROC_RMDIR], 757192762Srmacklem ext_nfsstats.rpccnt[NFSPROC_READDIR], 758192762Srmacklem ext_nfsstats.rpccnt[NFSPROC_READDIRPLUS], 759192762Srmacklem ext_nfsstats.rpccnt[NFSPROC_ACCESS]); 760192762Srmacklem if (printtitle) 761192762Srmacklem printf( 762192762Srmacklem "%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n" 763192762Srmacklem , "Mknod", "Fsstat", "Fsinfo", "PathConf", 764192762Srmacklem "Commit", "SetClId", "SetClIdCf", "Lock"); 765192762Srmacklem printf("%9d %9d %9d %9d %9d %9d %9d %9d\n", 766192762Srmacklem ext_nfsstats.rpccnt[NFSPROC_MKNOD], 767192762Srmacklem ext_nfsstats.rpccnt[NFSPROC_FSSTAT], 768192762Srmacklem ext_nfsstats.rpccnt[NFSPROC_FSINFO], 769192762Srmacklem ext_nfsstats.rpccnt[NFSPROC_PATHCONF], 770192762Srmacklem ext_nfsstats.rpccnt[NFSPROC_COMMIT], 771192762Srmacklem ext_nfsstats.rpccnt[NFSPROC_SETCLIENTID], 772192762Srmacklem ext_nfsstats.rpccnt[NFSPROC_SETCLIENTIDCFRM], 773192762Srmacklem ext_nfsstats.rpccnt[NFSPROC_LOCK]); 774192762Srmacklem if (printtitle) 775192762Srmacklem printf("%9.9s %9.9s %9.9s %9.9s\n", 776192762Srmacklem "LockT", "LockU", "Open", "OpenCfr"); 777192762Srmacklem printf("%9d %9d %9d %9d\n", 778192762Srmacklem ext_nfsstats.rpccnt[NFSPROC_LOCKT], 779192762Srmacklem ext_nfsstats.rpccnt[NFSPROC_LOCKU], 780192762Srmacklem ext_nfsstats.rpccnt[NFSPROC_OPEN], 781192762Srmacklem ext_nfsstats.rpccnt[NFSPROC_OPENCONFIRM]); 782192762Srmacklem if (printtitle) 783192762Srmacklem printf( 784192762Srmacklem "%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n" 785192762Srmacklem , "OpenOwner", "Opens", "LockOwner", 786192762Srmacklem "Locks", "Delegs", "LocalOwn", 787192762Srmacklem "LocalOpen", "LocalLOwn"); 788192762Srmacklem printf("%9d %9d %9d %9d %9d %9d %9d %9d\n", 789192762Srmacklem ext_nfsstats.clopenowners, 790192762Srmacklem ext_nfsstats.clopens, 791192762Srmacklem ext_nfsstats.cllockowners, 792192762Srmacklem ext_nfsstats.cllocks, 793192762Srmacklem ext_nfsstats.cldelegates, 794192762Srmacklem ext_nfsstats.cllocalopenowners, 795192762Srmacklem ext_nfsstats.cllocalopens, 796192762Srmacklem ext_nfsstats.cllocallockowners); 797192762Srmacklem if (printtitle) 798192762Srmacklem printf("%9.9s\n", "LocalLock"); 799192762Srmacklem printf("%9d\n", ext_nfsstats.cllocallocks); 800192762Srmacklem if (printtitle) { 801192762Srmacklem printf("Rpc Info:\n"); 802192762Srmacklem printf("%9.9s %9.9s %9.9s %9.9s %9.9s\n", 803192762Srmacklem "TimedOut", "Invalid", "X Replies", "Retries", 804192762Srmacklem "Requests"); 805192762Srmacklem } 806192762Srmacklem printf("%9d %9d %9d %9d %9d\n", 807192762Srmacklem ext_nfsstats.rpctimeouts, 808192762Srmacklem ext_nfsstats.rpcinvalid, 809192762Srmacklem ext_nfsstats.rpcunexpected, 810192762Srmacklem ext_nfsstats.rpcretries, 811192762Srmacklem ext_nfsstats.rpcrequests); 812192762Srmacklem if (printtitle) { 813192762Srmacklem printf("Cache Info:\n"); 814192762Srmacklem printf("%9.9s %9.9s %9.9s %9.9s", 815192762Srmacklem "Attr Hits", "Misses", "Lkup Hits", "Misses"); 816192762Srmacklem printf(" %9.9s %9.9s %9.9s %9.9s\n", 817192762Srmacklem "BioR Hits", "Misses", "BioW Hits", "Misses"); 818192762Srmacklem } 819192762Srmacklem printf("%9d %9d %9d %9d", 820192762Srmacklem ext_nfsstats.attrcache_hits, 821192762Srmacklem ext_nfsstats.attrcache_misses, 822192762Srmacklem ext_nfsstats.lookupcache_hits, 823192762Srmacklem ext_nfsstats.lookupcache_misses); 824192762Srmacklem printf(" %9d %9d %9d %9d\n", 825221454Srmacklem ext_nfsstats.biocache_reads - ext_nfsstats.read_bios, 826192762Srmacklem ext_nfsstats.read_bios, 827221454Srmacklem ext_nfsstats.biocache_writes - ext_nfsstats.write_bios, 828192762Srmacklem ext_nfsstats.write_bios); 829192762Srmacklem if (printtitle) { 830192762Srmacklem printf("%9.9s %9.9s %9.9s %9.9s", 831192762Srmacklem "BioRLHits", "Misses", "BioD Hits", "Misses"); 832192762Srmacklem printf(" %9.9s %9.9s\n", "DirE Hits", "Misses"); 833192762Srmacklem } 834192762Srmacklem printf("%9d %9d %9d %9d", 835221454Srmacklem ext_nfsstats.biocache_readlinks - 836192762Srmacklem ext_nfsstats.readlink_bios, 837221454Srmacklem ext_nfsstats.readlink_bios, 838221454Srmacklem ext_nfsstats.biocache_readdirs - 839221454Srmacklem ext_nfsstats.readdir_bios, 840192762Srmacklem ext_nfsstats.readdir_bios); 841192762Srmacklem printf(" %9d %9d\n", 842192762Srmacklem ext_nfsstats.direofcache_hits, 843192762Srmacklem ext_nfsstats.direofcache_misses); 844192762Srmacklem } 845192762Srmacklem if (serverOnly != 0) { 846192762Srmacklem if (printtitle) { 847192762Srmacklem printf("\nServer Info:\n"); 848192762Srmacklem printf( 849192762Srmacklem "%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n" 850192762Srmacklem , "Getattr", "Setattr", "Lookup", "Readlink", 851192762Srmacklem "Read", "Write", "Create", "Remove"); 852192762Srmacklem } 853192762Srmacklem printf("%9d %9d %9d %9d %9d %9d %9d %9d\n", 854192762Srmacklem ext_nfsstats.srvrpccnt[NFSV4OP_GETATTR], 855192762Srmacklem ext_nfsstats.srvrpccnt[NFSV4OP_SETATTR], 856192762Srmacklem ext_nfsstats.srvrpccnt[NFSV4OP_LOOKUP], 857192762Srmacklem ext_nfsstats.srvrpccnt[NFSV4OP_READLINK], 858192762Srmacklem ext_nfsstats.srvrpccnt[NFSV4OP_READ], 859192762Srmacklem ext_nfsstats.srvrpccnt[NFSV4OP_WRITE], 860192762Srmacklem ext_nfsstats.srvrpccnt[NFSV4OP_V3CREATE], 861192762Srmacklem ext_nfsstats.srvrpccnt[NFSV4OP_REMOVE]); 862192762Srmacklem if (printtitle) 863192762Srmacklem printf( 864192762Srmacklem "%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n" 865192762Srmacklem , "Rename", "Link", "Symlink", "Mkdir", "Rmdir", 866192762Srmacklem "Readdir", "RdirPlus", "Access"); 867192762Srmacklem printf("%9d %9d %9d %9d %9d %9d %9d %9d\n", 868192762Srmacklem ext_nfsstats.srvrpccnt[NFSV4OP_RENAME], 869192762Srmacklem ext_nfsstats.srvrpccnt[NFSV4OP_LINK], 870192762Srmacklem ext_nfsstats.srvrpccnt[NFSV4OP_SYMLINK], 871192762Srmacklem ext_nfsstats.srvrpccnt[NFSV4OP_MKDIR], 872192762Srmacklem ext_nfsstats.srvrpccnt[NFSV4OP_RMDIR], 873192762Srmacklem ext_nfsstats.srvrpccnt[NFSV4OP_READDIR], 874192762Srmacklem ext_nfsstats.srvrpccnt[NFSV4OP_READDIRPLUS], 875192762Srmacklem ext_nfsstats.srvrpccnt[NFSV4OP_ACCESS]); 876192762Srmacklem if (printtitle) 877192762Srmacklem printf( 878192762Srmacklem "%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n" 879192762Srmacklem , "Mknod", "Fsstat", "Fsinfo", "PathConf", 880192762Srmacklem "Commit", "LookupP", "SetClId", "SetClIdCf"); 881192762Srmacklem printf("%9d %9d %9d %9d %9d %9d %9d %9d\n", 882192762Srmacklem ext_nfsstats.srvrpccnt[NFSV4OP_MKNOD], 883192762Srmacklem ext_nfsstats.srvrpccnt[NFSV4OP_FSSTAT], 884192762Srmacklem ext_nfsstats.srvrpccnt[NFSV4OP_FSINFO], 885192762Srmacklem ext_nfsstats.srvrpccnt[NFSV4OP_PATHCONF], 886192762Srmacklem ext_nfsstats.srvrpccnt[NFSV4OP_COMMIT], 887192762Srmacklem ext_nfsstats.srvrpccnt[NFSV4OP_LOOKUPP], 888192762Srmacklem ext_nfsstats.srvrpccnt[NFSV4OP_SETCLIENTID], 889192762Srmacklem ext_nfsstats.srvrpccnt[NFSV4OP_SETCLIENTIDCFRM]); 890192762Srmacklem if (printtitle) 891192762Srmacklem printf( 892192762Srmacklem "%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n" 893192762Srmacklem , "Open", "OpenAttr", "OpenDwnGr", "OpenCfrm", 894192762Srmacklem "DelePurge", "DeleRet", "GetFH", "Lock"); 895192762Srmacklem printf("%9d %9d %9d %9d %9d %9d %9d %9d\n", 896192762Srmacklem ext_nfsstats.srvrpccnt[NFSV4OP_OPEN], 897192762Srmacklem ext_nfsstats.srvrpccnt[NFSV4OP_OPENATTR], 898192762Srmacklem ext_nfsstats.srvrpccnt[NFSV4OP_OPENDOWNGRADE], 899192762Srmacklem ext_nfsstats.srvrpccnt[NFSV4OP_OPENCONFIRM], 900192762Srmacklem ext_nfsstats.srvrpccnt[NFSV4OP_DELEGPURGE], 901192762Srmacklem ext_nfsstats.srvrpccnt[NFSV4OP_DELEGRETURN], 902192762Srmacklem ext_nfsstats.srvrpccnt[NFSV4OP_GETFH], 903192762Srmacklem ext_nfsstats.srvrpccnt[NFSV4OP_LOCK]); 904192762Srmacklem if (printtitle) 905192762Srmacklem printf( 906192762Srmacklem "%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n" 907192762Srmacklem , "LockT", "LockU", "Close", "Verify", "NVerify", 908192762Srmacklem "PutFH", "PutPubFH", "PutRootFH"); 909192762Srmacklem printf("%9d %9d %9d %9d %9d %9d %9d %9d\n", 910192762Srmacklem ext_nfsstats.srvrpccnt[NFSV4OP_LOCKT], 911192762Srmacklem ext_nfsstats.srvrpccnt[NFSV4OP_LOCKU], 912192762Srmacklem ext_nfsstats.srvrpccnt[NFSV4OP_CLOSE], 913192762Srmacklem ext_nfsstats.srvrpccnt[NFSV4OP_VERIFY], 914192762Srmacklem ext_nfsstats.srvrpccnt[NFSV4OP_NVERIFY], 915192762Srmacklem ext_nfsstats.srvrpccnt[NFSV4OP_PUTFH], 916192762Srmacklem ext_nfsstats.srvrpccnt[NFSV4OP_PUTPUBFH], 917192762Srmacklem ext_nfsstats.srvrpccnt[NFSV4OP_PUTROOTFH]); 918192762Srmacklem if (printtitle) 919192762Srmacklem printf("%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n", 920192762Srmacklem "Renew", "RestoreFH", "SaveFH", "Secinfo", 921192762Srmacklem "RelLckOwn", "V4Create"); 922192762Srmacklem printf("%9d %9d %9d %9d %9d %9d\n", 923192762Srmacklem ext_nfsstats.srvrpccnt[NFSV4OP_RENEW], 924192762Srmacklem ext_nfsstats.srvrpccnt[NFSV4OP_RESTOREFH], 925192762Srmacklem ext_nfsstats.srvrpccnt[NFSV4OP_SAVEFH], 926192762Srmacklem ext_nfsstats.srvrpccnt[NFSV4OP_SECINFO], 927192762Srmacklem ext_nfsstats.srvrpccnt[NFSV4OP_RELEASELCKOWN], 928192762Srmacklem ext_nfsstats.srvrpccnt[NFSV4OP_CREATE]); 929192762Srmacklem if (printtitle) { 930192762Srmacklem printf("Server:\n"); 931192762Srmacklem printf("%9.9s %9.9s %9.9s\n", 932192762Srmacklem "Retfailed", "Faults", "Clients"); 933192762Srmacklem } 934192762Srmacklem printf("%9d %9d %9d\n", 935192762Srmacklem ext_nfsstats.srv_errs, ext_nfsstats.srvrpc_errs, 936192762Srmacklem ext_nfsstats.srvclients); 937192762Srmacklem if (printtitle) 938192762Srmacklem printf("%9.9s %9.9s %9.9s %9.9s %9.9s \n", 939192762Srmacklem "OpenOwner", "Opens", "LockOwner", 940192762Srmacklem "Locks", "Delegs"); 941192762Srmacklem printf("%9d %9d %9d %9d %9d \n", 942192762Srmacklem ext_nfsstats.srvopenowners, 943192762Srmacklem ext_nfsstats.srvopens, 944192762Srmacklem ext_nfsstats.srvlockowners, 945192762Srmacklem ext_nfsstats.srvlocks, 946192762Srmacklem ext_nfsstats.srvdelegates); 947192762Srmacklem if (printtitle) { 948192762Srmacklem printf("Server Cache Stats:\n"); 949192762Srmacklem printf("%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n", 950192762Srmacklem "Inprog", "Idem", "Non-idem", "Misses", 951192762Srmacklem "CacheSize", "TCPPeak"); 952192762Srmacklem } 953192762Srmacklem printf("%9d %9d %9d %9d %9d %9d\n", 954192762Srmacklem ext_nfsstats.srvcache_inproghits, 955192762Srmacklem ext_nfsstats.srvcache_idemdonehits, 956192762Srmacklem ext_nfsstats.srvcache_nonidemdonehits, 957192762Srmacklem ext_nfsstats.srvcache_misses, 958192762Srmacklem ext_nfsstats.srvcache_size, 959192762Srmacklem ext_nfsstats.srvcache_tcppeak); 960192762Srmacklem } 961192762Srmacklem} 962192762Srmacklem 963192762Srmacklem/* 964192762Srmacklem * Print a running summary of nfs statistics for the experimental client and/or 965192762Srmacklem * server. 966192762Srmacklem * Repeat display every interval seconds, showing statistics 967192762Srmacklem * collected over that interval. Assumes that interval is non-zero. 968192762Srmacklem * First line printed at top of screen is always cumulative. 969192762Srmacklem */ 970192762Srmacklemvoid 971192762Srmacklemexp_sidewaysintpr(u_int interval, int clientOnly, int serverOnly) 972192762Srmacklem{ 973192762Srmacklem struct ext_nfsstats nfsstats, lastst, *ext_nfsstatsp; 974192762Srmacklem int hdrcnt = 1; 975192762Srmacklem 976192762Srmacklem ext_nfsstatsp = &lastst; 977221435Srmacklem if (nfssvc(NFSSVC_GETSTATS, ext_nfsstatsp) < 0) 978192762Srmacklem err(1, "Can't get stats"); 979192762Srmacklem sleep(interval); 980192762Srmacklem 981192762Srmacklem for (;;) { 982192762Srmacklem ext_nfsstatsp = &nfsstats; 983221435Srmacklem if (nfssvc(NFSSVC_GETSTATS, ext_nfsstatsp) < 0) 984192762Srmacklem err(1, "Can't get stats"); 985192762Srmacklem 986192762Srmacklem if (--hdrcnt == 0) { 987192762Srmacklem printhdr(clientOnly, serverOnly); 988192762Srmacklem if (clientOnly && serverOnly) 989192762Srmacklem hdrcnt = 10; 990192762Srmacklem else 991192762Srmacklem hdrcnt = 20; 992192762Srmacklem } 993192762Srmacklem if (clientOnly) { 994192762Srmacklem printf("%s %6d %6d %6d %6d %6d %6d %6d %6d", 995192762Srmacklem ((clientOnly && serverOnly) ? "Client:" : ""), 996192762Srmacklem DELTA(attrcache_hits) + DELTA(attrcache_misses), 997192762Srmacklem DELTA(lookupcache_hits) + DELTA(lookupcache_misses), 998192762Srmacklem DELTA(biocache_readlinks), 999192762Srmacklem DELTA(biocache_reads), 1000192762Srmacklem DELTA(biocache_writes), 1001192762Srmacklem nfsstats.rpccnt[NFSPROC_RENAME] - 1002192762Srmacklem lastst.rpccnt[NFSPROC_RENAME], 1003192762Srmacklem DELTA(accesscache_hits) + DELTA(accesscache_misses), 1004192762Srmacklem DELTA(biocache_readdirs) 1005192762Srmacklem ); 1006192762Srmacklem if (widemode) { 1007192762Srmacklem printf(" %s %s %s %s %s %s", 1008192762Srmacklem sperc1(DELTA(attrcache_hits), 1009192762Srmacklem DELTA(attrcache_misses)), 1010192762Srmacklem sperc1(DELTA(lookupcache_hits), 1011192762Srmacklem DELTA(lookupcache_misses)), 1012192762Srmacklem sperc2(DELTA(biocache_reads), 1013192762Srmacklem DELTA(read_bios)), 1014192762Srmacklem sperc2(DELTA(biocache_writes), 1015192762Srmacklem DELTA(write_bios)), 1016192762Srmacklem sperc1(DELTA(accesscache_hits), 1017192762Srmacklem DELTA(accesscache_misses)), 1018192762Srmacklem sperc2(DELTA(biocache_readdirs), 1019192762Srmacklem DELTA(readdir_bios)) 1020192762Srmacklem ); 1021192762Srmacklem } 1022192762Srmacklem printf("\n"); 1023192762Srmacklem } 1024192762Srmacklem if (serverOnly) { 1025192762Srmacklem printf("%s %6d %6d %6d %6d %6d %6d %6d %6d", 1026192762Srmacklem ((clientOnly && serverOnly) ? "Server:" : ""), 1027225109Srmacklem nfsstats.srvrpccnt[NFSV4OP_GETATTR] - 1028225109Srmacklem lastst.srvrpccnt[NFSV4OP_GETATTR], 1029225109Srmacklem nfsstats.srvrpccnt[NFSV4OP_LOOKUP] - 1030225109Srmacklem lastst.srvrpccnt[NFSV4OP_LOOKUP], 1031225109Srmacklem nfsstats.srvrpccnt[NFSV4OP_READLINK] - 1032225109Srmacklem lastst.srvrpccnt[NFSV4OP_READLINK], 1033225109Srmacklem nfsstats.srvrpccnt[NFSV4OP_READ] - 1034225109Srmacklem lastst.srvrpccnt[NFSV4OP_READ], 1035225109Srmacklem nfsstats.srvrpccnt[NFSV4OP_WRITE] - 1036225109Srmacklem lastst.srvrpccnt[NFSV4OP_WRITE], 1037225109Srmacklem nfsstats.srvrpccnt[NFSV4OP_RENAME] - 1038225109Srmacklem lastst.srvrpccnt[NFSV4OP_RENAME], 1039225109Srmacklem nfsstats.srvrpccnt[NFSV4OP_ACCESS] - 1040225109Srmacklem lastst.srvrpccnt[NFSV4OP_ACCESS], 1041225109Srmacklem (nfsstats.srvrpccnt[NFSV4OP_READDIR] - 1042225109Srmacklem lastst.srvrpccnt[NFSV4OP_READDIR]) + 1043225109Srmacklem (nfsstats.srvrpccnt[NFSV4OP_READDIRPLUS] - 1044225109Srmacklem lastst.srvrpccnt[NFSV4OP_READDIRPLUS])); 1045192762Srmacklem printf("\n"); 1046192762Srmacklem } 1047238701Shrs lastst = nfsstats; 1048192762Srmacklem fflush(stdout); 1049192762Srmacklem sleep(interval); 1050192762Srmacklem } 1051192762Srmacklem /*NOTREACHED*/ 1052192762Srmacklem} 1053192762Srmacklem 1054