19b50d902SRodney W. Grimes /* 29b50d902SRodney W. Grimes * Copyright (c) 1983, 1989, 1993 39b50d902SRodney W. Grimes * The Regents of the University of California. All rights reserved. 49b50d902SRodney W. Grimes * 59b50d902SRodney W. Grimes * This code is derived from software contributed to Berkeley by 69b50d902SRodney W. Grimes * Rick Macklem at The University of Guelph. 79b50d902SRodney W. Grimes * 89b50d902SRodney W. Grimes * Redistribution and use in source and binary forms, with or without 99b50d902SRodney W. Grimes * modification, are permitted provided that the following conditions 109b50d902SRodney W. Grimes * are met: 119b50d902SRodney W. Grimes * 1. Redistributions of source code must retain the above copyright 129b50d902SRodney W. Grimes * notice, this list of conditions and the following disclaimer. 139b50d902SRodney W. Grimes * 2. Redistributions in binary form must reproduce the above copyright 149b50d902SRodney W. Grimes * notice, this list of conditions and the following disclaimer in the 159b50d902SRodney W. Grimes * documentation and/or other materials provided with the distribution. 169b50d902SRodney W. Grimes * 4. Neither the name of the University nor the names of its contributors 179b50d902SRodney W. Grimes * may be used to endorse or promote products derived from this software 189b50d902SRodney W. Grimes * without specific prior written permission. 199b50d902SRodney W. Grimes * 209b50d902SRodney W. Grimes * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 219b50d902SRodney W. Grimes * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 229b50d902SRodney W. Grimes * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 239b50d902SRodney W. Grimes * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 249b50d902SRodney W. Grimes * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 259b50d902SRodney W. Grimes * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 269b50d902SRodney W. Grimes * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 279b50d902SRodney W. Grimes * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 289b50d902SRodney W. Grimes * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 299b50d902SRodney W. Grimes * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 309b50d902SRodney W. Grimes * SUCH DAMAGE. 319b50d902SRodney W. Grimes */ 329b50d902SRodney W. Grimes 339b50d902SRodney W. Grimes #ifndef lint 34db995e00SXin LI static const char copyright[] = 359b50d902SRodney W. Grimes "@(#) Copyright (c) 1983, 1989, 1993\n\ 369b50d902SRodney W. Grimes The Regents of the University of California. All rights reserved.\n"; 379b50d902SRodney W. Grimes #endif /* not lint */ 389b50d902SRodney W. Grimes 399b50d902SRodney W. Grimes #ifndef lint 40eae79dd1SBruce Evans #if 0 41eae79dd1SBruce Evans static char sccsid[] = "@(#)nfsstat.c 8.2 (Berkeley) 3/31/95"; 42eae79dd1SBruce Evans #endif 4307e532e7SGarrett Wollman static const char rcsid[] = 44c3aac50fSPeter Wemm "$FreeBSD$"; 459b50d902SRodney W. Grimes #endif /* not lint */ 469b50d902SRodney W. Grimes 479b50d902SRodney W. Grimes #include <sys/param.h> 4833f5882eSEd Schouten #include <sys/module.h> 499b50d902SRodney W. Grimes #include <sys/mount.h> 505a4838fcSPoul-Henning Kamp #include <sys/time.h> 5107e532e7SGarrett Wollman #include <sys/sysctl.h> 52a62dc406SDoug Rabson #include <nfs/nfsproto.h> 5391196234SPeter Wemm #include <nfsclient/nfs.h> 5491196234SPeter Wemm #include <nfsserver/nfs.h> 55bcdaa850SRick Macklem #include <nfs/nfssvc.h> 56bcdaa850SRick Macklem 57bcdaa850SRick Macklem #include <fs/nfs/nfsport.h> 58bcdaa850SRick Macklem 599b50d902SRodney W. Grimes #include <signal.h> 609b50d902SRodney W. Grimes #include <fcntl.h> 61821df508SXin LI #include <ctype.h> 629b50d902SRodney W. Grimes #include <errno.h> 639b50d902SRodney W. Grimes #include <kvm.h> 649c9f2eefSThomas Moestl #include <limits.h> 659b50d902SRodney W. Grimes #include <nlist.h> 669b50d902SRodney W. Grimes #include <unistd.h> 679b50d902SRodney W. Grimes #include <stdio.h> 689b50d902SRodney W. Grimes #include <stdlib.h> 699b50d902SRodney W. Grimes #include <string.h> 70821df508SXin LI #include <paths.h> 7107e532e7SGarrett Wollman #include <err.h> 729b50d902SRodney W. Grimes 739b50d902SRodney W. Grimes struct nlist nl[] = { 749b50d902SRodney W. Grimes #define N_NFSSTAT 0 75db995e00SXin LI { .n_name = "nfsstats" }, 7691196234SPeter Wemm #define N_NFSRVSTAT 1 77db995e00SXin LI { .n_name = "nfsrvstats" }, 78db995e00SXin LI { .n_name = NULL }, 799b50d902SRodney W. Grimes }; 809b50d902SRodney W. Grimes kvm_t *kd; 819b50d902SRodney W. Grimes 8207e532e7SGarrett Wollman static int deadkernel = 0; 834893ef0bSMatthew Dillon static int widemode = 0; 84813947b7SJohn Baldwin static int zflag = 0; 85e85b7d75SRick Macklem static int run_v4 = 1; 86bcdaa850SRick Macklem static int printtitle = 1; 87bcdaa850SRick Macklem static struct ext_nfsstats ext_nfsstats; 88e85b7d75SRick Macklem static int extra_output = 0; 8907e532e7SGarrett Wollman 90d3cb5dedSWarner Losh void intpr(int, int); 91d3cb5dedSWarner Losh void printhdr(int, int); 92d3cb5dedSWarner Losh void sidewaysintpr(u_int, int, int); 93d3cb5dedSWarner Losh void usage(void); 94d3cb5dedSWarner Losh char *sperc1(int, int); 95d3cb5dedSWarner Losh char *sperc2(int, int); 96bcdaa850SRick Macklem void exp_intpr(int, int); 97bcdaa850SRick Macklem void exp_sidewaysintpr(u_int, int, int); 984893ef0bSMatthew Dillon 994893ef0bSMatthew Dillon #define DELTA(field) (nfsstats.field - lastst.field) 1009b50d902SRodney W. Grimes 10170c3c978SStefan Farfeleder int 102813947b7SJohn Baldwin main(int argc, char **argv) 1039b50d902SRodney W. Grimes { 1049b50d902SRodney W. Grimes u_int interval; 1054893ef0bSMatthew Dillon int clientOnly = -1; 1064893ef0bSMatthew Dillon int serverOnly = -1; 1079b50d902SRodney W. Grimes int ch; 1089b50d902SRodney W. Grimes char *memf, *nlistf; 1099c9f2eefSThomas Moestl char errbuf[_POSIX2_LINE_MAX]; 110*a6c903b8SRick Macklem int mntlen, i; 111*a6c903b8SRick Macklem char buf[1024]; 112*a6c903b8SRick Macklem struct statfs *mntbuf; 113*a6c903b8SRick Macklem struct nfscl_dumpmntopts dumpmntopts; 1149b50d902SRodney W. Grimes 1159b50d902SRodney W. Grimes interval = 0; 1169b50d902SRodney W. Grimes memf = nlistf = NULL; 117*a6c903b8SRick Macklem while ((ch = getopt(argc, argv, "cesWM:mN:ow:z")) != -1) 1189b50d902SRodney W. Grimes switch(ch) { 1199b50d902SRodney W. Grimes case 'M': 1209b50d902SRodney W. Grimes memf = optarg; 1219b50d902SRodney W. Grimes break; 122*a6c903b8SRick Macklem case 'm': 123*a6c903b8SRick Macklem /* Display mount options for NFS mount points. */ 124*a6c903b8SRick Macklem mntlen = getmntinfo(&mntbuf, MNT_NOWAIT); 125*a6c903b8SRick Macklem for (i = 0; i < mntlen; i++) { 126*a6c903b8SRick Macklem if (strcmp(mntbuf->f_fstypename, "nfs") == 0) { 127*a6c903b8SRick Macklem dumpmntopts.ndmnt_fname = 128*a6c903b8SRick Macklem mntbuf->f_mntonname; 129*a6c903b8SRick Macklem dumpmntopts.ndmnt_buf = buf; 130*a6c903b8SRick Macklem dumpmntopts.ndmnt_blen = sizeof(buf); 131*a6c903b8SRick Macklem if (nfssvc(NFSSVC_DUMPMNTOPTS, 132*a6c903b8SRick Macklem &dumpmntopts) >= 0) 133*a6c903b8SRick Macklem printf("%s on %s\n%s\n", 134*a6c903b8SRick Macklem mntbuf->f_mntfromname, 135*a6c903b8SRick Macklem mntbuf->f_mntonname, buf); 136*a6c903b8SRick Macklem } 137*a6c903b8SRick Macklem mntbuf++; 138*a6c903b8SRick Macklem } 139*a6c903b8SRick Macklem exit(0); 1409b50d902SRodney W. Grimes case 'N': 1419b50d902SRodney W. Grimes nlistf = optarg; 1429b50d902SRodney W. Grimes break; 1434893ef0bSMatthew Dillon case 'W': 1444893ef0bSMatthew Dillon widemode = 1; 1454893ef0bSMatthew Dillon break; 1469b50d902SRodney W. Grimes case 'w': 1479b50d902SRodney W. Grimes interval = atoi(optarg); 1489b50d902SRodney W. Grimes break; 1494893ef0bSMatthew Dillon case 'c': 1504893ef0bSMatthew Dillon clientOnly = 1; 1514893ef0bSMatthew Dillon if (serverOnly < 0) 1524893ef0bSMatthew Dillon serverOnly = 0; 1534893ef0bSMatthew Dillon break; 1544893ef0bSMatthew Dillon case 's': 1554893ef0bSMatthew Dillon serverOnly = 1; 1564893ef0bSMatthew Dillon if (clientOnly < 0) 1574893ef0bSMatthew Dillon clientOnly = 0; 1584893ef0bSMatthew Dillon break; 159813947b7SJohn Baldwin case 'z': 160813947b7SJohn Baldwin zflag = 1; 161813947b7SJohn Baldwin break; 162e85b7d75SRick Macklem case 'o': 163e85b7d75SRick Macklem if (extra_output != 0) 164e85b7d75SRick Macklem err(1, "-o incompatible with -e"); 165e85b7d75SRick Macklem run_v4 = 0; 166e85b7d75SRick Macklem break; 16761a2fc1fSRick Macklem case 'e': 168e85b7d75SRick Macklem if (run_v4 == 0) 169e85b7d75SRick Macklem err(1, "-e incompatible with -o"); 170e85b7d75SRick Macklem extra_output = 1; 171bcdaa850SRick Macklem break; 1729b50d902SRodney W. Grimes case '?': 1739b50d902SRodney W. Grimes default: 1749b50d902SRodney W. Grimes usage(); 1759b50d902SRodney W. Grimes } 1769b50d902SRodney W. Grimes argc -= optind; 1779b50d902SRodney W. Grimes argv += optind; 1789b50d902SRodney W. Grimes 1799b50d902SRodney W. Grimes #define BACKWARD_COMPATIBILITY 1809b50d902SRodney W. Grimes #ifdef BACKWARD_COMPATIBILITY 1819b50d902SRodney W. Grimes if (*argv) { 1829b50d902SRodney W. Grimes interval = atoi(*argv); 1839b50d902SRodney W. Grimes if (*++argv) { 1849b50d902SRodney W. Grimes nlistf = *argv; 1859b50d902SRodney W. Grimes if (*++argv) 1869b50d902SRodney W. Grimes memf = *argv; 1879b50d902SRodney W. Grimes } 1889b50d902SRodney W. Grimes } 1899b50d902SRodney W. Grimes #endif 190bcdaa850SRick Macklem if (run_v4 != 0 && modfind("nfscommon") < 0) 191e85b7d75SRick Macklem errx(1, "new client/server not loaded"); 192bcdaa850SRick Macklem 1930e8f7d19SRick Macklem if (run_v4 == 0 && (nlistf != NULL || memf != NULL)) { 19407e532e7SGarrett Wollman deadkernel = 1; 1959b50d902SRodney W. Grimes 19607e532e7SGarrett Wollman if ((kd = kvm_openfiles(nlistf, memf, NULL, O_RDONLY, 19707e532e7SGarrett Wollman errbuf)) == 0) { 19807e532e7SGarrett Wollman errx(1, "kvm_openfiles: %s", errbuf); 1999b50d902SRodney W. Grimes } 2009b50d902SRodney W. Grimes if (kvm_nlist(kd, nl) != 0) { 20107e532e7SGarrett Wollman errx(1, "kvm_nlist: can't get names"); 20207e532e7SGarrett Wollman } 2039b50d902SRodney W. Grimes } 2049b50d902SRodney W. Grimes 205bcdaa850SRick Macklem if (interval) { 206bcdaa850SRick Macklem if (run_v4 > 0) 207bcdaa850SRick Macklem exp_sidewaysintpr(interval, clientOnly, serverOnly); 208bcdaa850SRick Macklem else 2094893ef0bSMatthew Dillon sidewaysintpr(interval, clientOnly, serverOnly); 210bcdaa850SRick Macklem } else { 211e85b7d75SRick Macklem if (extra_output != 0) 212bcdaa850SRick Macklem exp_intpr(clientOnly, serverOnly); 2139b50d902SRodney W. Grimes else 2144893ef0bSMatthew Dillon intpr(clientOnly, serverOnly); 215bcdaa850SRick Macklem } 2169b50d902SRodney W. Grimes exit(0); 2179b50d902SRodney W. Grimes } 2189b50d902SRodney W. Grimes 2199b50d902SRodney W. Grimes /* 22007e532e7SGarrett Wollman * Read the nfs stats using sysctl(3) for live kernels, or kvm_read 22107e532e7SGarrett Wollman * for dead ones. 22207e532e7SGarrett Wollman */ 223db995e00SXin LI static void 224813947b7SJohn Baldwin readstats(struct nfsstats **stp, struct nfsrvstats **srvstp, int zero) 22507e532e7SGarrett Wollman { 226813947b7SJohn Baldwin union { 227813947b7SJohn Baldwin struct nfsstats client; 228813947b7SJohn Baldwin struct nfsrvstats server; 229813947b7SJohn Baldwin } zerostat; 23091196234SPeter Wemm size_t buflen; 23191196234SPeter Wemm 23207e532e7SGarrett Wollman if (deadkernel) { 233813947b7SJohn Baldwin if (*stp != NULL && kvm_read(kd, (u_long)nl[N_NFSSTAT].n_value, 234813947b7SJohn Baldwin *stp, sizeof(struct nfsstats)) < 0) { 23591196234SPeter Wemm *stp = NULL; 23691196234SPeter Wemm } 237813947b7SJohn Baldwin if (*srvstp != NULL && kvm_read(kd, 238813947b7SJohn Baldwin (u_long)nl[N_NFSRVSTAT].n_value, *srvstp, 23991196234SPeter Wemm sizeof(struct nfsrvstats)) < 0) { 24091196234SPeter Wemm *srvstp = NULL; 24107e532e7SGarrett Wollman } 24207e532e7SGarrett Wollman } else { 243813947b7SJohn Baldwin if (zero) 244813947b7SJohn Baldwin bzero(&zerostat, sizeof(zerostat)); 24591196234SPeter Wemm buflen = sizeof(struct nfsstats); 2461f376590SRick Macklem if (*stp != NULL && sysctlbyname("vfs.oldnfs.nfsstats", *stp, 247813947b7SJohn Baldwin &buflen, zero ? &zerostat : NULL, zero ? buflen : 0) < 0) { 248813947b7SJohn Baldwin if (errno != ENOENT) 2491f376590SRick Macklem err(1, "sysctl: vfs.oldnfs.nfsstats"); 25091196234SPeter Wemm *stp = NULL; 25191196234SPeter Wemm } 25291196234SPeter Wemm buflen = sizeof(struct nfsrvstats); 253813947b7SJohn Baldwin if (*srvstp != NULL && sysctlbyname("vfs.nfsrv.nfsrvstats", 254813947b7SJohn Baldwin *srvstp, &buflen, zero ? &zerostat : NULL, 255813947b7SJohn Baldwin zero ? buflen : 0) < 0) { 256813947b7SJohn Baldwin if (errno != ENOENT) 257813947b7SJohn Baldwin err(1, "sysctl: vfs.nfsrv.nfsrvstats"); 25891196234SPeter Wemm *srvstp = NULL; 25907e532e7SGarrett Wollman } 26007e532e7SGarrett Wollman } 26107e532e7SGarrett Wollman } 26207e532e7SGarrett Wollman 26307e532e7SGarrett Wollman /* 2649b50d902SRodney W. Grimes * Print a description of the nfs stats. 2659b50d902SRodney W. Grimes */ 2669b50d902SRodney W. Grimes void 2674893ef0bSMatthew Dillon intpr(int clientOnly, int serverOnly) 2689b50d902SRodney W. Grimes { 26991196234SPeter Wemm struct nfsstats nfsstats, *nfsstatsp; 27091196234SPeter Wemm struct nfsrvstats nfsrvstats, *nfsrvstatsp; 271e85b7d75SRick Macklem int nfssvc_flag; 2729b50d902SRodney W. Grimes 273e85b7d75SRick Macklem if (run_v4 == 0) { 274813947b7SJohn Baldwin /* 275813947b7SJohn Baldwin * Only read the stats we are going to display to avoid zeroing 276813947b7SJohn Baldwin * stats the user didn't request. 277813947b7SJohn Baldwin */ 278813947b7SJohn Baldwin if (clientOnly) 27991196234SPeter Wemm nfsstatsp = &nfsstats; 280813947b7SJohn Baldwin else 281813947b7SJohn Baldwin nfsstatsp = NULL; 282813947b7SJohn Baldwin if (serverOnly) 28391196234SPeter Wemm nfsrvstatsp = &nfsrvstats; 284813947b7SJohn Baldwin else 285813947b7SJohn Baldwin nfsrvstatsp = NULL; 28607e532e7SGarrett Wollman 287813947b7SJohn Baldwin readstats(&nfsstatsp, &nfsrvstatsp, zflag); 28891196234SPeter Wemm 28991196234SPeter Wemm if (clientOnly && !nfsstatsp) { 29091196234SPeter Wemm printf("Client not present!\n"); 29191196234SPeter Wemm clientOnly = 0; 29291196234SPeter Wemm } 293e85b7d75SRick Macklem } else { 294e85b7d75SRick Macklem nfssvc_flag = NFSSVC_GETSTATS; 295e85b7d75SRick Macklem if (zflag != 0) { 296e85b7d75SRick Macklem if (clientOnly != 0) 297e85b7d75SRick Macklem nfssvc_flag |= NFSSVC_ZEROCLTSTATS; 298e85b7d75SRick Macklem if (serverOnly != 0) 299e85b7d75SRick Macklem nfssvc_flag |= NFSSVC_ZEROSRVSTATS; 300e85b7d75SRick Macklem } 301e85b7d75SRick Macklem if (nfssvc(nfssvc_flag, &ext_nfsstats) < 0) 302e85b7d75SRick Macklem err(1, "Can't get stats"); 303e85b7d75SRick Macklem } 3044893ef0bSMatthew Dillon if (clientOnly) { 3059b50d902SRodney W. Grimes printf("Client Info:\n"); 3069b50d902SRodney W. Grimes printf("Rpc Counts:\n"); 3079b50d902SRodney W. Grimes printf("%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n", 3089b50d902SRodney W. Grimes "Getattr", "Setattr", "Lookup", "Readlink", "Read", 3099b50d902SRodney W. Grimes "Write", "Create", "Remove"); 310e85b7d75SRick Macklem if (run_v4 == 0) 3119b50d902SRodney W. Grimes printf("%9d %9d %9d %9d %9d %9d %9d %9d\n", 3129b50d902SRodney W. Grimes nfsstats.rpccnt[NFSPROC_GETATTR], 3139b50d902SRodney W. Grimes nfsstats.rpccnt[NFSPROC_SETATTR], 3149b50d902SRodney W. Grimes nfsstats.rpccnt[NFSPROC_LOOKUP], 3159b50d902SRodney W. Grimes nfsstats.rpccnt[NFSPROC_READLINK], 3169b50d902SRodney W. Grimes nfsstats.rpccnt[NFSPROC_READ], 3179b50d902SRodney W. Grimes nfsstats.rpccnt[NFSPROC_WRITE], 3189b50d902SRodney W. Grimes nfsstats.rpccnt[NFSPROC_CREATE], 3199b50d902SRodney W. Grimes nfsstats.rpccnt[NFSPROC_REMOVE]); 320e85b7d75SRick Macklem else 321e85b7d75SRick Macklem printf("%9d %9d %9d %9d %9d %9d %9d %9d\n", 322e85b7d75SRick Macklem ext_nfsstats.rpccnt[NFSPROC_GETATTR], 323e85b7d75SRick Macklem ext_nfsstats.rpccnt[NFSPROC_SETATTR], 324e85b7d75SRick Macklem ext_nfsstats.rpccnt[NFSPROC_LOOKUP], 325e85b7d75SRick Macklem ext_nfsstats.rpccnt[NFSPROC_READLINK], 326e85b7d75SRick Macklem ext_nfsstats.rpccnt[NFSPROC_READ], 327e85b7d75SRick Macklem ext_nfsstats.rpccnt[NFSPROC_WRITE], 328e85b7d75SRick Macklem ext_nfsstats.rpccnt[NFSPROC_CREATE], 329e85b7d75SRick Macklem ext_nfsstats.rpccnt[NFSPROC_REMOVE]); 3309b50d902SRodney W. Grimes printf("%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n", 3319b50d902SRodney W. Grimes "Rename", "Link", "Symlink", "Mkdir", "Rmdir", 332a62dc406SDoug Rabson "Readdir", "RdirPlus", "Access"); 333e85b7d75SRick Macklem if (run_v4 == 0) 3349b50d902SRodney W. Grimes printf("%9d %9d %9d %9d %9d %9d %9d %9d\n", 3359b50d902SRodney W. Grimes nfsstats.rpccnt[NFSPROC_RENAME], 3369b50d902SRodney W. Grimes nfsstats.rpccnt[NFSPROC_LINK], 3379b50d902SRodney W. Grimes nfsstats.rpccnt[NFSPROC_SYMLINK], 3389b50d902SRodney W. Grimes nfsstats.rpccnt[NFSPROC_MKDIR], 3399b50d902SRodney W. Grimes nfsstats.rpccnt[NFSPROC_RMDIR], 3409b50d902SRodney W. Grimes nfsstats.rpccnt[NFSPROC_READDIR], 341a62dc406SDoug Rabson nfsstats.rpccnt[NFSPROC_READDIRPLUS], 342a62dc406SDoug Rabson nfsstats.rpccnt[NFSPROC_ACCESS]); 343e85b7d75SRick Macklem else 344e85b7d75SRick Macklem printf("%9d %9d %9d %9d %9d %9d %9d %9d\n", 345e85b7d75SRick Macklem ext_nfsstats.rpccnt[NFSPROC_RENAME], 346e85b7d75SRick Macklem ext_nfsstats.rpccnt[NFSPROC_LINK], 347e85b7d75SRick Macklem ext_nfsstats.rpccnt[NFSPROC_SYMLINK], 348e85b7d75SRick Macklem ext_nfsstats.rpccnt[NFSPROC_MKDIR], 349e85b7d75SRick Macklem ext_nfsstats.rpccnt[NFSPROC_RMDIR], 350e85b7d75SRick Macklem ext_nfsstats.rpccnt[NFSPROC_READDIR], 351e85b7d75SRick Macklem ext_nfsstats.rpccnt[NFSPROC_READDIRPLUS], 352e85b7d75SRick Macklem ext_nfsstats.rpccnt[NFSPROC_ACCESS]); 35391196234SPeter Wemm printf("%9.9s %9.9s %9.9s %9.9s %9.9s\n", 35491196234SPeter Wemm "Mknod", "Fsstat", "Fsinfo", "PathConf", "Commit"); 355e85b7d75SRick Macklem if (run_v4 == 0) 35691196234SPeter Wemm printf("%9d %9d %9d %9d %9d\n", 357a62dc406SDoug Rabson nfsstats.rpccnt[NFSPROC_MKNOD], 358a62dc406SDoug Rabson nfsstats.rpccnt[NFSPROC_FSSTAT], 359a62dc406SDoug Rabson nfsstats.rpccnt[NFSPROC_FSINFO], 360a62dc406SDoug Rabson nfsstats.rpccnt[NFSPROC_PATHCONF], 36191196234SPeter Wemm nfsstats.rpccnt[NFSPROC_COMMIT]); 362e85b7d75SRick Macklem else 363e85b7d75SRick Macklem printf("%9d %9d %9d %9d %9d\n", 364e85b7d75SRick Macklem ext_nfsstats.rpccnt[NFSPROC_MKNOD], 365e85b7d75SRick Macklem ext_nfsstats.rpccnt[NFSPROC_FSSTAT], 366e85b7d75SRick Macklem ext_nfsstats.rpccnt[NFSPROC_FSINFO], 367e85b7d75SRick Macklem ext_nfsstats.rpccnt[NFSPROC_PATHCONF], 368e85b7d75SRick Macklem ext_nfsstats.rpccnt[NFSPROC_COMMIT]); 3699b50d902SRodney W. Grimes printf("Rpc Info:\n"); 3709b50d902SRodney W. Grimes printf("%9.9s %9.9s %9.9s %9.9s %9.9s\n", 3714893ef0bSMatthew Dillon "TimedOut", "Invalid", "X Replies", "Retries", 3724893ef0bSMatthew Dillon "Requests"); 373e85b7d75SRick Macklem if (run_v4 == 0) 3749b50d902SRodney W. Grimes printf("%9d %9d %9d %9d %9d\n", 3759b50d902SRodney W. Grimes nfsstats.rpctimeouts, 3769b50d902SRodney W. Grimes nfsstats.rpcinvalid, 3779b50d902SRodney W. Grimes nfsstats.rpcunexpected, 3789b50d902SRodney W. Grimes nfsstats.rpcretries, 3799b50d902SRodney W. Grimes nfsstats.rpcrequests); 380e85b7d75SRick Macklem else 381e85b7d75SRick Macklem printf("%9d %9d %9d %9d %9d\n", 382e85b7d75SRick Macklem ext_nfsstats.rpctimeouts, 383e85b7d75SRick Macklem ext_nfsstats.rpcinvalid, 384e85b7d75SRick Macklem ext_nfsstats.rpcunexpected, 385e85b7d75SRick Macklem ext_nfsstats.rpcretries, 386e85b7d75SRick Macklem ext_nfsstats.rpcrequests); 3879b50d902SRodney W. Grimes printf("Cache Info:\n"); 3889b50d902SRodney W. Grimes printf("%9.9s %9.9s %9.9s %9.9s", 3899b50d902SRodney W. Grimes "Attr Hits", "Misses", "Lkup Hits", "Misses"); 3909b50d902SRodney W. Grimes printf(" %9.9s %9.9s %9.9s %9.9s\n", 3919b50d902SRodney W. Grimes "BioR Hits", "Misses", "BioW Hits", "Misses"); 392e85b7d75SRick Macklem if (run_v4 == 0) { 3939b50d902SRodney W. Grimes printf("%9d %9d %9d %9d", 394e85b7d75SRick Macklem nfsstats.attrcache_hits, 395e85b7d75SRick Macklem nfsstats.attrcache_misses, 396e85b7d75SRick Macklem nfsstats.lookupcache_hits, 397e85b7d75SRick Macklem nfsstats.lookupcache_misses); 3989b50d902SRodney W. Grimes printf(" %9d %9d %9d %9d\n", 3999b50d902SRodney W. Grimes nfsstats.biocache_reads-nfsstats.read_bios, 4009b50d902SRodney W. Grimes nfsstats.read_bios, 4019b50d902SRodney W. Grimes nfsstats.biocache_writes-nfsstats.write_bios, 4029b50d902SRodney W. Grimes nfsstats.write_bios); 403e85b7d75SRick Macklem } else { 404e85b7d75SRick Macklem printf("%9d %9d %9d %9d", 405e85b7d75SRick Macklem ext_nfsstats.attrcache_hits, 406e85b7d75SRick Macklem ext_nfsstats.attrcache_misses, 407e85b7d75SRick Macklem ext_nfsstats.lookupcache_hits, 408e85b7d75SRick Macklem ext_nfsstats.lookupcache_misses); 409e85b7d75SRick Macklem printf(" %9d %9d %9d %9d\n", 410e85b7d75SRick Macklem ext_nfsstats.biocache_reads - 411e85b7d75SRick Macklem ext_nfsstats.read_bios, 412e85b7d75SRick Macklem ext_nfsstats.read_bios, 413e85b7d75SRick Macklem ext_nfsstats.biocache_writes - 414e85b7d75SRick Macklem ext_nfsstats.write_bios, 415e85b7d75SRick Macklem ext_nfsstats.write_bios); 416e85b7d75SRick Macklem } 4179b50d902SRodney W. Grimes printf("%9.9s %9.9s %9.9s %9.9s", 4189b50d902SRodney W. Grimes "BioRLHits", "Misses", "BioD Hits", "Misses"); 4194898f742SRuslan Ermilov printf(" %9.9s %9.9s %9.9s %9.9s\n", "DirE Hits", "Misses", "Accs Hits", "Misses"); 420e85b7d75SRick Macklem if (run_v4 == 0) { 4219b50d902SRodney W. Grimes printf("%9d %9d %9d %9d", 422e85b7d75SRick Macklem nfsstats.biocache_readlinks - 4239b50d902SRodney W. Grimes nfsstats.readlink_bios, 424e85b7d75SRick Macklem nfsstats.readlink_bios, 425e85b7d75SRick Macklem nfsstats.biocache_readdirs - 426e85b7d75SRick Macklem nfsstats.readdir_bios, 4279b50d902SRodney W. Grimes nfsstats.readdir_bios); 4284898f742SRuslan Ermilov printf(" %9d %9d %9d %9d\n", 429e85b7d75SRick Macklem nfsstats.direofcache_hits, 430e85b7d75SRick Macklem nfsstats.direofcache_misses, 431e85b7d75SRick Macklem nfsstats.accesscache_hits, 432e85b7d75SRick Macklem nfsstats.accesscache_misses); 433e85b7d75SRick Macklem } else { 434e85b7d75SRick Macklem printf("%9d %9d %9d %9d", 435e85b7d75SRick Macklem ext_nfsstats.biocache_readlinks - 436e85b7d75SRick Macklem ext_nfsstats.readlink_bios, 437e85b7d75SRick Macklem ext_nfsstats.readlink_bios, 438e85b7d75SRick Macklem ext_nfsstats.biocache_readdirs - 439e85b7d75SRick Macklem ext_nfsstats.readdir_bios, 440e85b7d75SRick Macklem ext_nfsstats.readdir_bios); 441e85b7d75SRick Macklem printf(" %9d %9d %9d %9d\n", 442e85b7d75SRick Macklem ext_nfsstats.direofcache_hits, 443e85b7d75SRick Macklem ext_nfsstats.direofcache_misses, 444e85b7d75SRick Macklem ext_nfsstats.accesscache_hits, 445e85b7d75SRick Macklem ext_nfsstats.accesscache_misses); 4464893ef0bSMatthew Dillon } 447e85b7d75SRick Macklem } 448e85b7d75SRick Macklem if (run_v4 == 0 && serverOnly && !nfsrvstatsp) { 44991196234SPeter Wemm printf("Server not present!\n"); 45091196234SPeter Wemm serverOnly = 0; 45191196234SPeter Wemm } 4524893ef0bSMatthew Dillon if (serverOnly) { 4539b50d902SRodney W. Grimes printf("\nServer Info:\n"); 4549b50d902SRodney W. Grimes printf("%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n", 4559b50d902SRodney W. Grimes "Getattr", "Setattr", "Lookup", "Readlink", "Read", 4569b50d902SRodney W. Grimes "Write", "Create", "Remove"); 457e85b7d75SRick Macklem if (run_v4 == 0) 4589b50d902SRodney W. Grimes printf("%9d %9d %9d %9d %9d %9d %9d %9d\n", 45991196234SPeter Wemm nfsrvstats.srvrpccnt[NFSPROC_GETATTR], 46091196234SPeter Wemm nfsrvstats.srvrpccnt[NFSPROC_SETATTR], 46191196234SPeter Wemm nfsrvstats.srvrpccnt[NFSPROC_LOOKUP], 46291196234SPeter Wemm nfsrvstats.srvrpccnt[NFSPROC_READLINK], 46391196234SPeter Wemm nfsrvstats.srvrpccnt[NFSPROC_READ], 46491196234SPeter Wemm nfsrvstats.srvrpccnt[NFSPROC_WRITE], 46591196234SPeter Wemm nfsrvstats.srvrpccnt[NFSPROC_CREATE], 46691196234SPeter Wemm nfsrvstats.srvrpccnt[NFSPROC_REMOVE]); 467e85b7d75SRick Macklem else 468e85b7d75SRick Macklem printf("%9d %9d %9d %9d %9d %9d %9d %9d\n", 469002c2778SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_GETATTR], 470002c2778SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_SETATTR], 471002c2778SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_LOOKUP], 472002c2778SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_READLINK], 473002c2778SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_READ], 474002c2778SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_WRITE], 475002c2778SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_CREATE], 476002c2778SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_REMOVE]); 4779b50d902SRodney W. Grimes printf("%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n", 4789b50d902SRodney W. Grimes "Rename", "Link", "Symlink", "Mkdir", "Rmdir", 479a62dc406SDoug Rabson "Readdir", "RdirPlus", "Access"); 480e85b7d75SRick Macklem if (run_v4 == 0) 4819b50d902SRodney W. Grimes printf("%9d %9d %9d %9d %9d %9d %9d %9d\n", 48291196234SPeter Wemm nfsrvstats.srvrpccnt[NFSPROC_RENAME], 48391196234SPeter Wemm nfsrvstats.srvrpccnt[NFSPROC_LINK], 48491196234SPeter Wemm nfsrvstats.srvrpccnt[NFSPROC_SYMLINK], 48591196234SPeter Wemm nfsrvstats.srvrpccnt[NFSPROC_MKDIR], 48691196234SPeter Wemm nfsrvstats.srvrpccnt[NFSPROC_RMDIR], 48791196234SPeter Wemm nfsrvstats.srvrpccnt[NFSPROC_READDIR], 48891196234SPeter Wemm nfsrvstats.srvrpccnt[NFSPROC_READDIRPLUS], 48991196234SPeter Wemm nfsrvstats.srvrpccnt[NFSPROC_ACCESS]); 490e85b7d75SRick Macklem else 491e85b7d75SRick Macklem printf("%9d %9d %9d %9d %9d %9d %9d %9d\n", 492002c2778SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_RENAME], 493002c2778SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_LINK], 494002c2778SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_SYMLINK], 495002c2778SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_MKDIR], 496002c2778SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_RMDIR], 497002c2778SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_READDIR], 498002c2778SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_READDIRPLUS], 499002c2778SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_ACCESS]); 50091196234SPeter Wemm printf("%9.9s %9.9s %9.9s %9.9s %9.9s\n", 50191196234SPeter Wemm "Mknod", "Fsstat", "Fsinfo", "PathConf", "Commit"); 502e85b7d75SRick Macklem if (run_v4 == 0) 50391196234SPeter Wemm printf("%9d %9d %9d %9d %9d\n", 50491196234SPeter Wemm nfsrvstats.srvrpccnt[NFSPROC_MKNOD], 50591196234SPeter Wemm nfsrvstats.srvrpccnt[NFSPROC_FSSTAT], 50691196234SPeter Wemm nfsrvstats.srvrpccnt[NFSPROC_FSINFO], 50791196234SPeter Wemm nfsrvstats.srvrpccnt[NFSPROC_PATHCONF], 50891196234SPeter Wemm nfsrvstats.srvrpccnt[NFSPROC_COMMIT]); 509e85b7d75SRick Macklem else 510e85b7d75SRick Macklem printf("%9d %9d %9d %9d %9d\n", 511002c2778SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_MKNOD], 512002c2778SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_FSSTAT], 513002c2778SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_FSINFO], 514002c2778SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_PATHCONF], 515002c2778SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_COMMIT]); 5169b50d902SRodney W. Grimes printf("Server Ret-Failed\n"); 517e85b7d75SRick Macklem if (run_v4 == 0) 51891196234SPeter Wemm printf("%17d\n", nfsrvstats.srvrpc_errs); 519e85b7d75SRick Macklem else 520e85b7d75SRick Macklem printf("%17d\n", ext_nfsstats.srvrpc_errs); 5219b50d902SRodney W. Grimes printf("Server Faults\n"); 522e85b7d75SRick Macklem if (run_v4 == 0) 52391196234SPeter Wemm printf("%13d\n", nfsrvstats.srv_errs); 524e85b7d75SRick Macklem else 525e85b7d75SRick Macklem printf("%13d\n", ext_nfsstats.srv_errs); 5269b50d902SRodney W. Grimes printf("Server Cache Stats:\n"); 5279b50d902SRodney W. Grimes printf("%9.9s %9.9s %9.9s %9.9s\n", 5289b50d902SRodney W. Grimes "Inprog", "Idem", "Non-idem", "Misses"); 529e85b7d75SRick Macklem if (run_v4 == 0) 5309b50d902SRodney W. Grimes printf("%9d %9d %9d %9d\n", 53191196234SPeter Wemm nfsrvstats.srvcache_inproghits, 53291196234SPeter Wemm nfsrvstats.srvcache_idemdonehits, 53391196234SPeter Wemm nfsrvstats.srvcache_nonidemdonehits, 53491196234SPeter Wemm nfsrvstats.srvcache_misses); 535e85b7d75SRick Macklem else 536e85b7d75SRick Macklem printf("%9d %9d %9d %9d\n", 537e85b7d75SRick Macklem ext_nfsstats.srvcache_inproghits, 538e85b7d75SRick Macklem ext_nfsstats.srvcache_idemdonehits, 539e85b7d75SRick Macklem ext_nfsstats.srvcache_nonidemdonehits, 540e85b7d75SRick Macklem ext_nfsstats.srvcache_misses); 541a62dc406SDoug Rabson printf("Server Write Gathering:\n"); 542a62dc406SDoug Rabson printf("%9.9s %9.9s %9.9s\n", 543a62dc406SDoug Rabson "WriteOps", "WriteRPC", "Opsaved"); 544e85b7d75SRick Macklem if (run_v4 == 0) 545a62dc406SDoug Rabson printf("%9d %9d %9d\n", 54691196234SPeter Wemm nfsrvstats.srvvop_writes, 54791196234SPeter Wemm nfsrvstats.srvrpccnt[NFSPROC_WRITE], 54891196234SPeter Wemm nfsrvstats.srvrpccnt[NFSPROC_WRITE] - 54991196234SPeter Wemm nfsrvstats.srvvop_writes); 550e85b7d75SRick Macklem else 551e85b7d75SRick Macklem /* 552e85b7d75SRick Macklem * The new client doesn't do write gathering. It was 553e85b7d75SRick Macklem * only useful for NFSv2. 554e85b7d75SRick Macklem */ 555e85b7d75SRick Macklem printf("%9d %9d %9d\n", 556002c2778SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_WRITE], 557002c2778SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_WRITE], 0); 5584893ef0bSMatthew Dillon } 5599b50d902SRodney W. Grimes } 5609b50d902SRodney W. Grimes 5619b50d902SRodney W. Grimes u_char signalled; /* set if alarm goes off "early" */ 5629b50d902SRodney W. Grimes 5639b50d902SRodney W. Grimes /* 5649b50d902SRodney W. Grimes * Print a running summary of nfs statistics. 5659b50d902SRodney W. Grimes * Repeat display every interval seconds, showing statistics 5669b50d902SRodney W. Grimes * collected over that interval. Assumes that interval is non-zero. 5679b50d902SRodney W. Grimes * First line printed at top of screen is always cumulative. 5689b50d902SRodney W. Grimes */ 5699b50d902SRodney W. Grimes void 5704893ef0bSMatthew Dillon sidewaysintpr(u_int interval, int clientOnly, int serverOnly) 5719b50d902SRodney W. Grimes { 57291196234SPeter Wemm struct nfsstats nfsstats, lastst, *nfsstatsp; 57391196234SPeter Wemm struct nfsrvstats nfsrvstats, lastsrvst, *nfsrvstatsp; 5744893ef0bSMatthew Dillon int hdrcnt = 1; 5759b50d902SRodney W. Grimes 57691196234SPeter Wemm nfsstatsp = &lastst; 57791196234SPeter Wemm nfsrvstatsp = &lastsrvst; 578813947b7SJohn Baldwin readstats(&nfsstatsp, &nfsrvstatsp, 0); 57991196234SPeter Wemm if (clientOnly && !nfsstatsp) { 58091196234SPeter Wemm printf("Client not present!\n"); 58191196234SPeter Wemm clientOnly = 0; 58291196234SPeter Wemm } 58391196234SPeter Wemm if (serverOnly && !nfsrvstatsp) { 58491196234SPeter Wemm printf("Server not present!\n"); 58591196234SPeter Wemm serverOnly = 0; 58691196234SPeter Wemm } 5874893ef0bSMatthew Dillon sleep(interval); 5889b50d902SRodney W. Grimes 5894893ef0bSMatthew Dillon for (;;) { 59091196234SPeter Wemm nfsstatsp = &nfsstats; 59191196234SPeter Wemm nfsrvstatsp = &nfsrvstats; 592813947b7SJohn Baldwin readstats(&nfsstatsp, &nfsrvstatsp, 0); 5934893ef0bSMatthew Dillon 5944893ef0bSMatthew Dillon if (--hdrcnt == 0) { 5954893ef0bSMatthew Dillon printhdr(clientOnly, serverOnly); 5964893ef0bSMatthew Dillon if (clientOnly && serverOnly) 5974893ef0bSMatthew Dillon hdrcnt = 10; 5984893ef0bSMatthew Dillon else 5999b50d902SRodney W. Grimes hdrcnt = 20; 6009b50d902SRodney W. Grimes } 6014893ef0bSMatthew Dillon if (clientOnly) { 6024893ef0bSMatthew Dillon printf("%s %6d %6d %6d %6d %6d %6d %6d %6d", 6034893ef0bSMatthew Dillon ((clientOnly && serverOnly) ? "Client:" : ""), 6044893ef0bSMatthew Dillon DELTA(attrcache_hits) + DELTA(attrcache_misses), 6054893ef0bSMatthew Dillon DELTA(lookupcache_hits) + DELTA(lookupcache_misses), 6064893ef0bSMatthew Dillon DELTA(biocache_readlinks), 6074893ef0bSMatthew Dillon DELTA(biocache_reads), 6084893ef0bSMatthew Dillon DELTA(biocache_writes), 609a62dc406SDoug Rabson nfsstats.rpccnt[NFSPROC_RENAME]-lastst.rpccnt[NFSPROC_RENAME], 6104893ef0bSMatthew Dillon DELTA(accesscache_hits) + DELTA(accesscache_misses), 6114893ef0bSMatthew Dillon DELTA(biocache_readdirs) 6124893ef0bSMatthew Dillon ); 6134893ef0bSMatthew Dillon if (widemode) { 6144893ef0bSMatthew Dillon printf(" %s %s %s %s %s %s", 6154893ef0bSMatthew Dillon sperc1(DELTA(attrcache_hits), 6164893ef0bSMatthew Dillon DELTA(attrcache_misses)), 6174893ef0bSMatthew Dillon sperc1(DELTA(lookupcache_hits), 6184893ef0bSMatthew Dillon DELTA(lookupcache_misses)), 6194893ef0bSMatthew Dillon sperc2(DELTA(biocache_reads), 6204893ef0bSMatthew Dillon DELTA(read_bios)), 6214893ef0bSMatthew Dillon sperc2(DELTA(biocache_writes), 6224893ef0bSMatthew Dillon DELTA(write_bios)), 6234893ef0bSMatthew Dillon sperc1(DELTA(accesscache_hits), 6244893ef0bSMatthew Dillon DELTA(accesscache_misses)), 6254893ef0bSMatthew Dillon sperc2(DELTA(biocache_readdirs), 6264893ef0bSMatthew Dillon DELTA(readdir_bios)) 6274893ef0bSMatthew Dillon ); 6284893ef0bSMatthew Dillon } 6294893ef0bSMatthew Dillon printf("\n"); 63091196234SPeter Wemm lastst = nfsstats; 6314893ef0bSMatthew Dillon } 6324893ef0bSMatthew Dillon if (serverOnly) { 6334893ef0bSMatthew Dillon printf("%s %6d %6d %6d %6d %6d %6d %6d %6d", 6344893ef0bSMatthew Dillon ((clientOnly && serverOnly) ? "Server:" : ""), 63591196234SPeter Wemm nfsrvstats.srvrpccnt[NFSPROC_GETATTR]-lastsrvst.srvrpccnt[NFSPROC_GETATTR], 63691196234SPeter Wemm nfsrvstats.srvrpccnt[NFSPROC_LOOKUP]-lastsrvst.srvrpccnt[NFSPROC_LOOKUP], 63791196234SPeter Wemm nfsrvstats.srvrpccnt[NFSPROC_READLINK]-lastsrvst.srvrpccnt[NFSPROC_READLINK], 63891196234SPeter Wemm nfsrvstats.srvrpccnt[NFSPROC_READ]-lastsrvst.srvrpccnt[NFSPROC_READ], 63991196234SPeter Wemm nfsrvstats.srvrpccnt[NFSPROC_WRITE]-lastsrvst.srvrpccnt[NFSPROC_WRITE], 64091196234SPeter Wemm nfsrvstats.srvrpccnt[NFSPROC_RENAME]-lastsrvst.srvrpccnt[NFSPROC_RENAME], 64191196234SPeter Wemm nfsrvstats.srvrpccnt[NFSPROC_ACCESS]-lastsrvst.srvrpccnt[NFSPROC_ACCESS], 64291196234SPeter Wemm (nfsrvstats.srvrpccnt[NFSPROC_READDIR]-lastsrvst.srvrpccnt[NFSPROC_READDIR]) 64391196234SPeter Wemm +(nfsrvstats.srvrpccnt[NFSPROC_READDIRPLUS]-lastsrvst.srvrpccnt[NFSPROC_READDIRPLUS])); 6444893ef0bSMatthew Dillon printf("\n"); 64591196234SPeter Wemm lastsrvst = nfsrvstats; 6464893ef0bSMatthew Dillon } 6479b50d902SRodney W. Grimes fflush(stdout); 6484893ef0bSMatthew Dillon sleep(interval); 6499b50d902SRodney W. Grimes } 6509b50d902SRodney W. Grimes /*NOTREACHED*/ 6519b50d902SRodney W. Grimes } 6529b50d902SRodney W. Grimes 6539b50d902SRodney W. Grimes void 6544893ef0bSMatthew Dillon printhdr(int clientOnly, int serverOnly) 6559b50d902SRodney W. Grimes { 6564893ef0bSMatthew Dillon printf("%s%6.6s %6.6s %6.6s %6.6s %6.6s %6.6s %6.6s %6.6s", 6574893ef0bSMatthew Dillon ((serverOnly && clientOnly) ? " " : " "), 6584893ef0bSMatthew Dillon "GtAttr", "Lookup", "Rdlink", "Read", "Write", "Rename", 6594893ef0bSMatthew Dillon "Access", "Rddir"); 6604893ef0bSMatthew Dillon if (widemode && clientOnly) { 6614893ef0bSMatthew Dillon printf(" Attr Lkup BioR BioW Accs BioD"); 6629b50d902SRodney W. Grimes } 6634893ef0bSMatthew Dillon printf("\n"); 6644893ef0bSMatthew Dillon fflush(stdout); 6659b50d902SRodney W. Grimes } 6669b50d902SRodney W. Grimes 6679b50d902SRodney W. Grimes void 668813947b7SJohn Baldwin usage(void) 6699b50d902SRodney W. Grimes { 6709b50d902SRodney W. Grimes (void)fprintf(stderr, 671*a6c903b8SRick Macklem "usage: nfsstat [-cemoszW] [-M core] [-N system] [-w wait]\n"); 6729b50d902SRodney W. Grimes exit(1); 6739b50d902SRodney W. Grimes } 6744893ef0bSMatthew Dillon 6754893ef0bSMatthew Dillon static char SPBuf[64][8]; 6764893ef0bSMatthew Dillon static int SPIndex; 6774893ef0bSMatthew Dillon 6784893ef0bSMatthew Dillon char * 6794893ef0bSMatthew Dillon sperc1(int hits, int misses) 6804893ef0bSMatthew Dillon { 6814893ef0bSMatthew Dillon char *p = SPBuf[SPIndex]; 6824893ef0bSMatthew Dillon 6834893ef0bSMatthew Dillon if (hits + misses) { 6844893ef0bSMatthew Dillon sprintf(p, "%3d%%", 6854893ef0bSMatthew Dillon (int)(char)((quad_t)hits * 100 / (hits + misses))); 6864893ef0bSMatthew Dillon } else { 6874893ef0bSMatthew Dillon sprintf(p, " -"); 6884893ef0bSMatthew Dillon } 6894893ef0bSMatthew Dillon SPIndex = (SPIndex + 1) & 63; 6904893ef0bSMatthew Dillon return(p); 6914893ef0bSMatthew Dillon } 6924893ef0bSMatthew Dillon 6934893ef0bSMatthew Dillon char * 6944893ef0bSMatthew Dillon sperc2(int ttl, int misses) 6954893ef0bSMatthew Dillon { 6964893ef0bSMatthew Dillon char *p = SPBuf[SPIndex]; 6974893ef0bSMatthew Dillon 6984893ef0bSMatthew Dillon if (ttl) { 6994893ef0bSMatthew Dillon sprintf(p, "%3d%%", 7004893ef0bSMatthew Dillon (int)(char)((quad_t)(ttl - misses) * 100 / ttl)); 7014893ef0bSMatthew Dillon } else { 7024893ef0bSMatthew Dillon sprintf(p, " -"); 7034893ef0bSMatthew Dillon } 7044893ef0bSMatthew Dillon SPIndex = (SPIndex + 1) & 63; 7054893ef0bSMatthew Dillon return(p); 7064893ef0bSMatthew Dillon } 7074893ef0bSMatthew Dillon 708bcdaa850SRick Macklem /* 709bcdaa850SRick Macklem * Print a description of the nfs stats for the experimental client/server. 710bcdaa850SRick Macklem */ 711bcdaa850SRick Macklem void 712bcdaa850SRick Macklem exp_intpr(int clientOnly, int serverOnly) 713bcdaa850SRick Macklem { 7140e8f7d19SRick Macklem int nfssvc_flag; 715bcdaa850SRick Macklem 7160e8f7d19SRick Macklem nfssvc_flag = NFSSVC_GETSTATS; 7170e8f7d19SRick Macklem if (zflag != 0) { 7180e8f7d19SRick Macklem if (clientOnly != 0) 7190e8f7d19SRick Macklem nfssvc_flag |= NFSSVC_ZEROCLTSTATS; 7200e8f7d19SRick Macklem if (serverOnly != 0) 7210e8f7d19SRick Macklem nfssvc_flag |= NFSSVC_ZEROSRVSTATS; 7220e8f7d19SRick Macklem } 7230e8f7d19SRick Macklem if (nfssvc(nfssvc_flag, &ext_nfsstats) < 0) 7240e8f7d19SRick Macklem err(1, "Can't get stats"); 725bcdaa850SRick Macklem if (clientOnly != 0) { 726bcdaa850SRick Macklem if (printtitle) { 727bcdaa850SRick Macklem printf("Client Info:\n"); 728bcdaa850SRick Macklem printf("Rpc Counts:\n"); 729bcdaa850SRick Macklem printf( 730bcdaa850SRick Macklem "%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n" 731bcdaa850SRick Macklem , "Getattr", "Setattr", "Lookup", "Readlink", 732bcdaa850SRick Macklem "Read", "Write", "Create", "Remove"); 733bcdaa850SRick Macklem } 734bcdaa850SRick Macklem printf("%9d %9d %9d %9d %9d %9d %9d %9d\n", 735bcdaa850SRick Macklem ext_nfsstats.rpccnt[NFSPROC_GETATTR], 736bcdaa850SRick Macklem ext_nfsstats.rpccnt[NFSPROC_SETATTR], 737bcdaa850SRick Macklem ext_nfsstats.rpccnt[NFSPROC_LOOKUP], 738bcdaa850SRick Macklem ext_nfsstats.rpccnt[NFSPROC_READLINK], 739bcdaa850SRick Macklem ext_nfsstats.rpccnt[NFSPROC_READ], 740bcdaa850SRick Macklem ext_nfsstats.rpccnt[NFSPROC_WRITE], 741bcdaa850SRick Macklem ext_nfsstats.rpccnt[NFSPROC_CREATE], 742bcdaa850SRick Macklem ext_nfsstats.rpccnt[NFSPROC_REMOVE]); 743bcdaa850SRick Macklem if (printtitle) 744bcdaa850SRick Macklem printf( 745bcdaa850SRick Macklem "%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n" 746bcdaa850SRick Macklem , "Rename", "Link", "Symlink", "Mkdir", "Rmdir", 747bcdaa850SRick Macklem "Readdir", "RdirPlus", "Access"); 748bcdaa850SRick Macklem printf("%9d %9d %9d %9d %9d %9d %9d %9d\n", 749bcdaa850SRick Macklem ext_nfsstats.rpccnt[NFSPROC_RENAME], 750bcdaa850SRick Macklem ext_nfsstats.rpccnt[NFSPROC_LINK], 751bcdaa850SRick Macklem ext_nfsstats.rpccnt[NFSPROC_SYMLINK], 752bcdaa850SRick Macklem ext_nfsstats.rpccnt[NFSPROC_MKDIR], 753bcdaa850SRick Macklem ext_nfsstats.rpccnt[NFSPROC_RMDIR], 754bcdaa850SRick Macklem ext_nfsstats.rpccnt[NFSPROC_READDIR], 755bcdaa850SRick Macklem ext_nfsstats.rpccnt[NFSPROC_READDIRPLUS], 756bcdaa850SRick Macklem ext_nfsstats.rpccnt[NFSPROC_ACCESS]); 757bcdaa850SRick Macklem if (printtitle) 758bcdaa850SRick Macklem printf( 759bcdaa850SRick Macklem "%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n" 760bcdaa850SRick Macklem , "Mknod", "Fsstat", "Fsinfo", "PathConf", 761bcdaa850SRick Macklem "Commit", "SetClId", "SetClIdCf", "Lock"); 762bcdaa850SRick Macklem printf("%9d %9d %9d %9d %9d %9d %9d %9d\n", 763bcdaa850SRick Macklem ext_nfsstats.rpccnt[NFSPROC_MKNOD], 764bcdaa850SRick Macklem ext_nfsstats.rpccnt[NFSPROC_FSSTAT], 765bcdaa850SRick Macklem ext_nfsstats.rpccnt[NFSPROC_FSINFO], 766bcdaa850SRick Macklem ext_nfsstats.rpccnt[NFSPROC_PATHCONF], 767bcdaa850SRick Macklem ext_nfsstats.rpccnt[NFSPROC_COMMIT], 768bcdaa850SRick Macklem ext_nfsstats.rpccnt[NFSPROC_SETCLIENTID], 769bcdaa850SRick Macklem ext_nfsstats.rpccnt[NFSPROC_SETCLIENTIDCFRM], 770bcdaa850SRick Macklem ext_nfsstats.rpccnt[NFSPROC_LOCK]); 771bcdaa850SRick Macklem if (printtitle) 772bcdaa850SRick Macklem printf("%9.9s %9.9s %9.9s %9.9s\n", 773bcdaa850SRick Macklem "LockT", "LockU", "Open", "OpenCfr"); 774bcdaa850SRick Macklem printf("%9d %9d %9d %9d\n", 775bcdaa850SRick Macklem ext_nfsstats.rpccnt[NFSPROC_LOCKT], 776bcdaa850SRick Macklem ext_nfsstats.rpccnt[NFSPROC_LOCKU], 777bcdaa850SRick Macklem ext_nfsstats.rpccnt[NFSPROC_OPEN], 778bcdaa850SRick Macklem ext_nfsstats.rpccnt[NFSPROC_OPENCONFIRM]); 779bcdaa850SRick Macklem if (printtitle) 780bcdaa850SRick Macklem printf( 781bcdaa850SRick Macklem "%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n" 782bcdaa850SRick Macklem , "OpenOwner", "Opens", "LockOwner", 783bcdaa850SRick Macklem "Locks", "Delegs", "LocalOwn", 784bcdaa850SRick Macklem "LocalOpen", "LocalLOwn"); 785bcdaa850SRick Macklem printf("%9d %9d %9d %9d %9d %9d %9d %9d\n", 786bcdaa850SRick Macklem ext_nfsstats.clopenowners, 787bcdaa850SRick Macklem ext_nfsstats.clopens, 788bcdaa850SRick Macklem ext_nfsstats.cllockowners, 789bcdaa850SRick Macklem ext_nfsstats.cllocks, 790bcdaa850SRick Macklem ext_nfsstats.cldelegates, 791bcdaa850SRick Macklem ext_nfsstats.cllocalopenowners, 792bcdaa850SRick Macklem ext_nfsstats.cllocalopens, 793bcdaa850SRick Macklem ext_nfsstats.cllocallockowners); 794bcdaa850SRick Macklem if (printtitle) 795bcdaa850SRick Macklem printf("%9.9s\n", "LocalLock"); 796bcdaa850SRick Macklem printf("%9d\n", ext_nfsstats.cllocallocks); 797bcdaa850SRick Macklem if (printtitle) { 798bcdaa850SRick Macklem printf("Rpc Info:\n"); 799bcdaa850SRick Macklem printf("%9.9s %9.9s %9.9s %9.9s %9.9s\n", 800bcdaa850SRick Macklem "TimedOut", "Invalid", "X Replies", "Retries", 801bcdaa850SRick Macklem "Requests"); 802bcdaa850SRick Macklem } 803bcdaa850SRick Macklem printf("%9d %9d %9d %9d %9d\n", 804bcdaa850SRick Macklem ext_nfsstats.rpctimeouts, 805bcdaa850SRick Macklem ext_nfsstats.rpcinvalid, 806bcdaa850SRick Macklem ext_nfsstats.rpcunexpected, 807bcdaa850SRick Macklem ext_nfsstats.rpcretries, 808bcdaa850SRick Macklem ext_nfsstats.rpcrequests); 809bcdaa850SRick Macklem if (printtitle) { 810bcdaa850SRick Macklem printf("Cache Info:\n"); 811bcdaa850SRick Macklem printf("%9.9s %9.9s %9.9s %9.9s", 812bcdaa850SRick Macklem "Attr Hits", "Misses", "Lkup Hits", "Misses"); 813bcdaa850SRick Macklem printf(" %9.9s %9.9s %9.9s %9.9s\n", 814bcdaa850SRick Macklem "BioR Hits", "Misses", "BioW Hits", "Misses"); 815bcdaa850SRick Macklem } 816bcdaa850SRick Macklem printf("%9d %9d %9d %9d", 817bcdaa850SRick Macklem ext_nfsstats.attrcache_hits, 818bcdaa850SRick Macklem ext_nfsstats.attrcache_misses, 819bcdaa850SRick Macklem ext_nfsstats.lookupcache_hits, 820bcdaa850SRick Macklem ext_nfsstats.lookupcache_misses); 821bcdaa850SRick Macklem printf(" %9d %9d %9d %9d\n", 822c01be3b7SRick Macklem ext_nfsstats.biocache_reads - ext_nfsstats.read_bios, 823bcdaa850SRick Macklem ext_nfsstats.read_bios, 824c01be3b7SRick Macklem ext_nfsstats.biocache_writes - ext_nfsstats.write_bios, 825bcdaa850SRick Macklem ext_nfsstats.write_bios); 826bcdaa850SRick Macklem if (printtitle) { 827bcdaa850SRick Macklem printf("%9.9s %9.9s %9.9s %9.9s", 828bcdaa850SRick Macklem "BioRLHits", "Misses", "BioD Hits", "Misses"); 829bcdaa850SRick Macklem printf(" %9.9s %9.9s\n", "DirE Hits", "Misses"); 830bcdaa850SRick Macklem } 831bcdaa850SRick Macklem printf("%9d %9d %9d %9d", 832c01be3b7SRick Macklem ext_nfsstats.biocache_readlinks - 833bcdaa850SRick Macklem ext_nfsstats.readlink_bios, 834c01be3b7SRick Macklem ext_nfsstats.readlink_bios, 835c01be3b7SRick Macklem ext_nfsstats.biocache_readdirs - 836c01be3b7SRick Macklem ext_nfsstats.readdir_bios, 837bcdaa850SRick Macklem ext_nfsstats.readdir_bios); 838bcdaa850SRick Macklem printf(" %9d %9d\n", 839bcdaa850SRick Macklem ext_nfsstats.direofcache_hits, 840bcdaa850SRick Macklem ext_nfsstats.direofcache_misses); 841bcdaa850SRick Macklem } 842bcdaa850SRick Macklem if (serverOnly != 0) { 843bcdaa850SRick Macklem if (printtitle) { 844bcdaa850SRick Macklem printf("\nServer Info:\n"); 845bcdaa850SRick Macklem printf( 846bcdaa850SRick Macklem "%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n" 847bcdaa850SRick Macklem , "Getattr", "Setattr", "Lookup", "Readlink", 848bcdaa850SRick Macklem "Read", "Write", "Create", "Remove"); 849bcdaa850SRick Macklem } 850bcdaa850SRick Macklem printf("%9d %9d %9d %9d %9d %9d %9d %9d\n", 851bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_GETATTR], 852bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_SETATTR], 853bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_LOOKUP], 854bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_READLINK], 855bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_READ], 856bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_WRITE], 857bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_V3CREATE], 858bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_REMOVE]); 859bcdaa850SRick Macklem if (printtitle) 860bcdaa850SRick Macklem printf( 861bcdaa850SRick Macklem "%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n" 862bcdaa850SRick Macklem , "Rename", "Link", "Symlink", "Mkdir", "Rmdir", 863bcdaa850SRick Macklem "Readdir", "RdirPlus", "Access"); 864bcdaa850SRick Macklem printf("%9d %9d %9d %9d %9d %9d %9d %9d\n", 865bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_RENAME], 866bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_LINK], 867bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_SYMLINK], 868bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_MKDIR], 869bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_RMDIR], 870bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_READDIR], 871bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_READDIRPLUS], 872bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_ACCESS]); 873bcdaa850SRick Macklem if (printtitle) 874bcdaa850SRick Macklem printf( 875bcdaa850SRick Macklem "%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n" 876bcdaa850SRick Macklem , "Mknod", "Fsstat", "Fsinfo", "PathConf", 877bcdaa850SRick Macklem "Commit", "LookupP", "SetClId", "SetClIdCf"); 878bcdaa850SRick Macklem printf("%9d %9d %9d %9d %9d %9d %9d %9d\n", 879bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_MKNOD], 880bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_FSSTAT], 881bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_FSINFO], 882bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_PATHCONF], 883bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_COMMIT], 884bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_LOOKUPP], 885bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_SETCLIENTID], 886bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_SETCLIENTIDCFRM]); 887bcdaa850SRick Macklem if (printtitle) 888bcdaa850SRick Macklem printf( 889bcdaa850SRick Macklem "%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n" 890bcdaa850SRick Macklem , "Open", "OpenAttr", "OpenDwnGr", "OpenCfrm", 891bcdaa850SRick Macklem "DelePurge", "DeleRet", "GetFH", "Lock"); 892bcdaa850SRick Macklem printf("%9d %9d %9d %9d %9d %9d %9d %9d\n", 893bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_OPEN], 894bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_OPENATTR], 895bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_OPENDOWNGRADE], 896bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_OPENCONFIRM], 897bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_DELEGPURGE], 898bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_DELEGRETURN], 899bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_GETFH], 900bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_LOCK]); 901bcdaa850SRick Macklem if (printtitle) 902bcdaa850SRick Macklem printf( 903bcdaa850SRick Macklem "%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n" 904bcdaa850SRick Macklem , "LockT", "LockU", "Close", "Verify", "NVerify", 905bcdaa850SRick Macklem "PutFH", "PutPubFH", "PutRootFH"); 906bcdaa850SRick Macklem printf("%9d %9d %9d %9d %9d %9d %9d %9d\n", 907bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_LOCKT], 908bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_LOCKU], 909bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_CLOSE], 910bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_VERIFY], 911bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_NVERIFY], 912bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_PUTFH], 913bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_PUTPUBFH], 914bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_PUTROOTFH]); 915bcdaa850SRick Macklem if (printtitle) 916bcdaa850SRick Macklem printf("%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n", 917bcdaa850SRick Macklem "Renew", "RestoreFH", "SaveFH", "Secinfo", 918bcdaa850SRick Macklem "RelLckOwn", "V4Create"); 919bcdaa850SRick Macklem printf("%9d %9d %9d %9d %9d %9d\n", 920bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_RENEW], 921bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_RESTOREFH], 922bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_SAVEFH], 923bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_SECINFO], 924bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_RELEASELCKOWN], 925bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_CREATE]); 926bcdaa850SRick Macklem if (printtitle) { 927bcdaa850SRick Macklem printf("Server:\n"); 928bcdaa850SRick Macklem printf("%9.9s %9.9s %9.9s\n", 929bcdaa850SRick Macklem "Retfailed", "Faults", "Clients"); 930bcdaa850SRick Macklem } 931bcdaa850SRick Macklem printf("%9d %9d %9d\n", 932bcdaa850SRick Macklem ext_nfsstats.srv_errs, ext_nfsstats.srvrpc_errs, 933bcdaa850SRick Macklem ext_nfsstats.srvclients); 934bcdaa850SRick Macklem if (printtitle) 935bcdaa850SRick Macklem printf("%9.9s %9.9s %9.9s %9.9s %9.9s \n", 936bcdaa850SRick Macklem "OpenOwner", "Opens", "LockOwner", 937bcdaa850SRick Macklem "Locks", "Delegs"); 938bcdaa850SRick Macklem printf("%9d %9d %9d %9d %9d \n", 939bcdaa850SRick Macklem ext_nfsstats.srvopenowners, 940bcdaa850SRick Macklem ext_nfsstats.srvopens, 941bcdaa850SRick Macklem ext_nfsstats.srvlockowners, 942bcdaa850SRick Macklem ext_nfsstats.srvlocks, 943bcdaa850SRick Macklem ext_nfsstats.srvdelegates); 944bcdaa850SRick Macklem if (printtitle) { 945bcdaa850SRick Macklem printf("Server Cache Stats:\n"); 946bcdaa850SRick Macklem printf("%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n", 947bcdaa850SRick Macklem "Inprog", "Idem", "Non-idem", "Misses", 948bcdaa850SRick Macklem "CacheSize", "TCPPeak"); 949bcdaa850SRick Macklem } 950bcdaa850SRick Macklem printf("%9d %9d %9d %9d %9d %9d\n", 951bcdaa850SRick Macklem ext_nfsstats.srvcache_inproghits, 952bcdaa850SRick Macklem ext_nfsstats.srvcache_idemdonehits, 953bcdaa850SRick Macklem ext_nfsstats.srvcache_nonidemdonehits, 954bcdaa850SRick Macklem ext_nfsstats.srvcache_misses, 955bcdaa850SRick Macklem ext_nfsstats.srvcache_size, 956bcdaa850SRick Macklem ext_nfsstats.srvcache_tcppeak); 957bcdaa850SRick Macklem } 958bcdaa850SRick Macklem } 959bcdaa850SRick Macklem 960bcdaa850SRick Macklem /* 961bcdaa850SRick Macklem * Print a running summary of nfs statistics for the experimental client and/or 962bcdaa850SRick Macklem * server. 963bcdaa850SRick Macklem * Repeat display every interval seconds, showing statistics 964bcdaa850SRick Macklem * collected over that interval. Assumes that interval is non-zero. 965bcdaa850SRick Macklem * First line printed at top of screen is always cumulative. 966bcdaa850SRick Macklem */ 967bcdaa850SRick Macklem void 968bcdaa850SRick Macklem exp_sidewaysintpr(u_int interval, int clientOnly, int serverOnly) 969bcdaa850SRick Macklem { 970bcdaa850SRick Macklem struct ext_nfsstats nfsstats, lastst, *ext_nfsstatsp; 971bcdaa850SRick Macklem int hdrcnt = 1; 972bcdaa850SRick Macklem 973bcdaa850SRick Macklem ext_nfsstatsp = &lastst; 974785b2572SRick Macklem if (nfssvc(NFSSVC_GETSTATS, ext_nfsstatsp) < 0) 975bcdaa850SRick Macklem err(1, "Can't get stats"); 976bcdaa850SRick Macklem sleep(interval); 977bcdaa850SRick Macklem 978bcdaa850SRick Macklem for (;;) { 979bcdaa850SRick Macklem ext_nfsstatsp = &nfsstats; 980785b2572SRick Macklem if (nfssvc(NFSSVC_GETSTATS, ext_nfsstatsp) < 0) 981bcdaa850SRick Macklem err(1, "Can't get stats"); 982bcdaa850SRick Macklem 983bcdaa850SRick Macklem if (--hdrcnt == 0) { 984bcdaa850SRick Macklem printhdr(clientOnly, serverOnly); 985bcdaa850SRick Macklem if (clientOnly && serverOnly) 986bcdaa850SRick Macklem hdrcnt = 10; 987bcdaa850SRick Macklem else 988bcdaa850SRick Macklem hdrcnt = 20; 989bcdaa850SRick Macklem } 990bcdaa850SRick Macklem if (clientOnly) { 991bcdaa850SRick Macklem printf("%s %6d %6d %6d %6d %6d %6d %6d %6d", 992bcdaa850SRick Macklem ((clientOnly && serverOnly) ? "Client:" : ""), 993bcdaa850SRick Macklem DELTA(attrcache_hits) + DELTA(attrcache_misses), 994bcdaa850SRick Macklem DELTA(lookupcache_hits) + DELTA(lookupcache_misses), 995bcdaa850SRick Macklem DELTA(biocache_readlinks), 996bcdaa850SRick Macklem DELTA(biocache_reads), 997bcdaa850SRick Macklem DELTA(biocache_writes), 998bcdaa850SRick Macklem nfsstats.rpccnt[NFSPROC_RENAME] - 999bcdaa850SRick Macklem lastst.rpccnt[NFSPROC_RENAME], 1000bcdaa850SRick Macklem DELTA(accesscache_hits) + DELTA(accesscache_misses), 1001bcdaa850SRick Macklem DELTA(biocache_readdirs) 1002bcdaa850SRick Macklem ); 1003bcdaa850SRick Macklem if (widemode) { 1004bcdaa850SRick Macklem printf(" %s %s %s %s %s %s", 1005bcdaa850SRick Macklem sperc1(DELTA(attrcache_hits), 1006bcdaa850SRick Macklem DELTA(attrcache_misses)), 1007bcdaa850SRick Macklem sperc1(DELTA(lookupcache_hits), 1008bcdaa850SRick Macklem DELTA(lookupcache_misses)), 1009bcdaa850SRick Macklem sperc2(DELTA(biocache_reads), 1010bcdaa850SRick Macklem DELTA(read_bios)), 1011bcdaa850SRick Macklem sperc2(DELTA(biocache_writes), 1012bcdaa850SRick Macklem DELTA(write_bios)), 1013bcdaa850SRick Macklem sperc1(DELTA(accesscache_hits), 1014bcdaa850SRick Macklem DELTA(accesscache_misses)), 1015bcdaa850SRick Macklem sperc2(DELTA(biocache_readdirs), 1016bcdaa850SRick Macklem DELTA(readdir_bios)) 1017bcdaa850SRick Macklem ); 1018bcdaa850SRick Macklem } 1019bcdaa850SRick Macklem printf("\n"); 1020bcdaa850SRick Macklem } 1021bcdaa850SRick Macklem if (serverOnly) { 1022bcdaa850SRick Macklem printf("%s %6d %6d %6d %6d %6d %6d %6d %6d", 1023bcdaa850SRick Macklem ((clientOnly && serverOnly) ? "Server:" : ""), 1024806f9b42SRick Macklem nfsstats.srvrpccnt[NFSV4OP_GETATTR] - 1025806f9b42SRick Macklem lastst.srvrpccnt[NFSV4OP_GETATTR], 1026806f9b42SRick Macklem nfsstats.srvrpccnt[NFSV4OP_LOOKUP] - 1027806f9b42SRick Macklem lastst.srvrpccnt[NFSV4OP_LOOKUP], 1028806f9b42SRick Macklem nfsstats.srvrpccnt[NFSV4OP_READLINK] - 1029806f9b42SRick Macklem lastst.srvrpccnt[NFSV4OP_READLINK], 1030806f9b42SRick Macklem nfsstats.srvrpccnt[NFSV4OP_READ] - 1031806f9b42SRick Macklem lastst.srvrpccnt[NFSV4OP_READ], 1032806f9b42SRick Macklem nfsstats.srvrpccnt[NFSV4OP_WRITE] - 1033806f9b42SRick Macklem lastst.srvrpccnt[NFSV4OP_WRITE], 1034806f9b42SRick Macklem nfsstats.srvrpccnt[NFSV4OP_RENAME] - 1035806f9b42SRick Macklem lastst.srvrpccnt[NFSV4OP_RENAME], 1036806f9b42SRick Macklem nfsstats.srvrpccnt[NFSV4OP_ACCESS] - 1037806f9b42SRick Macklem lastst.srvrpccnt[NFSV4OP_ACCESS], 1038806f9b42SRick Macklem (nfsstats.srvrpccnt[NFSV4OP_READDIR] - 1039806f9b42SRick Macklem lastst.srvrpccnt[NFSV4OP_READDIR]) + 1040806f9b42SRick Macklem (nfsstats.srvrpccnt[NFSV4OP_READDIRPLUS] - 1041806f9b42SRick Macklem lastst.srvrpccnt[NFSV4OP_READDIRPLUS])); 1042bcdaa850SRick Macklem printf("\n"); 1043bcdaa850SRick Macklem } 104470a8f993SHiroki Sato lastst = nfsstats; 1045bcdaa850SRick Macklem fflush(stdout); 1046bcdaa850SRick Macklem sleep(interval); 1047bcdaa850SRick Macklem } 1048bcdaa850SRick Macklem /*NOTREACHED*/ 1049bcdaa850SRick Macklem } 1050bcdaa850SRick Macklem 1051