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 824893ef0bSMatthew Dillon static int widemode = 0; 83813947b7SJohn Baldwin static int zflag = 0; 84bcdaa850SRick Macklem static int printtitle = 1; 85bcdaa850SRick Macklem static struct ext_nfsstats ext_nfsstats; 86e85b7d75SRick Macklem static int extra_output = 0; 8707e532e7SGarrett Wollman 88*722e2552SEdward Tomasz Napierala static void intpr(int, int); 89*722e2552SEdward Tomasz Napierala static void printhdr(int, int); 90*722e2552SEdward Tomasz Napierala static void usage(void); 91*722e2552SEdward Tomasz Napierala static char *sperc1(int, int); 92*722e2552SEdward Tomasz Napierala static char *sperc2(int, int); 93*722e2552SEdward Tomasz Napierala static void exp_intpr(int, int); 94*722e2552SEdward Tomasz Napierala static void exp_sidewaysintpr(u_int, int, int); 954893ef0bSMatthew Dillon 964893ef0bSMatthew Dillon #define DELTA(field) (nfsstats.field - lastst.field) 979b50d902SRodney W. Grimes 9870c3c978SStefan Farfeleder int 99813947b7SJohn Baldwin main(int argc, char **argv) 1009b50d902SRodney W. Grimes { 1019b50d902SRodney W. Grimes u_int interval; 1024893ef0bSMatthew Dillon int clientOnly = -1; 1034893ef0bSMatthew Dillon int serverOnly = -1; 1049b50d902SRodney W. Grimes int ch; 1059b50d902SRodney W. Grimes char *memf, *nlistf; 106a6c903b8SRick Macklem int mntlen, i; 107a6c903b8SRick Macklem char buf[1024]; 108a6c903b8SRick Macklem struct statfs *mntbuf; 109a6c903b8SRick Macklem struct nfscl_dumpmntopts dumpmntopts; 1109b50d902SRodney W. Grimes 1119b50d902SRodney W. Grimes interval = 0; 1129b50d902SRodney W. Grimes memf = nlistf = NULL; 113*722e2552SEdward Tomasz Napierala while ((ch = getopt(argc, argv, "cesWM:mN:w:z")) != -1) 1149b50d902SRodney W. Grimes switch(ch) { 1159b50d902SRodney W. Grimes case 'M': 1169b50d902SRodney W. Grimes memf = optarg; 1179b50d902SRodney W. Grimes break; 118a6c903b8SRick Macklem case 'm': 119a6c903b8SRick Macklem /* Display mount options for NFS mount points. */ 120a6c903b8SRick Macklem mntlen = getmntinfo(&mntbuf, MNT_NOWAIT); 121a6c903b8SRick Macklem for (i = 0; i < mntlen; i++) { 122a6c903b8SRick Macklem if (strcmp(mntbuf->f_fstypename, "nfs") == 0) { 123a6c903b8SRick Macklem dumpmntopts.ndmnt_fname = 124a6c903b8SRick Macklem mntbuf->f_mntonname; 125a6c903b8SRick Macklem dumpmntopts.ndmnt_buf = buf; 126a6c903b8SRick Macklem dumpmntopts.ndmnt_blen = sizeof(buf); 127a6c903b8SRick Macklem if (nfssvc(NFSSVC_DUMPMNTOPTS, 128a6c903b8SRick Macklem &dumpmntopts) >= 0) 129a6c903b8SRick Macklem printf("%s on %s\n%s\n", 130a6c903b8SRick Macklem mntbuf->f_mntfromname, 131a6c903b8SRick Macklem mntbuf->f_mntonname, buf); 1327c44c114SRick Macklem else if (errno == EPERM) 1337c44c114SRick Macklem errx(1, "Only priviledged users" 1347c44c114SRick Macklem " can use the -m option"); 135a6c903b8SRick Macklem } 136a6c903b8SRick Macklem mntbuf++; 137a6c903b8SRick Macklem } 138a6c903b8SRick Macklem exit(0); 1399b50d902SRodney W. Grimes case 'N': 1409b50d902SRodney W. Grimes nlistf = optarg; 1419b50d902SRodney W. Grimes break; 1424893ef0bSMatthew Dillon case 'W': 1434893ef0bSMatthew Dillon widemode = 1; 1444893ef0bSMatthew Dillon break; 1459b50d902SRodney W. Grimes case 'w': 1469b50d902SRodney W. Grimes interval = atoi(optarg); 1479b50d902SRodney W. Grimes break; 1484893ef0bSMatthew Dillon case 'c': 1494893ef0bSMatthew Dillon clientOnly = 1; 1504893ef0bSMatthew Dillon if (serverOnly < 0) 1514893ef0bSMatthew Dillon serverOnly = 0; 1524893ef0bSMatthew Dillon break; 1534893ef0bSMatthew Dillon case 's': 1544893ef0bSMatthew Dillon serverOnly = 1; 1554893ef0bSMatthew Dillon if (clientOnly < 0) 1564893ef0bSMatthew Dillon clientOnly = 0; 1574893ef0bSMatthew Dillon break; 158813947b7SJohn Baldwin case 'z': 159813947b7SJohn Baldwin zflag = 1; 160813947b7SJohn Baldwin break; 16161a2fc1fSRick Macklem case 'e': 162e85b7d75SRick Macklem extra_output = 1; 163bcdaa850SRick Macklem break; 1649b50d902SRodney W. Grimes case '?': 1659b50d902SRodney W. Grimes default: 1669b50d902SRodney W. Grimes usage(); 1679b50d902SRodney W. Grimes } 1689b50d902SRodney W. Grimes argc -= optind; 1699b50d902SRodney W. Grimes argv += optind; 1709b50d902SRodney W. Grimes 1719b50d902SRodney W. Grimes #define BACKWARD_COMPATIBILITY 1729b50d902SRodney W. Grimes #ifdef BACKWARD_COMPATIBILITY 1739b50d902SRodney W. Grimes if (*argv) { 1749b50d902SRodney W. Grimes interval = atoi(*argv); 1759b50d902SRodney W. Grimes if (*++argv) { 1769b50d902SRodney W. Grimes nlistf = *argv; 1779b50d902SRodney W. Grimes if (*++argv) 1789b50d902SRodney W. Grimes memf = *argv; 1799b50d902SRodney W. Grimes } 1809b50d902SRodney W. Grimes } 1819b50d902SRodney W. Grimes #endif 182*722e2552SEdward Tomasz Napierala if (modfind("nfscommon") < 0) 183*722e2552SEdward Tomasz Napierala errx(1, "NFS client/server not loaded"); 1849b50d902SRodney W. Grimes 185bcdaa850SRick Macklem if (interval) { 186bcdaa850SRick Macklem exp_sidewaysintpr(interval, clientOnly, serverOnly); 187bcdaa850SRick Macklem } else { 188e85b7d75SRick Macklem if (extra_output != 0) 189bcdaa850SRick Macklem exp_intpr(clientOnly, serverOnly); 1909b50d902SRodney W. Grimes else 1914893ef0bSMatthew Dillon intpr(clientOnly, serverOnly); 192bcdaa850SRick Macklem } 1939b50d902SRodney W. Grimes exit(0); 1949b50d902SRodney W. Grimes } 1959b50d902SRodney W. Grimes 1969b50d902SRodney W. Grimes /* 1979b50d902SRodney W. Grimes * Print a description of the nfs stats. 1989b50d902SRodney W. Grimes */ 199*722e2552SEdward Tomasz Napierala static void 2004893ef0bSMatthew Dillon intpr(int clientOnly, int serverOnly) 2019b50d902SRodney W. Grimes { 202e85b7d75SRick Macklem int nfssvc_flag; 2039b50d902SRodney W. Grimes 204e85b7d75SRick Macklem nfssvc_flag = NFSSVC_GETSTATS; 205e85b7d75SRick Macklem if (zflag != 0) { 206e85b7d75SRick Macklem if (clientOnly != 0) 207e85b7d75SRick Macklem nfssvc_flag |= NFSSVC_ZEROCLTSTATS; 208e85b7d75SRick Macklem if (serverOnly != 0) 209e85b7d75SRick Macklem nfssvc_flag |= NFSSVC_ZEROSRVSTATS; 210e85b7d75SRick Macklem } 211e85b7d75SRick Macklem if (nfssvc(nfssvc_flag, &ext_nfsstats) < 0) 212e85b7d75SRick Macklem err(1, "Can't get stats"); 2134893ef0bSMatthew Dillon if (clientOnly) { 2149b50d902SRodney W. Grimes printf("Client Info:\n"); 2159b50d902SRodney W. Grimes printf("Rpc Counts:\n"); 2169b50d902SRodney W. Grimes printf("%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n", 2179b50d902SRodney W. Grimes "Getattr", "Setattr", "Lookup", "Readlink", "Read", 2189b50d902SRodney W. Grimes "Write", "Create", "Remove"); 219e85b7d75SRick Macklem printf("%9d %9d %9d %9d %9d %9d %9d %9d\n", 220e85b7d75SRick Macklem ext_nfsstats.rpccnt[NFSPROC_GETATTR], 221e85b7d75SRick Macklem ext_nfsstats.rpccnt[NFSPROC_SETATTR], 222e85b7d75SRick Macklem ext_nfsstats.rpccnt[NFSPROC_LOOKUP], 223e85b7d75SRick Macklem ext_nfsstats.rpccnt[NFSPROC_READLINK], 224e85b7d75SRick Macklem ext_nfsstats.rpccnt[NFSPROC_READ], 225e85b7d75SRick Macklem ext_nfsstats.rpccnt[NFSPROC_WRITE], 226e85b7d75SRick Macklem ext_nfsstats.rpccnt[NFSPROC_CREATE], 227e85b7d75SRick Macklem ext_nfsstats.rpccnt[NFSPROC_REMOVE]); 2289b50d902SRodney W. Grimes printf("%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n", 2299b50d902SRodney W. Grimes "Rename", "Link", "Symlink", "Mkdir", "Rmdir", 230a62dc406SDoug Rabson "Readdir", "RdirPlus", "Access"); 231e85b7d75SRick Macklem printf("%9d %9d %9d %9d %9d %9d %9d %9d\n", 232e85b7d75SRick Macklem ext_nfsstats.rpccnt[NFSPROC_RENAME], 233e85b7d75SRick Macklem ext_nfsstats.rpccnt[NFSPROC_LINK], 234e85b7d75SRick Macklem ext_nfsstats.rpccnt[NFSPROC_SYMLINK], 235e85b7d75SRick Macklem ext_nfsstats.rpccnt[NFSPROC_MKDIR], 236e85b7d75SRick Macklem ext_nfsstats.rpccnt[NFSPROC_RMDIR], 237e85b7d75SRick Macklem ext_nfsstats.rpccnt[NFSPROC_READDIR], 238e85b7d75SRick Macklem ext_nfsstats.rpccnt[NFSPROC_READDIRPLUS], 239e85b7d75SRick Macklem ext_nfsstats.rpccnt[NFSPROC_ACCESS]); 24091196234SPeter Wemm printf("%9.9s %9.9s %9.9s %9.9s %9.9s\n", 24191196234SPeter Wemm "Mknod", "Fsstat", "Fsinfo", "PathConf", "Commit"); 242e85b7d75SRick Macklem printf("%9d %9d %9d %9d %9d\n", 243e85b7d75SRick Macklem ext_nfsstats.rpccnt[NFSPROC_MKNOD], 244e85b7d75SRick Macklem ext_nfsstats.rpccnt[NFSPROC_FSSTAT], 245e85b7d75SRick Macklem ext_nfsstats.rpccnt[NFSPROC_FSINFO], 246e85b7d75SRick Macklem ext_nfsstats.rpccnt[NFSPROC_PATHCONF], 247e85b7d75SRick Macklem ext_nfsstats.rpccnt[NFSPROC_COMMIT]); 2489b50d902SRodney W. Grimes printf("Rpc Info:\n"); 2499b50d902SRodney W. Grimes printf("%9.9s %9.9s %9.9s %9.9s %9.9s\n", 2504893ef0bSMatthew Dillon "TimedOut", "Invalid", "X Replies", "Retries", 2514893ef0bSMatthew Dillon "Requests"); 252e85b7d75SRick Macklem printf("%9d %9d %9d %9d %9d\n", 253e85b7d75SRick Macklem ext_nfsstats.rpctimeouts, 254e85b7d75SRick Macklem ext_nfsstats.rpcinvalid, 255e85b7d75SRick Macklem ext_nfsstats.rpcunexpected, 256e85b7d75SRick Macklem ext_nfsstats.rpcretries, 257e85b7d75SRick Macklem ext_nfsstats.rpcrequests); 2589b50d902SRodney W. Grimes printf("Cache Info:\n"); 2599b50d902SRodney W. Grimes printf("%9.9s %9.9s %9.9s %9.9s", 2609b50d902SRodney W. Grimes "Attr Hits", "Misses", "Lkup Hits", "Misses"); 2619b50d902SRodney W. Grimes printf(" %9.9s %9.9s %9.9s %9.9s\n", 2629b50d902SRodney W. Grimes "BioR Hits", "Misses", "BioW Hits", "Misses"); 263e85b7d75SRick Macklem printf("%9d %9d %9d %9d", 264e85b7d75SRick Macklem ext_nfsstats.attrcache_hits, 265e85b7d75SRick Macklem ext_nfsstats.attrcache_misses, 266e85b7d75SRick Macklem ext_nfsstats.lookupcache_hits, 267e85b7d75SRick Macklem ext_nfsstats.lookupcache_misses); 268e85b7d75SRick Macklem printf(" %9d %9d %9d %9d\n", 269e85b7d75SRick Macklem ext_nfsstats.biocache_reads - 270e85b7d75SRick Macklem ext_nfsstats.read_bios, 271e85b7d75SRick Macklem ext_nfsstats.read_bios, 272e85b7d75SRick Macklem ext_nfsstats.biocache_writes - 273e85b7d75SRick Macklem ext_nfsstats.write_bios, 274e85b7d75SRick Macklem ext_nfsstats.write_bios); 2759b50d902SRodney W. Grimes printf("%9.9s %9.9s %9.9s %9.9s", 2769b50d902SRodney W. Grimes "BioRLHits", "Misses", "BioD Hits", "Misses"); 2774898f742SRuslan Ermilov printf(" %9.9s %9.9s %9.9s %9.9s\n", "DirE Hits", "Misses", "Accs Hits", "Misses"); 278e85b7d75SRick Macklem printf("%9d %9d %9d %9d", 279e85b7d75SRick Macklem ext_nfsstats.biocache_readlinks - 280e85b7d75SRick Macklem ext_nfsstats.readlink_bios, 281e85b7d75SRick Macklem ext_nfsstats.readlink_bios, 282e85b7d75SRick Macklem ext_nfsstats.biocache_readdirs - 283e85b7d75SRick Macklem ext_nfsstats.readdir_bios, 284e85b7d75SRick Macklem ext_nfsstats.readdir_bios); 285e85b7d75SRick Macklem printf(" %9d %9d %9d %9d\n", 286e85b7d75SRick Macklem ext_nfsstats.direofcache_hits, 287e85b7d75SRick Macklem ext_nfsstats.direofcache_misses, 288e85b7d75SRick Macklem ext_nfsstats.accesscache_hits, 289e85b7d75SRick Macklem ext_nfsstats.accesscache_misses); 2904893ef0bSMatthew Dillon } 2914893ef0bSMatthew Dillon if (serverOnly) { 2929b50d902SRodney W. Grimes printf("\nServer Info:\n"); 2939b50d902SRodney W. Grimes printf("%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n", 2949b50d902SRodney W. Grimes "Getattr", "Setattr", "Lookup", "Readlink", "Read", 2959b50d902SRodney W. Grimes "Write", "Create", "Remove"); 296e85b7d75SRick Macklem printf("%9d %9d %9d %9d %9d %9d %9d %9d\n", 297002c2778SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_GETATTR], 298002c2778SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_SETATTR], 299002c2778SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_LOOKUP], 300002c2778SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_READLINK], 301002c2778SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_READ], 302002c2778SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_WRITE], 303002c2778SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_CREATE], 304002c2778SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_REMOVE]); 3059b50d902SRodney W. Grimes printf("%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n", 3069b50d902SRodney W. Grimes "Rename", "Link", "Symlink", "Mkdir", "Rmdir", 307a62dc406SDoug Rabson "Readdir", "RdirPlus", "Access"); 308e85b7d75SRick Macklem printf("%9d %9d %9d %9d %9d %9d %9d %9d\n", 309002c2778SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_RENAME], 310002c2778SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_LINK], 311002c2778SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_SYMLINK], 312002c2778SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_MKDIR], 313002c2778SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_RMDIR], 314002c2778SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_READDIR], 315002c2778SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_READDIRPLUS], 316002c2778SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_ACCESS]); 31791196234SPeter Wemm printf("%9.9s %9.9s %9.9s %9.9s %9.9s\n", 31891196234SPeter Wemm "Mknod", "Fsstat", "Fsinfo", "PathConf", "Commit"); 319e85b7d75SRick Macklem printf("%9d %9d %9d %9d %9d\n", 320002c2778SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_MKNOD], 321002c2778SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_FSSTAT], 322002c2778SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_FSINFO], 323002c2778SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_PATHCONF], 324002c2778SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_COMMIT]); 3259b50d902SRodney W. Grimes printf("Server Ret-Failed\n"); 326e85b7d75SRick Macklem printf("%17d\n", ext_nfsstats.srvrpc_errs); 3279b50d902SRodney W. Grimes printf("Server Faults\n"); 328e85b7d75SRick Macklem printf("%13d\n", ext_nfsstats.srv_errs); 3299b50d902SRodney W. Grimes printf("Server Cache Stats:\n"); 3309b50d902SRodney W. Grimes printf("%9.9s %9.9s %9.9s %9.9s\n", 3319b50d902SRodney W. Grimes "Inprog", "Idem", "Non-idem", "Misses"); 332e85b7d75SRick Macklem printf("%9d %9d %9d %9d\n", 333e85b7d75SRick Macklem ext_nfsstats.srvcache_inproghits, 334e85b7d75SRick Macklem ext_nfsstats.srvcache_idemdonehits, 335e85b7d75SRick Macklem ext_nfsstats.srvcache_nonidemdonehits, 336e85b7d75SRick Macklem ext_nfsstats.srvcache_misses); 337a62dc406SDoug Rabson printf("Server Write Gathering:\n"); 338a62dc406SDoug Rabson printf("%9.9s %9.9s %9.9s\n", 339a62dc406SDoug Rabson "WriteOps", "WriteRPC", "Opsaved"); 340e85b7d75SRick Macklem /* 341e85b7d75SRick Macklem * The new client doesn't do write gathering. It was 342e85b7d75SRick Macklem * only useful for NFSv2. 343e85b7d75SRick Macklem */ 344e85b7d75SRick Macklem printf("%9d %9d %9d\n", 345002c2778SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_WRITE], 346002c2778SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_WRITE], 0); 3474893ef0bSMatthew Dillon } 3489b50d902SRodney W. Grimes } 3499b50d902SRodney W. Grimes 350*722e2552SEdward Tomasz Napierala static void 3514893ef0bSMatthew Dillon printhdr(int clientOnly, int serverOnly) 3529b50d902SRodney W. Grimes { 3534893ef0bSMatthew Dillon printf("%s%6.6s %6.6s %6.6s %6.6s %6.6s %6.6s %6.6s %6.6s", 3544893ef0bSMatthew Dillon ((serverOnly && clientOnly) ? " " : " "), 3554893ef0bSMatthew Dillon "GtAttr", "Lookup", "Rdlink", "Read", "Write", "Rename", 3564893ef0bSMatthew Dillon "Access", "Rddir"); 3574893ef0bSMatthew Dillon if (widemode && clientOnly) { 3584893ef0bSMatthew Dillon printf(" Attr Lkup BioR BioW Accs BioD"); 3599b50d902SRodney W. Grimes } 3604893ef0bSMatthew Dillon printf("\n"); 3614893ef0bSMatthew Dillon fflush(stdout); 3629b50d902SRodney W. Grimes } 3639b50d902SRodney W. Grimes 364*722e2552SEdward Tomasz Napierala static void 365813947b7SJohn Baldwin usage(void) 3669b50d902SRodney W. Grimes { 3679b50d902SRodney W. Grimes (void)fprintf(stderr, 368*722e2552SEdward Tomasz Napierala "usage: nfsstat [-cemszW] [-M core] [-N system] [-w wait]\n"); 3699b50d902SRodney W. Grimes exit(1); 3709b50d902SRodney W. Grimes } 3714893ef0bSMatthew Dillon 3724893ef0bSMatthew Dillon static char SPBuf[64][8]; 3734893ef0bSMatthew Dillon static int SPIndex; 3744893ef0bSMatthew Dillon 375*722e2552SEdward Tomasz Napierala static char * 3764893ef0bSMatthew Dillon sperc1(int hits, int misses) 3774893ef0bSMatthew Dillon { 3784893ef0bSMatthew Dillon char *p = SPBuf[SPIndex]; 3794893ef0bSMatthew Dillon 3804893ef0bSMatthew Dillon if (hits + misses) { 3814893ef0bSMatthew Dillon sprintf(p, "%3d%%", 3824893ef0bSMatthew Dillon (int)(char)((quad_t)hits * 100 / (hits + misses))); 3834893ef0bSMatthew Dillon } else { 3844893ef0bSMatthew Dillon sprintf(p, " -"); 3854893ef0bSMatthew Dillon } 3864893ef0bSMatthew Dillon SPIndex = (SPIndex + 1) & 63; 3874893ef0bSMatthew Dillon return(p); 3884893ef0bSMatthew Dillon } 3894893ef0bSMatthew Dillon 390*722e2552SEdward Tomasz Napierala static char * 3914893ef0bSMatthew Dillon sperc2(int ttl, int misses) 3924893ef0bSMatthew Dillon { 3934893ef0bSMatthew Dillon char *p = SPBuf[SPIndex]; 3944893ef0bSMatthew Dillon 3954893ef0bSMatthew Dillon if (ttl) { 3964893ef0bSMatthew Dillon sprintf(p, "%3d%%", 3974893ef0bSMatthew Dillon (int)(char)((quad_t)(ttl - misses) * 100 / ttl)); 3984893ef0bSMatthew Dillon } else { 3994893ef0bSMatthew Dillon sprintf(p, " -"); 4004893ef0bSMatthew Dillon } 4014893ef0bSMatthew Dillon SPIndex = (SPIndex + 1) & 63; 4024893ef0bSMatthew Dillon return(p); 4034893ef0bSMatthew Dillon } 4044893ef0bSMatthew Dillon 405bcdaa850SRick Macklem /* 406bcdaa850SRick Macklem * Print a description of the nfs stats for the experimental client/server. 407bcdaa850SRick Macklem */ 408*722e2552SEdward Tomasz Napierala static void 409bcdaa850SRick Macklem exp_intpr(int clientOnly, int serverOnly) 410bcdaa850SRick Macklem { 4110e8f7d19SRick Macklem int nfssvc_flag; 412bcdaa850SRick Macklem 4130e8f7d19SRick Macklem nfssvc_flag = NFSSVC_GETSTATS; 4140e8f7d19SRick Macklem if (zflag != 0) { 4150e8f7d19SRick Macklem if (clientOnly != 0) 4160e8f7d19SRick Macklem nfssvc_flag |= NFSSVC_ZEROCLTSTATS; 4170e8f7d19SRick Macklem if (serverOnly != 0) 4180e8f7d19SRick Macklem nfssvc_flag |= NFSSVC_ZEROSRVSTATS; 4190e8f7d19SRick Macklem } 4200e8f7d19SRick Macklem if (nfssvc(nfssvc_flag, &ext_nfsstats) < 0) 4210e8f7d19SRick Macklem err(1, "Can't get stats"); 422bcdaa850SRick Macklem if (clientOnly != 0) { 423bcdaa850SRick Macklem if (printtitle) { 424bcdaa850SRick Macklem printf("Client Info:\n"); 425bcdaa850SRick Macklem printf("Rpc Counts:\n"); 426bcdaa850SRick Macklem printf( 427bcdaa850SRick Macklem "%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n" 428bcdaa850SRick Macklem , "Getattr", "Setattr", "Lookup", "Readlink", 429bcdaa850SRick Macklem "Read", "Write", "Create", "Remove"); 430bcdaa850SRick Macklem } 431bcdaa850SRick Macklem printf("%9d %9d %9d %9d %9d %9d %9d %9d\n", 432bcdaa850SRick Macklem ext_nfsstats.rpccnt[NFSPROC_GETATTR], 433bcdaa850SRick Macklem ext_nfsstats.rpccnt[NFSPROC_SETATTR], 434bcdaa850SRick Macklem ext_nfsstats.rpccnt[NFSPROC_LOOKUP], 435bcdaa850SRick Macklem ext_nfsstats.rpccnt[NFSPROC_READLINK], 436bcdaa850SRick Macklem ext_nfsstats.rpccnt[NFSPROC_READ], 437bcdaa850SRick Macklem ext_nfsstats.rpccnt[NFSPROC_WRITE], 438bcdaa850SRick Macklem ext_nfsstats.rpccnt[NFSPROC_CREATE], 439bcdaa850SRick Macklem ext_nfsstats.rpccnt[NFSPROC_REMOVE]); 440bcdaa850SRick Macklem if (printtitle) 441bcdaa850SRick Macklem printf( 442bcdaa850SRick Macklem "%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n" 443bcdaa850SRick Macklem , "Rename", "Link", "Symlink", "Mkdir", "Rmdir", 444bcdaa850SRick Macklem "Readdir", "RdirPlus", "Access"); 445bcdaa850SRick Macklem printf("%9d %9d %9d %9d %9d %9d %9d %9d\n", 446bcdaa850SRick Macklem ext_nfsstats.rpccnt[NFSPROC_RENAME], 447bcdaa850SRick Macklem ext_nfsstats.rpccnt[NFSPROC_LINK], 448bcdaa850SRick Macklem ext_nfsstats.rpccnt[NFSPROC_SYMLINK], 449bcdaa850SRick Macklem ext_nfsstats.rpccnt[NFSPROC_MKDIR], 450bcdaa850SRick Macklem ext_nfsstats.rpccnt[NFSPROC_RMDIR], 451bcdaa850SRick Macklem ext_nfsstats.rpccnt[NFSPROC_READDIR], 452bcdaa850SRick Macklem ext_nfsstats.rpccnt[NFSPROC_READDIRPLUS], 453bcdaa850SRick Macklem ext_nfsstats.rpccnt[NFSPROC_ACCESS]); 454bcdaa850SRick Macklem if (printtitle) 455bcdaa850SRick Macklem printf( 456bcdaa850SRick Macklem "%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n" 457bcdaa850SRick Macklem , "Mknod", "Fsstat", "Fsinfo", "PathConf", 458bcdaa850SRick Macklem "Commit", "SetClId", "SetClIdCf", "Lock"); 459bcdaa850SRick Macklem printf("%9d %9d %9d %9d %9d %9d %9d %9d\n", 460bcdaa850SRick Macklem ext_nfsstats.rpccnt[NFSPROC_MKNOD], 461bcdaa850SRick Macklem ext_nfsstats.rpccnt[NFSPROC_FSSTAT], 462bcdaa850SRick Macklem ext_nfsstats.rpccnt[NFSPROC_FSINFO], 463bcdaa850SRick Macklem ext_nfsstats.rpccnt[NFSPROC_PATHCONF], 464bcdaa850SRick Macklem ext_nfsstats.rpccnt[NFSPROC_COMMIT], 465bcdaa850SRick Macklem ext_nfsstats.rpccnt[NFSPROC_SETCLIENTID], 466bcdaa850SRick Macklem ext_nfsstats.rpccnt[NFSPROC_SETCLIENTIDCFRM], 467bcdaa850SRick Macklem ext_nfsstats.rpccnt[NFSPROC_LOCK]); 468bcdaa850SRick Macklem if (printtitle) 469bcdaa850SRick Macklem printf("%9.9s %9.9s %9.9s %9.9s\n", 470bcdaa850SRick Macklem "LockT", "LockU", "Open", "OpenCfr"); 471bcdaa850SRick Macklem printf("%9d %9d %9d %9d\n", 472bcdaa850SRick Macklem ext_nfsstats.rpccnt[NFSPROC_LOCKT], 473bcdaa850SRick Macklem ext_nfsstats.rpccnt[NFSPROC_LOCKU], 474bcdaa850SRick Macklem ext_nfsstats.rpccnt[NFSPROC_OPEN], 475bcdaa850SRick Macklem ext_nfsstats.rpccnt[NFSPROC_OPENCONFIRM]); 476bcdaa850SRick Macklem if (printtitle) 477bcdaa850SRick Macklem printf( 478bcdaa850SRick Macklem "%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n" 479bcdaa850SRick Macklem , "OpenOwner", "Opens", "LockOwner", 480bcdaa850SRick Macklem "Locks", "Delegs", "LocalOwn", 481bcdaa850SRick Macklem "LocalOpen", "LocalLOwn"); 482bcdaa850SRick Macklem printf("%9d %9d %9d %9d %9d %9d %9d %9d\n", 483bcdaa850SRick Macklem ext_nfsstats.clopenowners, 484bcdaa850SRick Macklem ext_nfsstats.clopens, 485bcdaa850SRick Macklem ext_nfsstats.cllockowners, 486bcdaa850SRick Macklem ext_nfsstats.cllocks, 487bcdaa850SRick Macklem ext_nfsstats.cldelegates, 488bcdaa850SRick Macklem ext_nfsstats.cllocalopenowners, 489bcdaa850SRick Macklem ext_nfsstats.cllocalopens, 490bcdaa850SRick Macklem ext_nfsstats.cllocallockowners); 491bcdaa850SRick Macklem if (printtitle) 492bcdaa850SRick Macklem printf("%9.9s\n", "LocalLock"); 493bcdaa850SRick Macklem printf("%9d\n", ext_nfsstats.cllocallocks); 494bcdaa850SRick Macklem if (printtitle) { 495bcdaa850SRick Macklem printf("Rpc Info:\n"); 496bcdaa850SRick Macklem printf("%9.9s %9.9s %9.9s %9.9s %9.9s\n", 497bcdaa850SRick Macklem "TimedOut", "Invalid", "X Replies", "Retries", 498bcdaa850SRick Macklem "Requests"); 499bcdaa850SRick Macklem } 500bcdaa850SRick Macklem printf("%9d %9d %9d %9d %9d\n", 501bcdaa850SRick Macklem ext_nfsstats.rpctimeouts, 502bcdaa850SRick Macklem ext_nfsstats.rpcinvalid, 503bcdaa850SRick Macklem ext_nfsstats.rpcunexpected, 504bcdaa850SRick Macklem ext_nfsstats.rpcretries, 505bcdaa850SRick Macklem ext_nfsstats.rpcrequests); 506bcdaa850SRick Macklem if (printtitle) { 507bcdaa850SRick Macklem printf("Cache Info:\n"); 508bcdaa850SRick Macklem printf("%9.9s %9.9s %9.9s %9.9s", 509bcdaa850SRick Macklem "Attr Hits", "Misses", "Lkup Hits", "Misses"); 510bcdaa850SRick Macklem printf(" %9.9s %9.9s %9.9s %9.9s\n", 511bcdaa850SRick Macklem "BioR Hits", "Misses", "BioW Hits", "Misses"); 512bcdaa850SRick Macklem } 513bcdaa850SRick Macklem printf("%9d %9d %9d %9d", 514bcdaa850SRick Macklem ext_nfsstats.attrcache_hits, 515bcdaa850SRick Macklem ext_nfsstats.attrcache_misses, 516bcdaa850SRick Macklem ext_nfsstats.lookupcache_hits, 517bcdaa850SRick Macklem ext_nfsstats.lookupcache_misses); 518bcdaa850SRick Macklem printf(" %9d %9d %9d %9d\n", 519c01be3b7SRick Macklem ext_nfsstats.biocache_reads - ext_nfsstats.read_bios, 520bcdaa850SRick Macklem ext_nfsstats.read_bios, 521c01be3b7SRick Macklem ext_nfsstats.biocache_writes - ext_nfsstats.write_bios, 522bcdaa850SRick Macklem ext_nfsstats.write_bios); 523bcdaa850SRick Macklem if (printtitle) { 524bcdaa850SRick Macklem printf("%9.9s %9.9s %9.9s %9.9s", 525bcdaa850SRick Macklem "BioRLHits", "Misses", "BioD Hits", "Misses"); 526bcdaa850SRick Macklem printf(" %9.9s %9.9s\n", "DirE Hits", "Misses"); 527bcdaa850SRick Macklem } 528bcdaa850SRick Macklem printf("%9d %9d %9d %9d", 529c01be3b7SRick Macklem ext_nfsstats.biocache_readlinks - 530bcdaa850SRick Macklem ext_nfsstats.readlink_bios, 531c01be3b7SRick Macklem ext_nfsstats.readlink_bios, 532c01be3b7SRick Macklem ext_nfsstats.biocache_readdirs - 533c01be3b7SRick Macklem ext_nfsstats.readdir_bios, 534bcdaa850SRick Macklem ext_nfsstats.readdir_bios); 535bcdaa850SRick Macklem printf(" %9d %9d\n", 536bcdaa850SRick Macklem ext_nfsstats.direofcache_hits, 537bcdaa850SRick Macklem ext_nfsstats.direofcache_misses); 538bcdaa850SRick Macklem } 539bcdaa850SRick Macklem if (serverOnly != 0) { 540bcdaa850SRick Macklem if (printtitle) { 541bcdaa850SRick Macklem printf("\nServer Info:\n"); 542bcdaa850SRick Macklem printf( 543bcdaa850SRick Macklem "%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n" 544bcdaa850SRick Macklem , "Getattr", "Setattr", "Lookup", "Readlink", 545bcdaa850SRick Macklem "Read", "Write", "Create", "Remove"); 546bcdaa850SRick Macklem } 547bcdaa850SRick Macklem printf("%9d %9d %9d %9d %9d %9d %9d %9d\n", 548bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_GETATTR], 549bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_SETATTR], 550bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_LOOKUP], 551bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_READLINK], 552bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_READ], 553bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_WRITE], 554bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_V3CREATE], 555bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_REMOVE]); 556bcdaa850SRick Macklem if (printtitle) 557bcdaa850SRick Macklem printf( 558bcdaa850SRick Macklem "%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n" 559bcdaa850SRick Macklem , "Rename", "Link", "Symlink", "Mkdir", "Rmdir", 560bcdaa850SRick Macklem "Readdir", "RdirPlus", "Access"); 561bcdaa850SRick Macklem printf("%9d %9d %9d %9d %9d %9d %9d %9d\n", 562bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_RENAME], 563bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_LINK], 564bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_SYMLINK], 565bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_MKDIR], 566bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_RMDIR], 567bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_READDIR], 568bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_READDIRPLUS], 569bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_ACCESS]); 570bcdaa850SRick Macklem if (printtitle) 571bcdaa850SRick Macklem printf( 572bcdaa850SRick Macklem "%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n" 573bcdaa850SRick Macklem , "Mknod", "Fsstat", "Fsinfo", "PathConf", 574bcdaa850SRick Macklem "Commit", "LookupP", "SetClId", "SetClIdCf"); 575bcdaa850SRick Macklem printf("%9d %9d %9d %9d %9d %9d %9d %9d\n", 576bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_MKNOD], 577bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_FSSTAT], 578bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_FSINFO], 579bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_PATHCONF], 580bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_COMMIT], 581bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_LOOKUPP], 582bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_SETCLIENTID], 583bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_SETCLIENTIDCFRM]); 584bcdaa850SRick Macklem if (printtitle) 585bcdaa850SRick Macklem printf( 586bcdaa850SRick Macklem "%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n" 587bcdaa850SRick Macklem , "Open", "OpenAttr", "OpenDwnGr", "OpenCfrm", 588bcdaa850SRick Macklem "DelePurge", "DeleRet", "GetFH", "Lock"); 589bcdaa850SRick Macklem printf("%9d %9d %9d %9d %9d %9d %9d %9d\n", 590bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_OPEN], 591bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_OPENATTR], 592bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_OPENDOWNGRADE], 593bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_OPENCONFIRM], 594bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_DELEGPURGE], 595bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_DELEGRETURN], 596bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_GETFH], 597bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_LOCK]); 598bcdaa850SRick Macklem if (printtitle) 599bcdaa850SRick Macklem printf( 600bcdaa850SRick Macklem "%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n" 601bcdaa850SRick Macklem , "LockT", "LockU", "Close", "Verify", "NVerify", 602bcdaa850SRick Macklem "PutFH", "PutPubFH", "PutRootFH"); 603bcdaa850SRick Macklem printf("%9d %9d %9d %9d %9d %9d %9d %9d\n", 604bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_LOCKT], 605bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_LOCKU], 606bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_CLOSE], 607bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_VERIFY], 608bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_NVERIFY], 609bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_PUTFH], 610bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_PUTPUBFH], 611bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_PUTROOTFH]); 612bcdaa850SRick Macklem if (printtitle) 613bcdaa850SRick Macklem printf("%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n", 614bcdaa850SRick Macklem "Renew", "RestoreFH", "SaveFH", "Secinfo", 615bcdaa850SRick Macklem "RelLckOwn", "V4Create"); 616bcdaa850SRick Macklem printf("%9d %9d %9d %9d %9d %9d\n", 617bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_RENEW], 618bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_RESTOREFH], 619bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_SAVEFH], 620bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_SECINFO], 621bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_RELEASELCKOWN], 622bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_CREATE]); 623bcdaa850SRick Macklem if (printtitle) { 624bcdaa850SRick Macklem printf("Server:\n"); 625bcdaa850SRick Macklem printf("%9.9s %9.9s %9.9s\n", 626bcdaa850SRick Macklem "Retfailed", "Faults", "Clients"); 627bcdaa850SRick Macklem } 628bcdaa850SRick Macklem printf("%9d %9d %9d\n", 629bcdaa850SRick Macklem ext_nfsstats.srv_errs, ext_nfsstats.srvrpc_errs, 630bcdaa850SRick Macklem ext_nfsstats.srvclients); 631bcdaa850SRick Macklem if (printtitle) 632bcdaa850SRick Macklem printf("%9.9s %9.9s %9.9s %9.9s %9.9s \n", 633bcdaa850SRick Macklem "OpenOwner", "Opens", "LockOwner", 634bcdaa850SRick Macklem "Locks", "Delegs"); 635bcdaa850SRick Macklem printf("%9d %9d %9d %9d %9d \n", 636bcdaa850SRick Macklem ext_nfsstats.srvopenowners, 637bcdaa850SRick Macklem ext_nfsstats.srvopens, 638bcdaa850SRick Macklem ext_nfsstats.srvlockowners, 639bcdaa850SRick Macklem ext_nfsstats.srvlocks, 640bcdaa850SRick Macklem ext_nfsstats.srvdelegates); 641bcdaa850SRick Macklem if (printtitle) { 642bcdaa850SRick Macklem printf("Server Cache Stats:\n"); 643bcdaa850SRick Macklem printf("%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n", 644bcdaa850SRick Macklem "Inprog", "Idem", "Non-idem", "Misses", 645bcdaa850SRick Macklem "CacheSize", "TCPPeak"); 646bcdaa850SRick Macklem } 647bcdaa850SRick Macklem printf("%9d %9d %9d %9d %9d %9d\n", 648bcdaa850SRick Macklem ext_nfsstats.srvcache_inproghits, 649bcdaa850SRick Macklem ext_nfsstats.srvcache_idemdonehits, 650bcdaa850SRick Macklem ext_nfsstats.srvcache_nonidemdonehits, 651bcdaa850SRick Macklem ext_nfsstats.srvcache_misses, 652bcdaa850SRick Macklem ext_nfsstats.srvcache_size, 653bcdaa850SRick Macklem ext_nfsstats.srvcache_tcppeak); 654bcdaa850SRick Macklem } 655bcdaa850SRick Macklem } 656bcdaa850SRick Macklem 657bcdaa850SRick Macklem /* 658bcdaa850SRick Macklem * Print a running summary of nfs statistics for the experimental client and/or 659bcdaa850SRick Macklem * server. 660bcdaa850SRick Macklem * Repeat display every interval seconds, showing statistics 661bcdaa850SRick Macklem * collected over that interval. Assumes that interval is non-zero. 662bcdaa850SRick Macklem * First line printed at top of screen is always cumulative. 663bcdaa850SRick Macklem */ 664*722e2552SEdward Tomasz Napierala static void 665bcdaa850SRick Macklem exp_sidewaysintpr(u_int interval, int clientOnly, int serverOnly) 666bcdaa850SRick Macklem { 667bcdaa850SRick Macklem struct ext_nfsstats nfsstats, lastst, *ext_nfsstatsp; 668bcdaa850SRick Macklem int hdrcnt = 1; 669bcdaa850SRick Macklem 670bcdaa850SRick Macklem ext_nfsstatsp = &lastst; 671785b2572SRick Macklem if (nfssvc(NFSSVC_GETSTATS, ext_nfsstatsp) < 0) 672bcdaa850SRick Macklem err(1, "Can't get stats"); 673bcdaa850SRick Macklem sleep(interval); 674bcdaa850SRick Macklem 675bcdaa850SRick Macklem for (;;) { 676bcdaa850SRick Macklem ext_nfsstatsp = &nfsstats; 677785b2572SRick Macklem if (nfssvc(NFSSVC_GETSTATS, ext_nfsstatsp) < 0) 678bcdaa850SRick Macklem err(1, "Can't get stats"); 679bcdaa850SRick Macklem 680bcdaa850SRick Macklem if (--hdrcnt == 0) { 681bcdaa850SRick Macklem printhdr(clientOnly, serverOnly); 682bcdaa850SRick Macklem if (clientOnly && serverOnly) 683bcdaa850SRick Macklem hdrcnt = 10; 684bcdaa850SRick Macklem else 685bcdaa850SRick Macklem hdrcnt = 20; 686bcdaa850SRick Macklem } 687bcdaa850SRick Macklem if (clientOnly) { 688bcdaa850SRick Macklem printf("%s %6d %6d %6d %6d %6d %6d %6d %6d", 689bcdaa850SRick Macklem ((clientOnly && serverOnly) ? "Client:" : ""), 6902fdfccfdSJohn Baldwin DELTA(rpccnt[NFSPROC_GETATTR]), 6912fdfccfdSJohn Baldwin DELTA(rpccnt[NFSPROC_LOOKUP]), 6922fdfccfdSJohn Baldwin DELTA(rpccnt[NFSPROC_READLINK]), 6932fdfccfdSJohn Baldwin DELTA(rpccnt[NFSPROC_READ]), 6942fdfccfdSJohn Baldwin DELTA(rpccnt[NFSPROC_WRITE]), 6952fdfccfdSJohn Baldwin DELTA(rpccnt[NFSPROC_RENAME]), 6962fdfccfdSJohn Baldwin DELTA(rpccnt[NFSPROC_ACCESS]), 6972fdfccfdSJohn Baldwin DELTA(rpccnt[NFSPROC_READDIR]) + 6982fdfccfdSJohn Baldwin DELTA(rpccnt[NFSPROC_READDIRPLUS]) 699bcdaa850SRick Macklem ); 700bcdaa850SRick Macklem if (widemode) { 701bcdaa850SRick Macklem printf(" %s %s %s %s %s %s", 702bcdaa850SRick Macklem sperc1(DELTA(attrcache_hits), 703bcdaa850SRick Macklem DELTA(attrcache_misses)), 704bcdaa850SRick Macklem sperc1(DELTA(lookupcache_hits), 705bcdaa850SRick Macklem DELTA(lookupcache_misses)), 706bcdaa850SRick Macklem sperc2(DELTA(biocache_reads), 707bcdaa850SRick Macklem DELTA(read_bios)), 708bcdaa850SRick Macklem sperc2(DELTA(biocache_writes), 709bcdaa850SRick Macklem DELTA(write_bios)), 710bcdaa850SRick Macklem sperc1(DELTA(accesscache_hits), 711bcdaa850SRick Macklem DELTA(accesscache_misses)), 712bcdaa850SRick Macklem sperc2(DELTA(biocache_readdirs), 713bcdaa850SRick Macklem DELTA(readdir_bios)) 714bcdaa850SRick Macklem ); 715bcdaa850SRick Macklem } 716bcdaa850SRick Macklem printf("\n"); 717bcdaa850SRick Macklem } 718bcdaa850SRick Macklem if (serverOnly) { 719bcdaa850SRick Macklem printf("%s %6d %6d %6d %6d %6d %6d %6d %6d", 720bcdaa850SRick Macklem ((clientOnly && serverOnly) ? "Server:" : ""), 7211809b04bSJohn Baldwin DELTA(srvrpccnt[NFSV4OP_GETATTR]), 7221809b04bSJohn Baldwin DELTA(srvrpccnt[NFSV4OP_LOOKUP]), 7231809b04bSJohn Baldwin DELTA(srvrpccnt[NFSV4OP_READLINK]), 7241809b04bSJohn Baldwin DELTA(srvrpccnt[NFSV4OP_READ]), 7251809b04bSJohn Baldwin DELTA(srvrpccnt[NFSV4OP_WRITE]), 7261809b04bSJohn Baldwin DELTA(srvrpccnt[NFSV4OP_RENAME]), 7271809b04bSJohn Baldwin DELTA(srvrpccnt[NFSV4OP_ACCESS]), 7281809b04bSJohn Baldwin DELTA(srvrpccnt[NFSV4OP_READDIR]) + 7291809b04bSJohn Baldwin DELTA(srvrpccnt[NFSV4OP_READDIRPLUS])); 730bcdaa850SRick Macklem printf("\n"); 731bcdaa850SRick Macklem } 73270a8f993SHiroki Sato lastst = nfsstats; 733bcdaa850SRick Macklem fflush(stdout); 734bcdaa850SRick Macklem sleep(interval); 735bcdaa850SRick Macklem } 736bcdaa850SRick Macklem /*NOTREACHED*/ 737bcdaa850SRick Macklem } 738