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; 85*e85b7d75SRick Macklem static int run_v4 = 1; 86bcdaa850SRick Macklem static int printtitle = 1; 87bcdaa850SRick Macklem static struct ext_nfsstats ext_nfsstats; 88*e85b7d75SRick 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]; 1109b50d902SRodney W. Grimes 1119b50d902SRodney W. Grimes interval = 0; 1129b50d902SRodney W. Grimes memf = nlistf = NULL; 113*e85b7d75SRick Macklem while ((ch = getopt(argc, argv, "cesWM:N:ow:z")) != -1) 1149b50d902SRodney W. Grimes switch(ch) { 1159b50d902SRodney W. Grimes case 'M': 1169b50d902SRodney W. Grimes memf = optarg; 1179b50d902SRodney W. Grimes break; 1189b50d902SRodney W. Grimes case 'N': 1199b50d902SRodney W. Grimes nlistf = optarg; 1209b50d902SRodney W. Grimes break; 1214893ef0bSMatthew Dillon case 'W': 1224893ef0bSMatthew Dillon widemode = 1; 1234893ef0bSMatthew Dillon break; 1249b50d902SRodney W. Grimes case 'w': 1259b50d902SRodney W. Grimes interval = atoi(optarg); 1269b50d902SRodney W. Grimes break; 1274893ef0bSMatthew Dillon case 'c': 1284893ef0bSMatthew Dillon clientOnly = 1; 1294893ef0bSMatthew Dillon if (serverOnly < 0) 1304893ef0bSMatthew Dillon serverOnly = 0; 1314893ef0bSMatthew Dillon break; 1324893ef0bSMatthew Dillon case 's': 1334893ef0bSMatthew Dillon serverOnly = 1; 1344893ef0bSMatthew Dillon if (clientOnly < 0) 1354893ef0bSMatthew Dillon clientOnly = 0; 1364893ef0bSMatthew Dillon break; 137813947b7SJohn Baldwin case 'z': 138813947b7SJohn Baldwin zflag = 1; 139813947b7SJohn Baldwin break; 140*e85b7d75SRick Macklem case 'o': 141*e85b7d75SRick Macklem if (extra_output != 0) 142*e85b7d75SRick Macklem err(1, "-o incompatible with -e"); 143*e85b7d75SRick Macklem run_v4 = 0; 144*e85b7d75SRick Macklem break; 14561a2fc1fSRick Macklem case 'e': 146*e85b7d75SRick Macklem if (run_v4 == 0) 147*e85b7d75SRick Macklem err(1, "-e incompatible with -o"); 148*e85b7d75SRick Macklem extra_output = 1; 149bcdaa850SRick Macklem break; 1509b50d902SRodney W. Grimes case '?': 1519b50d902SRodney W. Grimes default: 1529b50d902SRodney W. Grimes usage(); 1539b50d902SRodney W. Grimes } 1549b50d902SRodney W. Grimes argc -= optind; 1559b50d902SRodney W. Grimes argv += optind; 1569b50d902SRodney W. Grimes 1579b50d902SRodney W. Grimes #define BACKWARD_COMPATIBILITY 1589b50d902SRodney W. Grimes #ifdef BACKWARD_COMPATIBILITY 1599b50d902SRodney W. Grimes if (*argv) { 1609b50d902SRodney W. Grimes interval = atoi(*argv); 1619b50d902SRodney W. Grimes if (*++argv) { 1629b50d902SRodney W. Grimes nlistf = *argv; 1639b50d902SRodney W. Grimes if (*++argv) 1649b50d902SRodney W. Grimes memf = *argv; 1659b50d902SRodney W. Grimes } 1669b50d902SRodney W. Grimes } 1679b50d902SRodney W. Grimes #endif 168bcdaa850SRick Macklem if (run_v4 != 0 && modfind("nfscommon") < 0) 169*e85b7d75SRick Macklem errx(1, "new client/server not loaded"); 170bcdaa850SRick Macklem 1710e8f7d19SRick Macklem if (run_v4 == 0 && (nlistf != NULL || memf != NULL)) { 17207e532e7SGarrett Wollman deadkernel = 1; 1739b50d902SRodney W. Grimes 17407e532e7SGarrett Wollman if ((kd = kvm_openfiles(nlistf, memf, NULL, O_RDONLY, 17507e532e7SGarrett Wollman errbuf)) == 0) { 17607e532e7SGarrett Wollman errx(1, "kvm_openfiles: %s", errbuf); 1779b50d902SRodney W. Grimes } 1789b50d902SRodney W. Grimes if (kvm_nlist(kd, nl) != 0) { 17907e532e7SGarrett Wollman errx(1, "kvm_nlist: can't get names"); 18007e532e7SGarrett Wollman } 1819b50d902SRodney W. Grimes } 1829b50d902SRodney W. Grimes 183bcdaa850SRick Macklem if (interval) { 184bcdaa850SRick Macklem if (run_v4 > 0) 185bcdaa850SRick Macklem exp_sidewaysintpr(interval, clientOnly, serverOnly); 186bcdaa850SRick Macklem else 1874893ef0bSMatthew Dillon sidewaysintpr(interval, clientOnly, serverOnly); 188bcdaa850SRick Macklem } else { 189*e85b7d75SRick Macklem if (extra_output != 0) 190bcdaa850SRick Macklem exp_intpr(clientOnly, serverOnly); 1919b50d902SRodney W. Grimes else 1924893ef0bSMatthew Dillon intpr(clientOnly, serverOnly); 193bcdaa850SRick Macklem } 1949b50d902SRodney W. Grimes exit(0); 1959b50d902SRodney W. Grimes } 1969b50d902SRodney W. Grimes 1979b50d902SRodney W. Grimes /* 19807e532e7SGarrett Wollman * Read the nfs stats using sysctl(3) for live kernels, or kvm_read 19907e532e7SGarrett Wollman * for dead ones. 20007e532e7SGarrett Wollman */ 201db995e00SXin LI static void 202813947b7SJohn Baldwin readstats(struct nfsstats **stp, struct nfsrvstats **srvstp, int zero) 20307e532e7SGarrett Wollman { 204813947b7SJohn Baldwin union { 205813947b7SJohn Baldwin struct nfsstats client; 206813947b7SJohn Baldwin struct nfsrvstats server; 207813947b7SJohn Baldwin } zerostat; 20891196234SPeter Wemm size_t buflen; 20991196234SPeter Wemm 21007e532e7SGarrett Wollman if (deadkernel) { 211813947b7SJohn Baldwin if (*stp != NULL && kvm_read(kd, (u_long)nl[N_NFSSTAT].n_value, 212813947b7SJohn Baldwin *stp, sizeof(struct nfsstats)) < 0) { 21391196234SPeter Wemm *stp = NULL; 21491196234SPeter Wemm } 215813947b7SJohn Baldwin if (*srvstp != NULL && kvm_read(kd, 216813947b7SJohn Baldwin (u_long)nl[N_NFSRVSTAT].n_value, *srvstp, 21791196234SPeter Wemm sizeof(struct nfsrvstats)) < 0) { 21891196234SPeter Wemm *srvstp = NULL; 21907e532e7SGarrett Wollman } 22007e532e7SGarrett Wollman } else { 221813947b7SJohn Baldwin if (zero) 222813947b7SJohn Baldwin bzero(&zerostat, sizeof(zerostat)); 22391196234SPeter Wemm buflen = sizeof(struct nfsstats); 224813947b7SJohn Baldwin if (*stp != NULL && sysctlbyname("vfs.nfs.nfsstats", *stp, 225813947b7SJohn Baldwin &buflen, zero ? &zerostat : NULL, zero ? buflen : 0) < 0) { 226813947b7SJohn Baldwin if (errno != ENOENT) 227813947b7SJohn Baldwin err(1, "sysctl: vfs.nfs.nfsstats"); 22891196234SPeter Wemm *stp = NULL; 22991196234SPeter Wemm } 23091196234SPeter Wemm buflen = sizeof(struct nfsrvstats); 231813947b7SJohn Baldwin if (*srvstp != NULL && sysctlbyname("vfs.nfsrv.nfsrvstats", 232813947b7SJohn Baldwin *srvstp, &buflen, zero ? &zerostat : NULL, 233813947b7SJohn Baldwin zero ? buflen : 0) < 0) { 234813947b7SJohn Baldwin if (errno != ENOENT) 235813947b7SJohn Baldwin err(1, "sysctl: vfs.nfsrv.nfsrvstats"); 23691196234SPeter Wemm *srvstp = NULL; 23707e532e7SGarrett Wollman } 23807e532e7SGarrett Wollman } 23907e532e7SGarrett Wollman } 24007e532e7SGarrett Wollman 24107e532e7SGarrett Wollman /* 2429b50d902SRodney W. Grimes * Print a description of the nfs stats. 2439b50d902SRodney W. Grimes */ 2449b50d902SRodney W. Grimes void 2454893ef0bSMatthew Dillon intpr(int clientOnly, int serverOnly) 2469b50d902SRodney W. Grimes { 24791196234SPeter Wemm struct nfsstats nfsstats, *nfsstatsp; 24891196234SPeter Wemm struct nfsrvstats nfsrvstats, *nfsrvstatsp; 249*e85b7d75SRick Macklem int nfssvc_flag; 2509b50d902SRodney W. Grimes 251*e85b7d75SRick Macklem if (run_v4 == 0) { 252813947b7SJohn Baldwin /* 253813947b7SJohn Baldwin * Only read the stats we are going to display to avoid zeroing 254813947b7SJohn Baldwin * stats the user didn't request. 255813947b7SJohn Baldwin */ 256813947b7SJohn Baldwin if (clientOnly) 25791196234SPeter Wemm nfsstatsp = &nfsstats; 258813947b7SJohn Baldwin else 259813947b7SJohn Baldwin nfsstatsp = NULL; 260813947b7SJohn Baldwin if (serverOnly) 26191196234SPeter Wemm nfsrvstatsp = &nfsrvstats; 262813947b7SJohn Baldwin else 263813947b7SJohn Baldwin nfsrvstatsp = NULL; 26407e532e7SGarrett Wollman 265813947b7SJohn Baldwin readstats(&nfsstatsp, &nfsrvstatsp, zflag); 26691196234SPeter Wemm 26791196234SPeter Wemm if (clientOnly && !nfsstatsp) { 26891196234SPeter Wemm printf("Client not present!\n"); 26991196234SPeter Wemm clientOnly = 0; 27091196234SPeter Wemm } 271*e85b7d75SRick Macklem } else { 272*e85b7d75SRick Macklem nfssvc_flag = NFSSVC_GETSTATS; 273*e85b7d75SRick Macklem if (zflag != 0) { 274*e85b7d75SRick Macklem if (clientOnly != 0) 275*e85b7d75SRick Macklem nfssvc_flag |= NFSSVC_ZEROCLTSTATS; 276*e85b7d75SRick Macklem if (serverOnly != 0) 277*e85b7d75SRick Macklem nfssvc_flag |= NFSSVC_ZEROSRVSTATS; 278*e85b7d75SRick Macklem } 279*e85b7d75SRick Macklem if (nfssvc(nfssvc_flag, &ext_nfsstats) < 0) 280*e85b7d75SRick Macklem err(1, "Can't get stats"); 281*e85b7d75SRick Macklem } 2824893ef0bSMatthew Dillon if (clientOnly) { 2839b50d902SRodney W. Grimes printf("Client Info:\n"); 2849b50d902SRodney W. Grimes printf("Rpc Counts:\n"); 2859b50d902SRodney W. Grimes printf("%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n", 2869b50d902SRodney W. Grimes "Getattr", "Setattr", "Lookup", "Readlink", "Read", 2879b50d902SRodney W. Grimes "Write", "Create", "Remove"); 288*e85b7d75SRick Macklem if (run_v4 == 0) 2899b50d902SRodney W. Grimes printf("%9d %9d %9d %9d %9d %9d %9d %9d\n", 2909b50d902SRodney W. Grimes nfsstats.rpccnt[NFSPROC_GETATTR], 2919b50d902SRodney W. Grimes nfsstats.rpccnt[NFSPROC_SETATTR], 2929b50d902SRodney W. Grimes nfsstats.rpccnt[NFSPROC_LOOKUP], 2939b50d902SRodney W. Grimes nfsstats.rpccnt[NFSPROC_READLINK], 2949b50d902SRodney W. Grimes nfsstats.rpccnt[NFSPROC_READ], 2959b50d902SRodney W. Grimes nfsstats.rpccnt[NFSPROC_WRITE], 2969b50d902SRodney W. Grimes nfsstats.rpccnt[NFSPROC_CREATE], 2979b50d902SRodney W. Grimes nfsstats.rpccnt[NFSPROC_REMOVE]); 298*e85b7d75SRick Macklem else 299*e85b7d75SRick Macklem printf("%9d %9d %9d %9d %9d %9d %9d %9d\n", 300*e85b7d75SRick Macklem ext_nfsstats.rpccnt[NFSPROC_GETATTR], 301*e85b7d75SRick Macklem ext_nfsstats.rpccnt[NFSPROC_SETATTR], 302*e85b7d75SRick Macklem ext_nfsstats.rpccnt[NFSPROC_LOOKUP], 303*e85b7d75SRick Macklem ext_nfsstats.rpccnt[NFSPROC_READLINK], 304*e85b7d75SRick Macklem ext_nfsstats.rpccnt[NFSPROC_READ], 305*e85b7d75SRick Macklem ext_nfsstats.rpccnt[NFSPROC_WRITE], 306*e85b7d75SRick Macklem ext_nfsstats.rpccnt[NFSPROC_CREATE], 307*e85b7d75SRick Macklem ext_nfsstats.rpccnt[NFSPROC_REMOVE]); 3089b50d902SRodney W. Grimes printf("%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n", 3099b50d902SRodney W. Grimes "Rename", "Link", "Symlink", "Mkdir", "Rmdir", 310a62dc406SDoug Rabson "Readdir", "RdirPlus", "Access"); 311*e85b7d75SRick Macklem if (run_v4 == 0) 3129b50d902SRodney W. Grimes printf("%9d %9d %9d %9d %9d %9d %9d %9d\n", 3139b50d902SRodney W. Grimes nfsstats.rpccnt[NFSPROC_RENAME], 3149b50d902SRodney W. Grimes nfsstats.rpccnt[NFSPROC_LINK], 3159b50d902SRodney W. Grimes nfsstats.rpccnt[NFSPROC_SYMLINK], 3169b50d902SRodney W. Grimes nfsstats.rpccnt[NFSPROC_MKDIR], 3179b50d902SRodney W. Grimes nfsstats.rpccnt[NFSPROC_RMDIR], 3189b50d902SRodney W. Grimes nfsstats.rpccnt[NFSPROC_READDIR], 319a62dc406SDoug Rabson nfsstats.rpccnt[NFSPROC_READDIRPLUS], 320a62dc406SDoug Rabson nfsstats.rpccnt[NFSPROC_ACCESS]); 321*e85b7d75SRick Macklem else 322*e85b7d75SRick Macklem printf("%9d %9d %9d %9d %9d %9d %9d %9d\n", 323*e85b7d75SRick Macklem ext_nfsstats.rpccnt[NFSPROC_RENAME], 324*e85b7d75SRick Macklem ext_nfsstats.rpccnt[NFSPROC_LINK], 325*e85b7d75SRick Macklem ext_nfsstats.rpccnt[NFSPROC_SYMLINK], 326*e85b7d75SRick Macklem ext_nfsstats.rpccnt[NFSPROC_MKDIR], 327*e85b7d75SRick Macklem ext_nfsstats.rpccnt[NFSPROC_RMDIR], 328*e85b7d75SRick Macklem ext_nfsstats.rpccnt[NFSPROC_READDIR], 329*e85b7d75SRick Macklem ext_nfsstats.rpccnt[NFSPROC_READDIRPLUS], 330*e85b7d75SRick Macklem ext_nfsstats.rpccnt[NFSPROC_ACCESS]); 33191196234SPeter Wemm printf("%9.9s %9.9s %9.9s %9.9s %9.9s\n", 33291196234SPeter Wemm "Mknod", "Fsstat", "Fsinfo", "PathConf", "Commit"); 333*e85b7d75SRick Macklem if (run_v4 == 0) 33491196234SPeter Wemm printf("%9d %9d %9d %9d %9d\n", 335a62dc406SDoug Rabson nfsstats.rpccnt[NFSPROC_MKNOD], 336a62dc406SDoug Rabson nfsstats.rpccnt[NFSPROC_FSSTAT], 337a62dc406SDoug Rabson nfsstats.rpccnt[NFSPROC_FSINFO], 338a62dc406SDoug Rabson nfsstats.rpccnt[NFSPROC_PATHCONF], 33991196234SPeter Wemm nfsstats.rpccnt[NFSPROC_COMMIT]); 340*e85b7d75SRick Macklem else 341*e85b7d75SRick Macklem printf("%9d %9d %9d %9d %9d\n", 342*e85b7d75SRick Macklem ext_nfsstats.rpccnt[NFSPROC_MKNOD], 343*e85b7d75SRick Macklem ext_nfsstats.rpccnt[NFSPROC_FSSTAT], 344*e85b7d75SRick Macklem ext_nfsstats.rpccnt[NFSPROC_FSINFO], 345*e85b7d75SRick Macklem ext_nfsstats.rpccnt[NFSPROC_PATHCONF], 346*e85b7d75SRick Macklem ext_nfsstats.rpccnt[NFSPROC_COMMIT]); 3479b50d902SRodney W. Grimes printf("Rpc Info:\n"); 3489b50d902SRodney W. Grimes printf("%9.9s %9.9s %9.9s %9.9s %9.9s\n", 3494893ef0bSMatthew Dillon "TimedOut", "Invalid", "X Replies", "Retries", 3504893ef0bSMatthew Dillon "Requests"); 351*e85b7d75SRick Macklem if (run_v4 == 0) 3529b50d902SRodney W. Grimes printf("%9d %9d %9d %9d %9d\n", 3539b50d902SRodney W. Grimes nfsstats.rpctimeouts, 3549b50d902SRodney W. Grimes nfsstats.rpcinvalid, 3559b50d902SRodney W. Grimes nfsstats.rpcunexpected, 3569b50d902SRodney W. Grimes nfsstats.rpcretries, 3579b50d902SRodney W. Grimes nfsstats.rpcrequests); 358*e85b7d75SRick Macklem else 359*e85b7d75SRick Macklem printf("%9d %9d %9d %9d %9d\n", 360*e85b7d75SRick Macklem ext_nfsstats.rpctimeouts, 361*e85b7d75SRick Macklem ext_nfsstats.rpcinvalid, 362*e85b7d75SRick Macklem ext_nfsstats.rpcunexpected, 363*e85b7d75SRick Macklem ext_nfsstats.rpcretries, 364*e85b7d75SRick Macklem ext_nfsstats.rpcrequests); 3659b50d902SRodney W. Grimes printf("Cache Info:\n"); 3669b50d902SRodney W. Grimes printf("%9.9s %9.9s %9.9s %9.9s", 3679b50d902SRodney W. Grimes "Attr Hits", "Misses", "Lkup Hits", "Misses"); 3689b50d902SRodney W. Grimes printf(" %9.9s %9.9s %9.9s %9.9s\n", 3699b50d902SRodney W. Grimes "BioR Hits", "Misses", "BioW Hits", "Misses"); 370*e85b7d75SRick Macklem if (run_v4 == 0) { 3719b50d902SRodney W. Grimes printf("%9d %9d %9d %9d", 372*e85b7d75SRick Macklem nfsstats.attrcache_hits, 373*e85b7d75SRick Macklem nfsstats.attrcache_misses, 374*e85b7d75SRick Macklem nfsstats.lookupcache_hits, 375*e85b7d75SRick Macklem nfsstats.lookupcache_misses); 3769b50d902SRodney W. Grimes printf(" %9d %9d %9d %9d\n", 3779b50d902SRodney W. Grimes nfsstats.biocache_reads-nfsstats.read_bios, 3789b50d902SRodney W. Grimes nfsstats.read_bios, 3799b50d902SRodney W. Grimes nfsstats.biocache_writes-nfsstats.write_bios, 3809b50d902SRodney W. Grimes nfsstats.write_bios); 381*e85b7d75SRick Macklem } else { 382*e85b7d75SRick Macklem printf("%9d %9d %9d %9d", 383*e85b7d75SRick Macklem ext_nfsstats.attrcache_hits, 384*e85b7d75SRick Macklem ext_nfsstats.attrcache_misses, 385*e85b7d75SRick Macklem ext_nfsstats.lookupcache_hits, 386*e85b7d75SRick Macklem ext_nfsstats.lookupcache_misses); 387*e85b7d75SRick Macklem printf(" %9d %9d %9d %9d\n", 388*e85b7d75SRick Macklem ext_nfsstats.biocache_reads - 389*e85b7d75SRick Macklem ext_nfsstats.read_bios, 390*e85b7d75SRick Macklem ext_nfsstats.read_bios, 391*e85b7d75SRick Macklem ext_nfsstats.biocache_writes - 392*e85b7d75SRick Macklem ext_nfsstats.write_bios, 393*e85b7d75SRick Macklem ext_nfsstats.write_bios); 394*e85b7d75SRick Macklem } 3959b50d902SRodney W. Grimes printf("%9.9s %9.9s %9.9s %9.9s", 3969b50d902SRodney W. Grimes "BioRLHits", "Misses", "BioD Hits", "Misses"); 3974898f742SRuslan Ermilov printf(" %9.9s %9.9s %9.9s %9.9s\n", "DirE Hits", "Misses", "Accs Hits", "Misses"); 398*e85b7d75SRick Macklem if (run_v4 == 0) { 3999b50d902SRodney W. Grimes printf("%9d %9d %9d %9d", 400*e85b7d75SRick Macklem nfsstats.biocache_readlinks - 4019b50d902SRodney W. Grimes nfsstats.readlink_bios, 402*e85b7d75SRick Macklem nfsstats.readlink_bios, 403*e85b7d75SRick Macklem nfsstats.biocache_readdirs - 404*e85b7d75SRick Macklem nfsstats.readdir_bios, 4059b50d902SRodney W. Grimes nfsstats.readdir_bios); 4064898f742SRuslan Ermilov printf(" %9d %9d %9d %9d\n", 407*e85b7d75SRick Macklem nfsstats.direofcache_hits, 408*e85b7d75SRick Macklem nfsstats.direofcache_misses, 409*e85b7d75SRick Macklem nfsstats.accesscache_hits, 410*e85b7d75SRick Macklem nfsstats.accesscache_misses); 411*e85b7d75SRick Macklem } else { 412*e85b7d75SRick Macklem printf("%9d %9d %9d %9d", 413*e85b7d75SRick Macklem ext_nfsstats.biocache_readlinks - 414*e85b7d75SRick Macklem ext_nfsstats.readlink_bios, 415*e85b7d75SRick Macklem ext_nfsstats.readlink_bios, 416*e85b7d75SRick Macklem ext_nfsstats.biocache_readdirs - 417*e85b7d75SRick Macklem ext_nfsstats.readdir_bios, 418*e85b7d75SRick Macklem ext_nfsstats.readdir_bios); 419*e85b7d75SRick Macklem printf(" %9d %9d %9d %9d\n", 420*e85b7d75SRick Macklem ext_nfsstats.direofcache_hits, 421*e85b7d75SRick Macklem ext_nfsstats.direofcache_misses, 422*e85b7d75SRick Macklem ext_nfsstats.accesscache_hits, 423*e85b7d75SRick Macklem ext_nfsstats.accesscache_misses); 4244893ef0bSMatthew Dillon } 425*e85b7d75SRick Macklem } 426*e85b7d75SRick Macklem if (run_v4 == 0 && serverOnly && !nfsrvstatsp) { 42791196234SPeter Wemm printf("Server not present!\n"); 42891196234SPeter Wemm serverOnly = 0; 42991196234SPeter Wemm } 4304893ef0bSMatthew Dillon if (serverOnly) { 4319b50d902SRodney W. Grimes printf("\nServer Info:\n"); 4329b50d902SRodney W. Grimes printf("%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n", 4339b50d902SRodney W. Grimes "Getattr", "Setattr", "Lookup", "Readlink", "Read", 4349b50d902SRodney W. Grimes "Write", "Create", "Remove"); 435*e85b7d75SRick Macklem if (run_v4 == 0) 4369b50d902SRodney W. Grimes printf("%9d %9d %9d %9d %9d %9d %9d %9d\n", 43791196234SPeter Wemm nfsrvstats.srvrpccnt[NFSPROC_GETATTR], 43891196234SPeter Wemm nfsrvstats.srvrpccnt[NFSPROC_SETATTR], 43991196234SPeter Wemm nfsrvstats.srvrpccnt[NFSPROC_LOOKUP], 44091196234SPeter Wemm nfsrvstats.srvrpccnt[NFSPROC_READLINK], 44191196234SPeter Wemm nfsrvstats.srvrpccnt[NFSPROC_READ], 44291196234SPeter Wemm nfsrvstats.srvrpccnt[NFSPROC_WRITE], 44391196234SPeter Wemm nfsrvstats.srvrpccnt[NFSPROC_CREATE], 44491196234SPeter Wemm nfsrvstats.srvrpccnt[NFSPROC_REMOVE]); 445*e85b7d75SRick Macklem else 446*e85b7d75SRick Macklem printf("%9d %9d %9d %9d %9d %9d %9d %9d\n", 447*e85b7d75SRick Macklem ext_nfsstats.srvrpccnt[NFSPROC_GETATTR], 448*e85b7d75SRick Macklem ext_nfsstats.srvrpccnt[NFSPROC_SETATTR], 449*e85b7d75SRick Macklem ext_nfsstats.srvrpccnt[NFSPROC_LOOKUP], 450*e85b7d75SRick Macklem ext_nfsstats.srvrpccnt[NFSPROC_READLINK], 451*e85b7d75SRick Macklem ext_nfsstats.srvrpccnt[NFSPROC_READ], 452*e85b7d75SRick Macklem ext_nfsstats.srvrpccnt[NFSPROC_WRITE], 453*e85b7d75SRick Macklem ext_nfsstats.srvrpccnt[NFSPROC_CREATE], 454*e85b7d75SRick Macklem ext_nfsstats.srvrpccnt[NFSPROC_REMOVE]); 4559b50d902SRodney W. Grimes printf("%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n", 4569b50d902SRodney W. Grimes "Rename", "Link", "Symlink", "Mkdir", "Rmdir", 457a62dc406SDoug Rabson "Readdir", "RdirPlus", "Access"); 458*e85b7d75SRick Macklem if (run_v4 == 0) 4599b50d902SRodney W. Grimes printf("%9d %9d %9d %9d %9d %9d %9d %9d\n", 46091196234SPeter Wemm nfsrvstats.srvrpccnt[NFSPROC_RENAME], 46191196234SPeter Wemm nfsrvstats.srvrpccnt[NFSPROC_LINK], 46291196234SPeter Wemm nfsrvstats.srvrpccnt[NFSPROC_SYMLINK], 46391196234SPeter Wemm nfsrvstats.srvrpccnt[NFSPROC_MKDIR], 46491196234SPeter Wemm nfsrvstats.srvrpccnt[NFSPROC_RMDIR], 46591196234SPeter Wemm nfsrvstats.srvrpccnt[NFSPROC_READDIR], 46691196234SPeter Wemm nfsrvstats.srvrpccnt[NFSPROC_READDIRPLUS], 46791196234SPeter Wemm nfsrvstats.srvrpccnt[NFSPROC_ACCESS]); 468*e85b7d75SRick Macklem else 469*e85b7d75SRick Macklem printf("%9d %9d %9d %9d %9d %9d %9d %9d\n", 470*e85b7d75SRick Macklem ext_nfsstats.srvrpccnt[NFSPROC_RENAME], 471*e85b7d75SRick Macklem ext_nfsstats.srvrpccnt[NFSPROC_LINK], 472*e85b7d75SRick Macklem ext_nfsstats.srvrpccnt[NFSPROC_SYMLINK], 473*e85b7d75SRick Macklem ext_nfsstats.srvrpccnt[NFSPROC_MKDIR], 474*e85b7d75SRick Macklem ext_nfsstats.srvrpccnt[NFSPROC_RMDIR], 475*e85b7d75SRick Macklem ext_nfsstats.srvrpccnt[NFSPROC_READDIR], 476*e85b7d75SRick Macklem ext_nfsstats.srvrpccnt[NFSPROC_READDIRPLUS], 477*e85b7d75SRick Macklem ext_nfsstats.srvrpccnt[NFSPROC_ACCESS]); 47891196234SPeter Wemm printf("%9.9s %9.9s %9.9s %9.9s %9.9s\n", 47991196234SPeter Wemm "Mknod", "Fsstat", "Fsinfo", "PathConf", "Commit"); 480*e85b7d75SRick Macklem if (run_v4 == 0) 48191196234SPeter Wemm printf("%9d %9d %9d %9d %9d\n", 48291196234SPeter Wemm nfsrvstats.srvrpccnt[NFSPROC_MKNOD], 48391196234SPeter Wemm nfsrvstats.srvrpccnt[NFSPROC_FSSTAT], 48491196234SPeter Wemm nfsrvstats.srvrpccnt[NFSPROC_FSINFO], 48591196234SPeter Wemm nfsrvstats.srvrpccnt[NFSPROC_PATHCONF], 48691196234SPeter Wemm nfsrvstats.srvrpccnt[NFSPROC_COMMIT]); 487*e85b7d75SRick Macklem else 488*e85b7d75SRick Macklem printf("%9d %9d %9d %9d %9d\n", 489*e85b7d75SRick Macklem ext_nfsstats.srvrpccnt[NFSPROC_MKNOD], 490*e85b7d75SRick Macklem ext_nfsstats.srvrpccnt[NFSPROC_FSSTAT], 491*e85b7d75SRick Macklem ext_nfsstats.srvrpccnt[NFSPROC_FSINFO], 492*e85b7d75SRick Macklem ext_nfsstats.srvrpccnt[NFSPROC_PATHCONF], 493*e85b7d75SRick Macklem ext_nfsstats.srvrpccnt[NFSPROC_COMMIT]); 4949b50d902SRodney W. Grimes printf("Server Ret-Failed\n"); 495*e85b7d75SRick Macklem if (run_v4 == 0) 49691196234SPeter Wemm printf("%17d\n", nfsrvstats.srvrpc_errs); 497*e85b7d75SRick Macklem else 498*e85b7d75SRick Macklem printf("%17d\n", ext_nfsstats.srvrpc_errs); 4999b50d902SRodney W. Grimes printf("Server Faults\n"); 500*e85b7d75SRick Macklem if (run_v4 == 0) 50191196234SPeter Wemm printf("%13d\n", nfsrvstats.srv_errs); 502*e85b7d75SRick Macklem else 503*e85b7d75SRick Macklem printf("%13d\n", ext_nfsstats.srv_errs); 5049b50d902SRodney W. Grimes printf("Server Cache Stats:\n"); 5059b50d902SRodney W. Grimes printf("%9.9s %9.9s %9.9s %9.9s\n", 5069b50d902SRodney W. Grimes "Inprog", "Idem", "Non-idem", "Misses"); 507*e85b7d75SRick Macklem if (run_v4 == 0) 5089b50d902SRodney W. Grimes printf("%9d %9d %9d %9d\n", 50991196234SPeter Wemm nfsrvstats.srvcache_inproghits, 51091196234SPeter Wemm nfsrvstats.srvcache_idemdonehits, 51191196234SPeter Wemm nfsrvstats.srvcache_nonidemdonehits, 51291196234SPeter Wemm nfsrvstats.srvcache_misses); 513*e85b7d75SRick Macklem else 514*e85b7d75SRick Macklem printf("%9d %9d %9d %9d\n", 515*e85b7d75SRick Macklem ext_nfsstats.srvcache_inproghits, 516*e85b7d75SRick Macklem ext_nfsstats.srvcache_idemdonehits, 517*e85b7d75SRick Macklem ext_nfsstats.srvcache_nonidemdonehits, 518*e85b7d75SRick Macklem ext_nfsstats.srvcache_misses); 519a62dc406SDoug Rabson printf("Server Write Gathering:\n"); 520a62dc406SDoug Rabson printf("%9.9s %9.9s %9.9s\n", 521a62dc406SDoug Rabson "WriteOps", "WriteRPC", "Opsaved"); 522*e85b7d75SRick Macklem if (run_v4 == 0) 523a62dc406SDoug Rabson printf("%9d %9d %9d\n", 52491196234SPeter Wemm nfsrvstats.srvvop_writes, 52591196234SPeter Wemm nfsrvstats.srvrpccnt[NFSPROC_WRITE], 52691196234SPeter Wemm nfsrvstats.srvrpccnt[NFSPROC_WRITE] - 52791196234SPeter Wemm nfsrvstats.srvvop_writes); 528*e85b7d75SRick Macklem else 529*e85b7d75SRick Macklem /* 530*e85b7d75SRick Macklem * The new client doesn't do write gathering. It was 531*e85b7d75SRick Macklem * only useful for NFSv2. 532*e85b7d75SRick Macklem */ 533*e85b7d75SRick Macklem printf("%9d %9d %9d\n", 534*e85b7d75SRick Macklem ext_nfsstats.srvrpccnt[NFSPROC_WRITE], 535*e85b7d75SRick Macklem ext_nfsstats.srvrpccnt[NFSPROC_WRITE], 0); 5364893ef0bSMatthew Dillon } 5379b50d902SRodney W. Grimes } 5389b50d902SRodney W. Grimes 5399b50d902SRodney W. Grimes u_char signalled; /* set if alarm goes off "early" */ 5409b50d902SRodney W. Grimes 5419b50d902SRodney W. Grimes /* 5429b50d902SRodney W. Grimes * Print a running summary of nfs statistics. 5439b50d902SRodney W. Grimes * Repeat display every interval seconds, showing statistics 5449b50d902SRodney W. Grimes * collected over that interval. Assumes that interval is non-zero. 5459b50d902SRodney W. Grimes * First line printed at top of screen is always cumulative. 5469b50d902SRodney W. Grimes */ 5479b50d902SRodney W. Grimes void 5484893ef0bSMatthew Dillon sidewaysintpr(u_int interval, int clientOnly, int serverOnly) 5499b50d902SRodney W. Grimes { 55091196234SPeter Wemm struct nfsstats nfsstats, lastst, *nfsstatsp; 55191196234SPeter Wemm struct nfsrvstats nfsrvstats, lastsrvst, *nfsrvstatsp; 5524893ef0bSMatthew Dillon int hdrcnt = 1; 5539b50d902SRodney W. Grimes 55491196234SPeter Wemm nfsstatsp = &lastst; 55591196234SPeter Wemm nfsrvstatsp = &lastsrvst; 556813947b7SJohn Baldwin readstats(&nfsstatsp, &nfsrvstatsp, 0); 55791196234SPeter Wemm if (clientOnly && !nfsstatsp) { 55891196234SPeter Wemm printf("Client not present!\n"); 55991196234SPeter Wemm clientOnly = 0; 56091196234SPeter Wemm } 56191196234SPeter Wemm if (serverOnly && !nfsrvstatsp) { 56291196234SPeter Wemm printf("Server not present!\n"); 56391196234SPeter Wemm serverOnly = 0; 56491196234SPeter Wemm } 5654893ef0bSMatthew Dillon sleep(interval); 5669b50d902SRodney W. Grimes 5674893ef0bSMatthew Dillon for (;;) { 56891196234SPeter Wemm nfsstatsp = &nfsstats; 56991196234SPeter Wemm nfsrvstatsp = &nfsrvstats; 570813947b7SJohn Baldwin readstats(&nfsstatsp, &nfsrvstatsp, 0); 5714893ef0bSMatthew Dillon 5724893ef0bSMatthew Dillon if (--hdrcnt == 0) { 5734893ef0bSMatthew Dillon printhdr(clientOnly, serverOnly); 5744893ef0bSMatthew Dillon if (clientOnly && serverOnly) 5754893ef0bSMatthew Dillon hdrcnt = 10; 5764893ef0bSMatthew Dillon else 5779b50d902SRodney W. Grimes hdrcnt = 20; 5789b50d902SRodney W. Grimes } 5794893ef0bSMatthew Dillon if (clientOnly) { 5804893ef0bSMatthew Dillon printf("%s %6d %6d %6d %6d %6d %6d %6d %6d", 5814893ef0bSMatthew Dillon ((clientOnly && serverOnly) ? "Client:" : ""), 5824893ef0bSMatthew Dillon DELTA(attrcache_hits) + DELTA(attrcache_misses), 5834893ef0bSMatthew Dillon DELTA(lookupcache_hits) + DELTA(lookupcache_misses), 5844893ef0bSMatthew Dillon DELTA(biocache_readlinks), 5854893ef0bSMatthew Dillon DELTA(biocache_reads), 5864893ef0bSMatthew Dillon DELTA(biocache_writes), 587a62dc406SDoug Rabson nfsstats.rpccnt[NFSPROC_RENAME]-lastst.rpccnt[NFSPROC_RENAME], 5884893ef0bSMatthew Dillon DELTA(accesscache_hits) + DELTA(accesscache_misses), 5894893ef0bSMatthew Dillon DELTA(biocache_readdirs) 5904893ef0bSMatthew Dillon ); 5914893ef0bSMatthew Dillon if (widemode) { 5924893ef0bSMatthew Dillon printf(" %s %s %s %s %s %s", 5934893ef0bSMatthew Dillon sperc1(DELTA(attrcache_hits), 5944893ef0bSMatthew Dillon DELTA(attrcache_misses)), 5954893ef0bSMatthew Dillon sperc1(DELTA(lookupcache_hits), 5964893ef0bSMatthew Dillon DELTA(lookupcache_misses)), 5974893ef0bSMatthew Dillon sperc2(DELTA(biocache_reads), 5984893ef0bSMatthew Dillon DELTA(read_bios)), 5994893ef0bSMatthew Dillon sperc2(DELTA(biocache_writes), 6004893ef0bSMatthew Dillon DELTA(write_bios)), 6014893ef0bSMatthew Dillon sperc1(DELTA(accesscache_hits), 6024893ef0bSMatthew Dillon DELTA(accesscache_misses)), 6034893ef0bSMatthew Dillon sperc2(DELTA(biocache_readdirs), 6044893ef0bSMatthew Dillon DELTA(readdir_bios)) 6054893ef0bSMatthew Dillon ); 6064893ef0bSMatthew Dillon } 6074893ef0bSMatthew Dillon printf("\n"); 60891196234SPeter Wemm lastst = nfsstats; 6094893ef0bSMatthew Dillon } 6104893ef0bSMatthew Dillon if (serverOnly) { 6114893ef0bSMatthew Dillon printf("%s %6d %6d %6d %6d %6d %6d %6d %6d", 6124893ef0bSMatthew Dillon ((clientOnly && serverOnly) ? "Server:" : ""), 61391196234SPeter Wemm nfsrvstats.srvrpccnt[NFSPROC_GETATTR]-lastsrvst.srvrpccnt[NFSPROC_GETATTR], 61491196234SPeter Wemm nfsrvstats.srvrpccnt[NFSPROC_LOOKUP]-lastsrvst.srvrpccnt[NFSPROC_LOOKUP], 61591196234SPeter Wemm nfsrvstats.srvrpccnt[NFSPROC_READLINK]-lastsrvst.srvrpccnt[NFSPROC_READLINK], 61691196234SPeter Wemm nfsrvstats.srvrpccnt[NFSPROC_READ]-lastsrvst.srvrpccnt[NFSPROC_READ], 61791196234SPeter Wemm nfsrvstats.srvrpccnt[NFSPROC_WRITE]-lastsrvst.srvrpccnt[NFSPROC_WRITE], 61891196234SPeter Wemm nfsrvstats.srvrpccnt[NFSPROC_RENAME]-lastsrvst.srvrpccnt[NFSPROC_RENAME], 61991196234SPeter Wemm nfsrvstats.srvrpccnt[NFSPROC_ACCESS]-lastsrvst.srvrpccnt[NFSPROC_ACCESS], 62091196234SPeter Wemm (nfsrvstats.srvrpccnt[NFSPROC_READDIR]-lastsrvst.srvrpccnt[NFSPROC_READDIR]) 62191196234SPeter Wemm +(nfsrvstats.srvrpccnt[NFSPROC_READDIRPLUS]-lastsrvst.srvrpccnt[NFSPROC_READDIRPLUS])); 6224893ef0bSMatthew Dillon printf("\n"); 62391196234SPeter Wemm lastsrvst = nfsrvstats; 6244893ef0bSMatthew Dillon } 6259b50d902SRodney W. Grimes fflush(stdout); 6264893ef0bSMatthew Dillon sleep(interval); 6279b50d902SRodney W. Grimes } 6289b50d902SRodney W. Grimes /*NOTREACHED*/ 6299b50d902SRodney W. Grimes } 6309b50d902SRodney W. Grimes 6319b50d902SRodney W. Grimes void 6324893ef0bSMatthew Dillon printhdr(int clientOnly, int serverOnly) 6339b50d902SRodney W. Grimes { 6344893ef0bSMatthew Dillon printf("%s%6.6s %6.6s %6.6s %6.6s %6.6s %6.6s %6.6s %6.6s", 6354893ef0bSMatthew Dillon ((serverOnly && clientOnly) ? " " : " "), 6364893ef0bSMatthew Dillon "GtAttr", "Lookup", "Rdlink", "Read", "Write", "Rename", 6374893ef0bSMatthew Dillon "Access", "Rddir"); 6384893ef0bSMatthew Dillon if (widemode && clientOnly) { 6394893ef0bSMatthew Dillon printf(" Attr Lkup BioR BioW Accs BioD"); 6409b50d902SRodney W. Grimes } 6414893ef0bSMatthew Dillon printf("\n"); 6424893ef0bSMatthew Dillon fflush(stdout); 6439b50d902SRodney W. Grimes } 6449b50d902SRodney W. Grimes 6459b50d902SRodney W. Grimes void 646813947b7SJohn Baldwin usage(void) 6479b50d902SRodney W. Grimes { 6489b50d902SRodney W. Grimes (void)fprintf(stderr, 64961a2fc1fSRick Macklem "usage: nfsstat [-ceszW] [-M core] [-N system] [-w interval]\n"); 6509b50d902SRodney W. Grimes exit(1); 6519b50d902SRodney W. Grimes } 6524893ef0bSMatthew Dillon 6534893ef0bSMatthew Dillon static char SPBuf[64][8]; 6544893ef0bSMatthew Dillon static int SPIndex; 6554893ef0bSMatthew Dillon 6564893ef0bSMatthew Dillon char * 6574893ef0bSMatthew Dillon sperc1(int hits, int misses) 6584893ef0bSMatthew Dillon { 6594893ef0bSMatthew Dillon char *p = SPBuf[SPIndex]; 6604893ef0bSMatthew Dillon 6614893ef0bSMatthew Dillon if (hits + misses) { 6624893ef0bSMatthew Dillon sprintf(p, "%3d%%", 6634893ef0bSMatthew Dillon (int)(char)((quad_t)hits * 100 / (hits + misses))); 6644893ef0bSMatthew Dillon } else { 6654893ef0bSMatthew Dillon sprintf(p, " -"); 6664893ef0bSMatthew Dillon } 6674893ef0bSMatthew Dillon SPIndex = (SPIndex + 1) & 63; 6684893ef0bSMatthew Dillon return(p); 6694893ef0bSMatthew Dillon } 6704893ef0bSMatthew Dillon 6714893ef0bSMatthew Dillon char * 6724893ef0bSMatthew Dillon sperc2(int ttl, int misses) 6734893ef0bSMatthew Dillon { 6744893ef0bSMatthew Dillon char *p = SPBuf[SPIndex]; 6754893ef0bSMatthew Dillon 6764893ef0bSMatthew Dillon if (ttl) { 6774893ef0bSMatthew Dillon sprintf(p, "%3d%%", 6784893ef0bSMatthew Dillon (int)(char)((quad_t)(ttl - misses) * 100 / ttl)); 6794893ef0bSMatthew Dillon } else { 6804893ef0bSMatthew Dillon sprintf(p, " -"); 6814893ef0bSMatthew Dillon } 6824893ef0bSMatthew Dillon SPIndex = (SPIndex + 1) & 63; 6834893ef0bSMatthew Dillon return(p); 6844893ef0bSMatthew Dillon } 6854893ef0bSMatthew Dillon 686bcdaa850SRick Macklem /* 687bcdaa850SRick Macklem * Print a description of the nfs stats for the experimental client/server. 688bcdaa850SRick Macklem */ 689bcdaa850SRick Macklem void 690bcdaa850SRick Macklem exp_intpr(int clientOnly, int serverOnly) 691bcdaa850SRick Macklem { 6920e8f7d19SRick Macklem int nfssvc_flag; 693bcdaa850SRick Macklem 6940e8f7d19SRick Macklem nfssvc_flag = NFSSVC_GETSTATS; 6950e8f7d19SRick Macklem if (zflag != 0) { 6960e8f7d19SRick Macklem if (clientOnly != 0) 6970e8f7d19SRick Macklem nfssvc_flag |= NFSSVC_ZEROCLTSTATS; 6980e8f7d19SRick Macklem if (serverOnly != 0) 6990e8f7d19SRick Macklem nfssvc_flag |= NFSSVC_ZEROSRVSTATS; 7000e8f7d19SRick Macklem } 7010e8f7d19SRick Macklem if (nfssvc(nfssvc_flag, &ext_nfsstats) < 0) 7020e8f7d19SRick Macklem err(1, "Can't get stats"); 703bcdaa850SRick Macklem if (clientOnly != 0) { 704bcdaa850SRick Macklem if (printtitle) { 705bcdaa850SRick Macklem printf("Client Info:\n"); 706bcdaa850SRick Macklem printf("Rpc Counts:\n"); 707bcdaa850SRick Macklem printf( 708bcdaa850SRick Macklem "%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n" 709bcdaa850SRick Macklem , "Getattr", "Setattr", "Lookup", "Readlink", 710bcdaa850SRick Macklem "Read", "Write", "Create", "Remove"); 711bcdaa850SRick Macklem } 712bcdaa850SRick Macklem printf("%9d %9d %9d %9d %9d %9d %9d %9d\n", 713bcdaa850SRick Macklem ext_nfsstats.rpccnt[NFSPROC_GETATTR], 714bcdaa850SRick Macklem ext_nfsstats.rpccnt[NFSPROC_SETATTR], 715bcdaa850SRick Macklem ext_nfsstats.rpccnt[NFSPROC_LOOKUP], 716bcdaa850SRick Macklem ext_nfsstats.rpccnt[NFSPROC_READLINK], 717bcdaa850SRick Macklem ext_nfsstats.rpccnt[NFSPROC_READ], 718bcdaa850SRick Macklem ext_nfsstats.rpccnt[NFSPROC_WRITE], 719bcdaa850SRick Macklem ext_nfsstats.rpccnt[NFSPROC_CREATE], 720bcdaa850SRick Macklem ext_nfsstats.rpccnt[NFSPROC_REMOVE]); 721bcdaa850SRick Macklem if (printtitle) 722bcdaa850SRick Macklem printf( 723bcdaa850SRick Macklem "%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n" 724bcdaa850SRick Macklem , "Rename", "Link", "Symlink", "Mkdir", "Rmdir", 725bcdaa850SRick Macklem "Readdir", "RdirPlus", "Access"); 726bcdaa850SRick Macklem printf("%9d %9d %9d %9d %9d %9d %9d %9d\n", 727bcdaa850SRick Macklem ext_nfsstats.rpccnt[NFSPROC_RENAME], 728bcdaa850SRick Macklem ext_nfsstats.rpccnt[NFSPROC_LINK], 729bcdaa850SRick Macklem ext_nfsstats.rpccnt[NFSPROC_SYMLINK], 730bcdaa850SRick Macklem ext_nfsstats.rpccnt[NFSPROC_MKDIR], 731bcdaa850SRick Macklem ext_nfsstats.rpccnt[NFSPROC_RMDIR], 732bcdaa850SRick Macklem ext_nfsstats.rpccnt[NFSPROC_READDIR], 733bcdaa850SRick Macklem ext_nfsstats.rpccnt[NFSPROC_READDIRPLUS], 734bcdaa850SRick Macklem ext_nfsstats.rpccnt[NFSPROC_ACCESS]); 735bcdaa850SRick Macklem if (printtitle) 736bcdaa850SRick Macklem printf( 737bcdaa850SRick Macklem "%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n" 738bcdaa850SRick Macklem , "Mknod", "Fsstat", "Fsinfo", "PathConf", 739bcdaa850SRick Macklem "Commit", "SetClId", "SetClIdCf", "Lock"); 740bcdaa850SRick Macklem printf("%9d %9d %9d %9d %9d %9d %9d %9d\n", 741bcdaa850SRick Macklem ext_nfsstats.rpccnt[NFSPROC_MKNOD], 742bcdaa850SRick Macklem ext_nfsstats.rpccnt[NFSPROC_FSSTAT], 743bcdaa850SRick Macklem ext_nfsstats.rpccnt[NFSPROC_FSINFO], 744bcdaa850SRick Macklem ext_nfsstats.rpccnt[NFSPROC_PATHCONF], 745bcdaa850SRick Macklem ext_nfsstats.rpccnt[NFSPROC_COMMIT], 746bcdaa850SRick Macklem ext_nfsstats.rpccnt[NFSPROC_SETCLIENTID], 747bcdaa850SRick Macklem ext_nfsstats.rpccnt[NFSPROC_SETCLIENTIDCFRM], 748bcdaa850SRick Macklem ext_nfsstats.rpccnt[NFSPROC_LOCK]); 749bcdaa850SRick Macklem if (printtitle) 750bcdaa850SRick Macklem printf("%9.9s %9.9s %9.9s %9.9s\n", 751bcdaa850SRick Macklem "LockT", "LockU", "Open", "OpenCfr"); 752bcdaa850SRick Macklem printf("%9d %9d %9d %9d\n", 753bcdaa850SRick Macklem ext_nfsstats.rpccnt[NFSPROC_LOCKT], 754bcdaa850SRick Macklem ext_nfsstats.rpccnt[NFSPROC_LOCKU], 755bcdaa850SRick Macklem ext_nfsstats.rpccnt[NFSPROC_OPEN], 756bcdaa850SRick Macklem ext_nfsstats.rpccnt[NFSPROC_OPENCONFIRM]); 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 , "OpenOwner", "Opens", "LockOwner", 761bcdaa850SRick Macklem "Locks", "Delegs", "LocalOwn", 762bcdaa850SRick Macklem "LocalOpen", "LocalLOwn"); 763bcdaa850SRick Macklem printf("%9d %9d %9d %9d %9d %9d %9d %9d\n", 764bcdaa850SRick Macklem ext_nfsstats.clopenowners, 765bcdaa850SRick Macklem ext_nfsstats.clopens, 766bcdaa850SRick Macklem ext_nfsstats.cllockowners, 767bcdaa850SRick Macklem ext_nfsstats.cllocks, 768bcdaa850SRick Macklem ext_nfsstats.cldelegates, 769bcdaa850SRick Macklem ext_nfsstats.cllocalopenowners, 770bcdaa850SRick Macklem ext_nfsstats.cllocalopens, 771bcdaa850SRick Macklem ext_nfsstats.cllocallockowners); 772bcdaa850SRick Macklem if (printtitle) 773bcdaa850SRick Macklem printf("%9.9s\n", "LocalLock"); 774bcdaa850SRick Macklem printf("%9d\n", ext_nfsstats.cllocallocks); 775bcdaa850SRick Macklem if (printtitle) { 776bcdaa850SRick Macklem printf("Rpc Info:\n"); 777bcdaa850SRick Macklem printf("%9.9s %9.9s %9.9s %9.9s %9.9s\n", 778bcdaa850SRick Macklem "TimedOut", "Invalid", "X Replies", "Retries", 779bcdaa850SRick Macklem "Requests"); 780bcdaa850SRick Macklem } 781bcdaa850SRick Macklem printf("%9d %9d %9d %9d %9d\n", 782bcdaa850SRick Macklem ext_nfsstats.rpctimeouts, 783bcdaa850SRick Macklem ext_nfsstats.rpcinvalid, 784bcdaa850SRick Macklem ext_nfsstats.rpcunexpected, 785bcdaa850SRick Macklem ext_nfsstats.rpcretries, 786bcdaa850SRick Macklem ext_nfsstats.rpcrequests); 787bcdaa850SRick Macklem if (printtitle) { 788bcdaa850SRick Macklem printf("Cache Info:\n"); 789bcdaa850SRick Macklem printf("%9.9s %9.9s %9.9s %9.9s", 790bcdaa850SRick Macklem "Attr Hits", "Misses", "Lkup Hits", "Misses"); 791bcdaa850SRick Macklem printf(" %9.9s %9.9s %9.9s %9.9s\n", 792bcdaa850SRick Macklem "BioR Hits", "Misses", "BioW Hits", "Misses"); 793bcdaa850SRick Macklem } 794bcdaa850SRick Macklem printf("%9d %9d %9d %9d", 795bcdaa850SRick Macklem ext_nfsstats.attrcache_hits, 796bcdaa850SRick Macklem ext_nfsstats.attrcache_misses, 797bcdaa850SRick Macklem ext_nfsstats.lookupcache_hits, 798bcdaa850SRick Macklem ext_nfsstats.lookupcache_misses); 799bcdaa850SRick Macklem printf(" %9d %9d %9d %9d\n", 800c01be3b7SRick Macklem ext_nfsstats.biocache_reads - ext_nfsstats.read_bios, 801bcdaa850SRick Macklem ext_nfsstats.read_bios, 802c01be3b7SRick Macklem ext_nfsstats.biocache_writes - ext_nfsstats.write_bios, 803bcdaa850SRick Macklem ext_nfsstats.write_bios); 804bcdaa850SRick Macklem if (printtitle) { 805bcdaa850SRick Macklem printf("%9.9s %9.9s %9.9s %9.9s", 806bcdaa850SRick Macklem "BioRLHits", "Misses", "BioD Hits", "Misses"); 807bcdaa850SRick Macklem printf(" %9.9s %9.9s\n", "DirE Hits", "Misses"); 808bcdaa850SRick Macklem } 809bcdaa850SRick Macklem printf("%9d %9d %9d %9d", 810c01be3b7SRick Macklem ext_nfsstats.biocache_readlinks - 811bcdaa850SRick Macklem ext_nfsstats.readlink_bios, 812c01be3b7SRick Macklem ext_nfsstats.readlink_bios, 813c01be3b7SRick Macklem ext_nfsstats.biocache_readdirs - 814c01be3b7SRick Macklem ext_nfsstats.readdir_bios, 815bcdaa850SRick Macklem ext_nfsstats.readdir_bios); 816bcdaa850SRick Macklem printf(" %9d %9d\n", 817bcdaa850SRick Macklem ext_nfsstats.direofcache_hits, 818bcdaa850SRick Macklem ext_nfsstats.direofcache_misses); 819bcdaa850SRick Macklem } 820bcdaa850SRick Macklem if (serverOnly != 0) { 821bcdaa850SRick Macklem if (printtitle) { 822bcdaa850SRick Macklem printf("\nServer Info:\n"); 823bcdaa850SRick Macklem printf( 824bcdaa850SRick Macklem "%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n" 825bcdaa850SRick Macklem , "Getattr", "Setattr", "Lookup", "Readlink", 826bcdaa850SRick Macklem "Read", "Write", "Create", "Remove"); 827bcdaa850SRick Macklem } 828bcdaa850SRick Macklem printf("%9d %9d %9d %9d %9d %9d %9d %9d\n", 829bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_GETATTR], 830bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_SETATTR], 831bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_LOOKUP], 832bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_READLINK], 833bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_READ], 834bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_WRITE], 835bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_V3CREATE], 836bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_REMOVE]); 837bcdaa850SRick Macklem if (printtitle) 838bcdaa850SRick Macklem printf( 839bcdaa850SRick Macklem "%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n" 840bcdaa850SRick Macklem , "Rename", "Link", "Symlink", "Mkdir", "Rmdir", 841bcdaa850SRick Macklem "Readdir", "RdirPlus", "Access"); 842bcdaa850SRick Macklem printf("%9d %9d %9d %9d %9d %9d %9d %9d\n", 843bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_RENAME], 844bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_LINK], 845bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_SYMLINK], 846bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_MKDIR], 847bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_RMDIR], 848bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_READDIR], 849bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_READDIRPLUS], 850bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_ACCESS]); 851bcdaa850SRick Macklem if (printtitle) 852bcdaa850SRick Macklem printf( 853bcdaa850SRick Macklem "%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n" 854bcdaa850SRick Macklem , "Mknod", "Fsstat", "Fsinfo", "PathConf", 855bcdaa850SRick Macklem "Commit", "LookupP", "SetClId", "SetClIdCf"); 856bcdaa850SRick Macklem printf("%9d %9d %9d %9d %9d %9d %9d %9d\n", 857bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_MKNOD], 858bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_FSSTAT], 859bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_FSINFO], 860bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_PATHCONF], 861bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_COMMIT], 862bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_LOOKUPP], 863bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_SETCLIENTID], 864bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_SETCLIENTIDCFRM]); 865bcdaa850SRick Macklem if (printtitle) 866bcdaa850SRick Macklem printf( 867bcdaa850SRick Macklem "%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n" 868bcdaa850SRick Macklem , "Open", "OpenAttr", "OpenDwnGr", "OpenCfrm", 869bcdaa850SRick Macklem "DelePurge", "DeleRet", "GetFH", "Lock"); 870bcdaa850SRick Macklem printf("%9d %9d %9d %9d %9d %9d %9d %9d\n", 871bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_OPEN], 872bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_OPENATTR], 873bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_OPENDOWNGRADE], 874bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_OPENCONFIRM], 875bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_DELEGPURGE], 876bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_DELEGRETURN], 877bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_GETFH], 878bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_LOCK]); 879bcdaa850SRick Macklem if (printtitle) 880bcdaa850SRick Macklem printf( 881bcdaa850SRick Macklem "%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n" 882bcdaa850SRick Macklem , "LockT", "LockU", "Close", "Verify", "NVerify", 883bcdaa850SRick Macklem "PutFH", "PutPubFH", "PutRootFH"); 884bcdaa850SRick Macklem printf("%9d %9d %9d %9d %9d %9d %9d %9d\n", 885bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_LOCKT], 886bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_LOCKU], 887bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_CLOSE], 888bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_VERIFY], 889bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_NVERIFY], 890bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_PUTFH], 891bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_PUTPUBFH], 892bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_PUTROOTFH]); 893bcdaa850SRick Macklem if (printtitle) 894bcdaa850SRick Macklem printf("%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n", 895bcdaa850SRick Macklem "Renew", "RestoreFH", "SaveFH", "Secinfo", 896bcdaa850SRick Macklem "RelLckOwn", "V4Create"); 897bcdaa850SRick Macklem printf("%9d %9d %9d %9d %9d %9d\n", 898bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_RENEW], 899bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_RESTOREFH], 900bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_SAVEFH], 901bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_SECINFO], 902bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_RELEASELCKOWN], 903bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_CREATE]); 904bcdaa850SRick Macklem if (printtitle) { 905bcdaa850SRick Macklem printf("Server:\n"); 906bcdaa850SRick Macklem printf("%9.9s %9.9s %9.9s\n", 907bcdaa850SRick Macklem "Retfailed", "Faults", "Clients"); 908bcdaa850SRick Macklem } 909bcdaa850SRick Macklem printf("%9d %9d %9d\n", 910bcdaa850SRick Macklem ext_nfsstats.srv_errs, ext_nfsstats.srvrpc_errs, 911bcdaa850SRick Macklem ext_nfsstats.srvclients); 912bcdaa850SRick Macklem if (printtitle) 913bcdaa850SRick Macklem printf("%9.9s %9.9s %9.9s %9.9s %9.9s \n", 914bcdaa850SRick Macklem "OpenOwner", "Opens", "LockOwner", 915bcdaa850SRick Macklem "Locks", "Delegs"); 916bcdaa850SRick Macklem printf("%9d %9d %9d %9d %9d \n", 917bcdaa850SRick Macklem ext_nfsstats.srvopenowners, 918bcdaa850SRick Macklem ext_nfsstats.srvopens, 919bcdaa850SRick Macklem ext_nfsstats.srvlockowners, 920bcdaa850SRick Macklem ext_nfsstats.srvlocks, 921bcdaa850SRick Macklem ext_nfsstats.srvdelegates); 922bcdaa850SRick Macklem if (printtitle) { 923bcdaa850SRick Macklem printf("Server Cache Stats:\n"); 924bcdaa850SRick Macklem printf("%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n", 925bcdaa850SRick Macklem "Inprog", "Idem", "Non-idem", "Misses", 926bcdaa850SRick Macklem "CacheSize", "TCPPeak"); 927bcdaa850SRick Macklem } 928bcdaa850SRick Macklem printf("%9d %9d %9d %9d %9d %9d\n", 929bcdaa850SRick Macklem ext_nfsstats.srvcache_inproghits, 930bcdaa850SRick Macklem ext_nfsstats.srvcache_idemdonehits, 931bcdaa850SRick Macklem ext_nfsstats.srvcache_nonidemdonehits, 932bcdaa850SRick Macklem ext_nfsstats.srvcache_misses, 933bcdaa850SRick Macklem ext_nfsstats.srvcache_size, 934bcdaa850SRick Macklem ext_nfsstats.srvcache_tcppeak); 935bcdaa850SRick Macklem } 936bcdaa850SRick Macklem } 937bcdaa850SRick Macklem 938bcdaa850SRick Macklem /* 939bcdaa850SRick Macklem * Print a running summary of nfs statistics for the experimental client and/or 940bcdaa850SRick Macklem * server. 941bcdaa850SRick Macklem * Repeat display every interval seconds, showing statistics 942bcdaa850SRick Macklem * collected over that interval. Assumes that interval is non-zero. 943bcdaa850SRick Macklem * First line printed at top of screen is always cumulative. 944bcdaa850SRick Macklem */ 945bcdaa850SRick Macklem void 946bcdaa850SRick Macklem exp_sidewaysintpr(u_int interval, int clientOnly, int serverOnly) 947bcdaa850SRick Macklem { 948bcdaa850SRick Macklem struct ext_nfsstats nfsstats, lastst, *ext_nfsstatsp; 949bcdaa850SRick Macklem int hdrcnt = 1; 950bcdaa850SRick Macklem 951bcdaa850SRick Macklem ext_nfsstatsp = &lastst; 952785b2572SRick Macklem if (nfssvc(NFSSVC_GETSTATS, ext_nfsstatsp) < 0) 953bcdaa850SRick Macklem err(1, "Can't get stats"); 954bcdaa850SRick Macklem sleep(interval); 955bcdaa850SRick Macklem 956bcdaa850SRick Macklem for (;;) { 957bcdaa850SRick Macklem ext_nfsstatsp = &nfsstats; 958785b2572SRick Macklem if (nfssvc(NFSSVC_GETSTATS, ext_nfsstatsp) < 0) 959bcdaa850SRick Macklem err(1, "Can't get stats"); 960bcdaa850SRick Macklem 961bcdaa850SRick Macklem if (--hdrcnt == 0) { 962bcdaa850SRick Macklem printhdr(clientOnly, serverOnly); 963bcdaa850SRick Macklem if (clientOnly && serverOnly) 964bcdaa850SRick Macklem hdrcnt = 10; 965bcdaa850SRick Macklem else 966bcdaa850SRick Macklem hdrcnt = 20; 967bcdaa850SRick Macklem } 968bcdaa850SRick Macklem if (clientOnly) { 969bcdaa850SRick Macklem printf("%s %6d %6d %6d %6d %6d %6d %6d %6d", 970bcdaa850SRick Macklem ((clientOnly && serverOnly) ? "Client:" : ""), 971bcdaa850SRick Macklem DELTA(attrcache_hits) + DELTA(attrcache_misses), 972bcdaa850SRick Macklem DELTA(lookupcache_hits) + DELTA(lookupcache_misses), 973bcdaa850SRick Macklem DELTA(biocache_readlinks), 974bcdaa850SRick Macklem DELTA(biocache_reads), 975bcdaa850SRick Macklem DELTA(biocache_writes), 976bcdaa850SRick Macklem nfsstats.rpccnt[NFSPROC_RENAME] - 977bcdaa850SRick Macklem lastst.rpccnt[NFSPROC_RENAME], 978bcdaa850SRick Macklem DELTA(accesscache_hits) + DELTA(accesscache_misses), 979bcdaa850SRick Macklem DELTA(biocache_readdirs) 980bcdaa850SRick Macklem ); 981bcdaa850SRick Macklem if (widemode) { 982bcdaa850SRick Macklem printf(" %s %s %s %s %s %s", 983bcdaa850SRick Macklem sperc1(DELTA(attrcache_hits), 984bcdaa850SRick Macklem DELTA(attrcache_misses)), 985bcdaa850SRick Macklem sperc1(DELTA(lookupcache_hits), 986bcdaa850SRick Macklem DELTA(lookupcache_misses)), 987bcdaa850SRick Macklem sperc2(DELTA(biocache_reads), 988bcdaa850SRick Macklem DELTA(read_bios)), 989bcdaa850SRick Macklem sperc2(DELTA(biocache_writes), 990bcdaa850SRick Macklem DELTA(write_bios)), 991bcdaa850SRick Macklem sperc1(DELTA(accesscache_hits), 992bcdaa850SRick Macklem DELTA(accesscache_misses)), 993bcdaa850SRick Macklem sperc2(DELTA(biocache_readdirs), 994bcdaa850SRick Macklem DELTA(readdir_bios)) 995bcdaa850SRick Macklem ); 996bcdaa850SRick Macklem } 997bcdaa850SRick Macklem printf("\n"); 998bcdaa850SRick Macklem lastst = nfsstats; 999bcdaa850SRick Macklem } 1000bcdaa850SRick Macklem if (serverOnly) { 1001bcdaa850SRick Macklem printf("%s %6d %6d %6d %6d %6d %6d %6d %6d", 1002bcdaa850SRick Macklem ((clientOnly && serverOnly) ? "Server:" : ""), 1003bcdaa850SRick Macklem nfsstats.srvrpccnt[NFSPROC_GETATTR] - 1004bcdaa850SRick Macklem lastst.srvrpccnt[NFSPROC_GETATTR], 1005bcdaa850SRick Macklem nfsstats.srvrpccnt[NFSPROC_LOOKUP] - 1006bcdaa850SRick Macklem lastst.srvrpccnt[NFSPROC_LOOKUP], 1007bcdaa850SRick Macklem nfsstats.srvrpccnt[NFSPROC_READLINK] - 1008bcdaa850SRick Macklem lastst.srvrpccnt[NFSPROC_READLINK], 1009bcdaa850SRick Macklem nfsstats.srvrpccnt[NFSPROC_READ] - 1010bcdaa850SRick Macklem lastst.srvrpccnt[NFSPROC_READ], 1011bcdaa850SRick Macklem nfsstats.srvrpccnt[NFSPROC_WRITE] - 1012bcdaa850SRick Macklem lastst.srvrpccnt[NFSPROC_WRITE], 1013bcdaa850SRick Macklem nfsstats.srvrpccnt[NFSPROC_RENAME] - 1014bcdaa850SRick Macklem lastst.srvrpccnt[NFSPROC_RENAME], 1015bcdaa850SRick Macklem nfsstats.srvrpccnt[NFSPROC_ACCESS] - 1016bcdaa850SRick Macklem lastst.srvrpccnt[NFSPROC_ACCESS], 1017bcdaa850SRick Macklem (nfsstats.srvrpccnt[NFSPROC_READDIR] - 1018bcdaa850SRick Macklem lastst.srvrpccnt[NFSPROC_READDIR]) + 1019bcdaa850SRick Macklem (nfsstats.srvrpccnt[NFSPROC_READDIRPLUS] - 1020bcdaa850SRick Macklem lastst.srvrpccnt[NFSPROC_READDIRPLUS])); 1021bcdaa850SRick Macklem printf("\n"); 1022bcdaa850SRick Macklem lastst = nfsstats; 1023bcdaa850SRick Macklem } 1024bcdaa850SRick Macklem fflush(stdout); 1025bcdaa850SRick Macklem sleep(interval); 1026bcdaa850SRick Macklem } 1027bcdaa850SRick Macklem /*NOTREACHED*/ 1028bcdaa850SRick Macklem } 1029bcdaa850SRick Macklem 1030