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 * 3. All advertising materials mentioning features or use of this software 179b50d902SRodney W. Grimes * must display the following acknowledgement: 189b50d902SRodney W. Grimes * This product includes software developed by the University of 199b50d902SRodney W. Grimes * California, Berkeley and its contributors. 209b50d902SRodney W. Grimes * 4. Neither the name of the University nor the names of its contributors 219b50d902SRodney W. Grimes * may be used to endorse or promote products derived from this software 229b50d902SRodney W. Grimes * without specific prior written permission. 239b50d902SRodney W. Grimes * 249b50d902SRodney W. Grimes * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 259b50d902SRodney W. Grimes * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 269b50d902SRodney W. Grimes * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 279b50d902SRodney W. Grimes * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 289b50d902SRodney W. Grimes * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 299b50d902SRodney W. Grimes * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 309b50d902SRodney W. Grimes * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 319b50d902SRodney W. Grimes * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 329b50d902SRodney W. Grimes * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 339b50d902SRodney W. Grimes * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 349b50d902SRodney W. Grimes * SUCH DAMAGE. 359b50d902SRodney W. Grimes */ 369b50d902SRodney W. Grimes 379b50d902SRodney W. Grimes #ifndef lint 389b50d902SRodney W. Grimes static char copyright[] = 399b50d902SRodney W. Grimes "@(#) Copyright (c) 1983, 1989, 1993\n\ 409b50d902SRodney W. Grimes The Regents of the University of California. All rights reserved.\n"; 419b50d902SRodney W. Grimes #endif /* not lint */ 429b50d902SRodney W. Grimes 439b50d902SRodney W. Grimes #ifndef lint 44eae79dd1SBruce Evans #if 0 45eae79dd1SBruce Evans static char sccsid[] = "@(#)nfsstat.c 8.2 (Berkeley) 3/31/95"; 46eae79dd1SBruce Evans #endif 4707e532e7SGarrett Wollman static const char rcsid[] = 48c3aac50fSPeter Wemm "$FreeBSD$"; 499b50d902SRodney W. Grimes #endif /* not lint */ 509b50d902SRodney W. Grimes 519b50d902SRodney W. Grimes #include <sys/param.h> 529b50d902SRodney W. Grimes #include <sys/mount.h> 535a4838fcSPoul-Henning Kamp #include <sys/time.h> 5407e532e7SGarrett Wollman #include <sys/sysctl.h> 55a62dc406SDoug Rabson #include <nfs/rpcv2.h> 56a62dc406SDoug Rabson #include <nfs/nfsproto.h> 5791196234SPeter Wemm #include <nfsclient/nfs.h> 5891196234SPeter Wemm #include <nfsserver/nfs.h> 59bcdaa850SRick Macklem #include <nfs/nfssvc.h> 60bcdaa850SRick Macklem 61bcdaa850SRick Macklem #include <fs/nfs/nfsport.h> 62bcdaa850SRick Macklem 639b50d902SRodney W. Grimes #include <signal.h> 649b50d902SRodney W. Grimes #include <fcntl.h> 659b50d902SRodney W. Grimes #include <ctype.h> 669b50d902SRodney W. Grimes #include <errno.h> 679b50d902SRodney W. Grimes #include <kvm.h> 689c9f2eefSThomas Moestl #include <limits.h> 699b50d902SRodney W. Grimes #include <nlist.h> 709b50d902SRodney W. Grimes #include <unistd.h> 719b50d902SRodney W. Grimes #include <stdio.h> 729b50d902SRodney W. Grimes #include <stdlib.h> 739b50d902SRodney W. Grimes #include <string.h> 749b50d902SRodney W. Grimes #include <paths.h> 7507e532e7SGarrett Wollman #include <err.h> 769b50d902SRodney W. Grimes 779b50d902SRodney W. Grimes struct nlist nl[] = { 789b50d902SRodney W. Grimes #define N_NFSSTAT 0 7991196234SPeter Wemm { "nfsstats" }, 8091196234SPeter Wemm #define N_NFSRVSTAT 1 8191196234SPeter Wemm { "nfsrvstats" }, 829b50d902SRodney W. Grimes "", 839b50d902SRodney W. Grimes }; 849b50d902SRodney W. Grimes kvm_t *kd; 859b50d902SRodney W. Grimes 8607e532e7SGarrett Wollman static int deadkernel = 0; 874893ef0bSMatthew Dillon static int widemode = 0; 88813947b7SJohn Baldwin static int zflag = 0; 89bcdaa850SRick Macklem static int run_v4 = 0; 90bcdaa850SRick Macklem static int printtitle = 1; 91bcdaa850SRick Macklem static struct ext_nfsstats ext_nfsstats; 9207e532e7SGarrett Wollman 93d3cb5dedSWarner Losh void intpr(int, int); 94d3cb5dedSWarner Losh void printhdr(int, int); 95d3cb5dedSWarner Losh void sidewaysintpr(u_int, int, int); 96d3cb5dedSWarner Losh void usage(void); 97d3cb5dedSWarner Losh char *sperc1(int, int); 98d3cb5dedSWarner Losh char *sperc2(int, int); 99bcdaa850SRick Macklem void exp_intpr(int, int); 100bcdaa850SRick Macklem void exp_sidewaysintpr(u_int, int, int); 1014893ef0bSMatthew Dillon 1024893ef0bSMatthew Dillon #define DELTA(field) (nfsstats.field - lastst.field) 1039b50d902SRodney W. Grimes 10470c3c978SStefan Farfeleder int 105813947b7SJohn Baldwin main(int argc, char **argv) 1069b50d902SRodney W. Grimes { 1079b50d902SRodney W. Grimes u_int interval; 1084893ef0bSMatthew Dillon int clientOnly = -1; 1094893ef0bSMatthew Dillon int serverOnly = -1; 1109b50d902SRodney W. Grimes int ch; 1119b50d902SRodney W. Grimes char *memf, *nlistf; 1129c9f2eefSThomas Moestl char errbuf[_POSIX2_LINE_MAX]; 1139b50d902SRodney W. Grimes 1149b50d902SRodney W. Grimes interval = 0; 1159b50d902SRodney W. Grimes memf = nlistf = NULL; 116bcdaa850SRick Macklem while ((ch = getopt(argc, argv, "csWM:N:w:z4")) != -1) 1179b50d902SRodney W. Grimes switch(ch) { 1189b50d902SRodney W. Grimes case 'M': 1199b50d902SRodney W. Grimes memf = optarg; 1209b50d902SRodney W. Grimes break; 1219b50d902SRodney W. Grimes case 'N': 1229b50d902SRodney W. Grimes nlistf = optarg; 1239b50d902SRodney W. Grimes break; 1244893ef0bSMatthew Dillon case 'W': 1254893ef0bSMatthew Dillon widemode = 1; 1264893ef0bSMatthew Dillon break; 1279b50d902SRodney W. Grimes case 'w': 1289b50d902SRodney W. Grimes interval = atoi(optarg); 1299b50d902SRodney W. Grimes break; 1304893ef0bSMatthew Dillon case 'c': 1314893ef0bSMatthew Dillon clientOnly = 1; 1324893ef0bSMatthew Dillon if (serverOnly < 0) 1334893ef0bSMatthew Dillon serverOnly = 0; 1344893ef0bSMatthew Dillon break; 1354893ef0bSMatthew Dillon case 's': 1364893ef0bSMatthew Dillon serverOnly = 1; 1374893ef0bSMatthew Dillon if (clientOnly < 0) 1384893ef0bSMatthew Dillon clientOnly = 0; 1394893ef0bSMatthew Dillon break; 140813947b7SJohn Baldwin case 'z': 141813947b7SJohn Baldwin zflag = 1; 142813947b7SJohn Baldwin break; 143bcdaa850SRick Macklem case '4': 144bcdaa850SRick Macklem run_v4 = 1; 145bcdaa850SRick Macklem break; 1469b50d902SRodney W. Grimes case '?': 1479b50d902SRodney W. Grimes default: 1489b50d902SRodney W. Grimes usage(); 1499b50d902SRodney W. Grimes } 1509b50d902SRodney W. Grimes argc -= optind; 1519b50d902SRodney W. Grimes argv += optind; 1529b50d902SRodney W. Grimes 1539b50d902SRodney W. Grimes #define BACKWARD_COMPATIBILITY 1549b50d902SRodney W. Grimes #ifdef BACKWARD_COMPATIBILITY 1559b50d902SRodney W. Grimes if (*argv) { 1569b50d902SRodney W. Grimes interval = atoi(*argv); 1579b50d902SRodney W. Grimes if (*++argv) { 1589b50d902SRodney W. Grimes nlistf = *argv; 1599b50d902SRodney W. Grimes if (*++argv) 1609b50d902SRodney W. Grimes memf = *argv; 1619b50d902SRodney W. Grimes } 1629b50d902SRodney W. Grimes } 1639b50d902SRodney W. Grimes #endif 164bcdaa850SRick Macklem if (run_v4 != 0 && modfind("nfscommon") < 0) 165bcdaa850SRick Macklem errx(1, "experimental client/server not loaded"); 166bcdaa850SRick Macklem 167bcdaa850SRick Macklem if (run_v4 != 0) { 168bcdaa850SRick Macklem if (nfssvc(NFSSVC_GETSTATS, &ext_nfsstats) < 0) 169bcdaa850SRick Macklem err(1, "Can't get stats"); 170bcdaa850SRick Macklem } else if (nlistf != NULL || memf != NULL) { 17107e532e7SGarrett Wollman deadkernel = 1; 1729b50d902SRodney W. Grimes 17307e532e7SGarrett Wollman if ((kd = kvm_openfiles(nlistf, memf, NULL, O_RDONLY, 17407e532e7SGarrett Wollman errbuf)) == 0) { 17507e532e7SGarrett Wollman errx(1, "kvm_openfiles: %s", errbuf); 1769b50d902SRodney W. Grimes } 1779b50d902SRodney W. Grimes if (kvm_nlist(kd, nl) != 0) { 17807e532e7SGarrett Wollman errx(1, "kvm_nlist: can't get names"); 17907e532e7SGarrett Wollman } 1809b50d902SRodney W. Grimes } 1819b50d902SRodney W. Grimes 182bcdaa850SRick Macklem if (interval) { 183bcdaa850SRick Macklem if (run_v4 > 0) 184bcdaa850SRick Macklem exp_sidewaysintpr(interval, clientOnly, serverOnly); 185bcdaa850SRick Macklem else 1864893ef0bSMatthew Dillon sidewaysintpr(interval, clientOnly, serverOnly); 187bcdaa850SRick Macklem } else { 188bcdaa850SRick Macklem if (run_v4 > 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 /* 19707e532e7SGarrett Wollman * Read the nfs stats using sysctl(3) for live kernels, or kvm_read 19807e532e7SGarrett Wollman * for dead ones. 19907e532e7SGarrett Wollman */ 20007e532e7SGarrett Wollman void 201813947b7SJohn Baldwin readstats(struct nfsstats **stp, struct nfsrvstats **srvstp, int zero) 20207e532e7SGarrett Wollman { 203813947b7SJohn Baldwin union { 204813947b7SJohn Baldwin struct nfsstats client; 205813947b7SJohn Baldwin struct nfsrvstats server; 206813947b7SJohn Baldwin } zerostat; 20791196234SPeter Wemm size_t buflen; 20891196234SPeter Wemm 20907e532e7SGarrett Wollman if (deadkernel) { 210813947b7SJohn Baldwin if (*stp != NULL && kvm_read(kd, (u_long)nl[N_NFSSTAT].n_value, 211813947b7SJohn Baldwin *stp, sizeof(struct nfsstats)) < 0) { 21291196234SPeter Wemm *stp = NULL; 21391196234SPeter Wemm } 214813947b7SJohn Baldwin if (*srvstp != NULL && kvm_read(kd, 215813947b7SJohn Baldwin (u_long)nl[N_NFSRVSTAT].n_value, *srvstp, 21691196234SPeter Wemm sizeof(struct nfsrvstats)) < 0) { 21791196234SPeter Wemm *srvstp = NULL; 21807e532e7SGarrett Wollman } 21907e532e7SGarrett Wollman } else { 220813947b7SJohn Baldwin if (zero) 221813947b7SJohn Baldwin bzero(&zerostat, sizeof(zerostat)); 22291196234SPeter Wemm buflen = sizeof(struct nfsstats); 223813947b7SJohn Baldwin if (*stp != NULL && sysctlbyname("vfs.nfs.nfsstats", *stp, 224813947b7SJohn Baldwin &buflen, zero ? &zerostat : NULL, zero ? buflen : 0) < 0) { 225813947b7SJohn Baldwin if (errno != ENOENT) 226813947b7SJohn Baldwin err(1, "sysctl: vfs.nfs.nfsstats"); 22791196234SPeter Wemm *stp = NULL; 22891196234SPeter Wemm } 22991196234SPeter Wemm buflen = sizeof(struct nfsrvstats); 230813947b7SJohn Baldwin if (*srvstp != NULL && sysctlbyname("vfs.nfsrv.nfsrvstats", 231813947b7SJohn Baldwin *srvstp, &buflen, zero ? &zerostat : NULL, 232813947b7SJohn Baldwin zero ? buflen : 0) < 0) { 233813947b7SJohn Baldwin if (errno != ENOENT) 234813947b7SJohn Baldwin err(1, "sysctl: vfs.nfsrv.nfsrvstats"); 23591196234SPeter Wemm *srvstp = NULL; 23607e532e7SGarrett Wollman } 23707e532e7SGarrett Wollman } 23807e532e7SGarrett Wollman } 23907e532e7SGarrett Wollman 24007e532e7SGarrett Wollman /* 2419b50d902SRodney W. Grimes * Print a description of the nfs stats. 2429b50d902SRodney W. Grimes */ 2439b50d902SRodney W. Grimes void 2444893ef0bSMatthew Dillon intpr(int clientOnly, int serverOnly) 2459b50d902SRodney W. Grimes { 24691196234SPeter Wemm struct nfsstats nfsstats, *nfsstatsp; 24791196234SPeter Wemm struct nfsrvstats nfsrvstats, *nfsrvstatsp; 2489b50d902SRodney W. Grimes 249813947b7SJohn Baldwin /* 250813947b7SJohn Baldwin * Only read the stats we are going to display to avoid zeroing 251813947b7SJohn Baldwin * stats the user didn't request. 252813947b7SJohn Baldwin */ 253813947b7SJohn Baldwin if (clientOnly) 25491196234SPeter Wemm nfsstatsp = &nfsstats; 255813947b7SJohn Baldwin else 256813947b7SJohn Baldwin nfsstatsp = NULL; 257813947b7SJohn Baldwin if (serverOnly) 25891196234SPeter Wemm nfsrvstatsp = &nfsrvstats; 259813947b7SJohn Baldwin else 260813947b7SJohn Baldwin nfsrvstatsp = NULL; 26107e532e7SGarrett Wollman 262813947b7SJohn Baldwin readstats(&nfsstatsp, &nfsrvstatsp, zflag); 26391196234SPeter Wemm 26491196234SPeter Wemm if (clientOnly && !nfsstatsp) { 26591196234SPeter Wemm printf("Client not present!\n"); 26691196234SPeter Wemm clientOnly = 0; 26791196234SPeter Wemm } 2684893ef0bSMatthew Dillon if (clientOnly) { 2699b50d902SRodney W. Grimes printf("Client Info:\n"); 2709b50d902SRodney W. Grimes printf("Rpc Counts:\n"); 2719b50d902SRodney W. Grimes printf("%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n", 2729b50d902SRodney W. Grimes "Getattr", "Setattr", "Lookup", "Readlink", "Read", 2739b50d902SRodney W. Grimes "Write", "Create", "Remove"); 2749b50d902SRodney W. Grimes printf("%9d %9d %9d %9d %9d %9d %9d %9d\n", 2759b50d902SRodney W. Grimes nfsstats.rpccnt[NFSPROC_GETATTR], 2769b50d902SRodney W. Grimes nfsstats.rpccnt[NFSPROC_SETATTR], 2779b50d902SRodney W. Grimes nfsstats.rpccnt[NFSPROC_LOOKUP], 2789b50d902SRodney W. Grimes nfsstats.rpccnt[NFSPROC_READLINK], 2799b50d902SRodney W. Grimes nfsstats.rpccnt[NFSPROC_READ], 2809b50d902SRodney W. Grimes nfsstats.rpccnt[NFSPROC_WRITE], 2819b50d902SRodney W. Grimes nfsstats.rpccnt[NFSPROC_CREATE], 2829b50d902SRodney W. Grimes nfsstats.rpccnt[NFSPROC_REMOVE]); 2839b50d902SRodney W. Grimes printf("%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n", 2849b50d902SRodney W. Grimes "Rename", "Link", "Symlink", "Mkdir", "Rmdir", 285a62dc406SDoug Rabson "Readdir", "RdirPlus", "Access"); 2869b50d902SRodney W. Grimes printf("%9d %9d %9d %9d %9d %9d %9d %9d\n", 2879b50d902SRodney W. Grimes nfsstats.rpccnt[NFSPROC_RENAME], 2889b50d902SRodney W. Grimes nfsstats.rpccnt[NFSPROC_LINK], 2899b50d902SRodney W. Grimes nfsstats.rpccnt[NFSPROC_SYMLINK], 2909b50d902SRodney W. Grimes nfsstats.rpccnt[NFSPROC_MKDIR], 2919b50d902SRodney W. Grimes nfsstats.rpccnt[NFSPROC_RMDIR], 2929b50d902SRodney W. Grimes nfsstats.rpccnt[NFSPROC_READDIR], 293a62dc406SDoug Rabson nfsstats.rpccnt[NFSPROC_READDIRPLUS], 294a62dc406SDoug Rabson nfsstats.rpccnt[NFSPROC_ACCESS]); 29591196234SPeter Wemm printf("%9.9s %9.9s %9.9s %9.9s %9.9s\n", 29691196234SPeter Wemm "Mknod", "Fsstat", "Fsinfo", "PathConf", "Commit"); 29791196234SPeter Wemm printf("%9d %9d %9d %9d %9d\n", 298a62dc406SDoug Rabson nfsstats.rpccnt[NFSPROC_MKNOD], 299a62dc406SDoug Rabson nfsstats.rpccnt[NFSPROC_FSSTAT], 300a62dc406SDoug Rabson nfsstats.rpccnt[NFSPROC_FSINFO], 301a62dc406SDoug Rabson nfsstats.rpccnt[NFSPROC_PATHCONF], 30291196234SPeter Wemm nfsstats.rpccnt[NFSPROC_COMMIT]); 3039b50d902SRodney W. Grimes printf("Rpc Info:\n"); 3049b50d902SRodney W. Grimes printf("%9.9s %9.9s %9.9s %9.9s %9.9s\n", 3054893ef0bSMatthew Dillon "TimedOut", "Invalid", "X Replies", "Retries", 3064893ef0bSMatthew Dillon "Requests"); 3079b50d902SRodney W. Grimes printf("%9d %9d %9d %9d %9d\n", 3089b50d902SRodney W. Grimes nfsstats.rpctimeouts, 3099b50d902SRodney W. Grimes nfsstats.rpcinvalid, 3109b50d902SRodney W. Grimes nfsstats.rpcunexpected, 3119b50d902SRodney W. Grimes nfsstats.rpcretries, 3129b50d902SRodney W. Grimes nfsstats.rpcrequests); 3139b50d902SRodney W. Grimes printf("Cache Info:\n"); 3149b50d902SRodney W. Grimes printf("%9.9s %9.9s %9.9s %9.9s", 3159b50d902SRodney W. Grimes "Attr Hits", "Misses", "Lkup Hits", "Misses"); 3169b50d902SRodney W. Grimes printf(" %9.9s %9.9s %9.9s %9.9s\n", 3179b50d902SRodney W. Grimes "BioR Hits", "Misses", "BioW Hits", "Misses"); 3189b50d902SRodney W. Grimes printf("%9d %9d %9d %9d", 3199b50d902SRodney W. Grimes nfsstats.attrcache_hits, nfsstats.attrcache_misses, 3209b50d902SRodney W. Grimes nfsstats.lookupcache_hits, nfsstats.lookupcache_misses); 3219b50d902SRodney W. Grimes printf(" %9d %9d %9d %9d\n", 3229b50d902SRodney W. Grimes nfsstats.biocache_reads-nfsstats.read_bios, 3239b50d902SRodney W. Grimes nfsstats.read_bios, 3249b50d902SRodney W. Grimes nfsstats.biocache_writes-nfsstats.write_bios, 3259b50d902SRodney W. Grimes nfsstats.write_bios); 3269b50d902SRodney W. Grimes printf("%9.9s %9.9s %9.9s %9.9s", 3279b50d902SRodney W. Grimes "BioRLHits", "Misses", "BioD Hits", "Misses"); 3289b50d902SRodney W. Grimes printf(" %9.9s %9.9s\n", "DirE Hits", "Misses"); 3299b50d902SRodney W. Grimes printf("%9d %9d %9d %9d", 3309b50d902SRodney W. Grimes nfsstats.biocache_readlinks-nfsstats.readlink_bios, 3319b50d902SRodney W. Grimes nfsstats.readlink_bios, 3329b50d902SRodney W. Grimes nfsstats.biocache_readdirs-nfsstats.readdir_bios, 3339b50d902SRodney W. Grimes nfsstats.readdir_bios); 3349b50d902SRodney W. Grimes printf(" %9d %9d\n", 3359b50d902SRodney W. Grimes nfsstats.direofcache_hits, nfsstats.direofcache_misses); 3364893ef0bSMatthew Dillon } 33791196234SPeter Wemm if (serverOnly && !nfsrvstatsp) { 33891196234SPeter Wemm printf("Server not present!\n"); 33991196234SPeter Wemm serverOnly = 0; 34091196234SPeter Wemm } 3414893ef0bSMatthew Dillon if (serverOnly) { 3429b50d902SRodney W. Grimes printf("\nServer Info:\n"); 3439b50d902SRodney W. Grimes printf("%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n", 3449b50d902SRodney W. Grimes "Getattr", "Setattr", "Lookup", "Readlink", "Read", 3459b50d902SRodney W. Grimes "Write", "Create", "Remove"); 3469b50d902SRodney W. Grimes printf("%9d %9d %9d %9d %9d %9d %9d %9d\n", 34791196234SPeter Wemm nfsrvstats.srvrpccnt[NFSPROC_GETATTR], 34891196234SPeter Wemm nfsrvstats.srvrpccnt[NFSPROC_SETATTR], 34991196234SPeter Wemm nfsrvstats.srvrpccnt[NFSPROC_LOOKUP], 35091196234SPeter Wemm nfsrvstats.srvrpccnt[NFSPROC_READLINK], 35191196234SPeter Wemm nfsrvstats.srvrpccnt[NFSPROC_READ], 35291196234SPeter Wemm nfsrvstats.srvrpccnt[NFSPROC_WRITE], 35391196234SPeter Wemm nfsrvstats.srvrpccnt[NFSPROC_CREATE], 35491196234SPeter Wemm nfsrvstats.srvrpccnt[NFSPROC_REMOVE]); 3559b50d902SRodney W. Grimes printf("%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n", 3569b50d902SRodney W. Grimes "Rename", "Link", "Symlink", "Mkdir", "Rmdir", 357a62dc406SDoug Rabson "Readdir", "RdirPlus", "Access"); 3589b50d902SRodney W. Grimes printf("%9d %9d %9d %9d %9d %9d %9d %9d\n", 35991196234SPeter Wemm nfsrvstats.srvrpccnt[NFSPROC_RENAME], 36091196234SPeter Wemm nfsrvstats.srvrpccnt[NFSPROC_LINK], 36191196234SPeter Wemm nfsrvstats.srvrpccnt[NFSPROC_SYMLINK], 36291196234SPeter Wemm nfsrvstats.srvrpccnt[NFSPROC_MKDIR], 36391196234SPeter Wemm nfsrvstats.srvrpccnt[NFSPROC_RMDIR], 36491196234SPeter Wemm nfsrvstats.srvrpccnt[NFSPROC_READDIR], 36591196234SPeter Wemm nfsrvstats.srvrpccnt[NFSPROC_READDIRPLUS], 36691196234SPeter Wemm nfsrvstats.srvrpccnt[NFSPROC_ACCESS]); 36791196234SPeter Wemm printf("%9.9s %9.9s %9.9s %9.9s %9.9s\n", 36891196234SPeter Wemm "Mknod", "Fsstat", "Fsinfo", "PathConf", "Commit"); 36991196234SPeter Wemm printf("%9d %9d %9d %9d %9d\n", 37091196234SPeter Wemm nfsrvstats.srvrpccnt[NFSPROC_MKNOD], 37191196234SPeter Wemm nfsrvstats.srvrpccnt[NFSPROC_FSSTAT], 37291196234SPeter Wemm nfsrvstats.srvrpccnt[NFSPROC_FSINFO], 37391196234SPeter Wemm nfsrvstats.srvrpccnt[NFSPROC_PATHCONF], 37491196234SPeter Wemm nfsrvstats.srvrpccnt[NFSPROC_COMMIT]); 3759b50d902SRodney W. Grimes printf("Server Ret-Failed\n"); 37691196234SPeter Wemm printf("%17d\n", nfsrvstats.srvrpc_errs); 3779b50d902SRodney W. Grimes printf("Server Faults\n"); 37891196234SPeter Wemm printf("%13d\n", nfsrvstats.srv_errs); 3799b50d902SRodney W. Grimes printf("Server Cache Stats:\n"); 3809b50d902SRodney W. Grimes printf("%9.9s %9.9s %9.9s %9.9s\n", 3819b50d902SRodney W. Grimes "Inprog", "Idem", "Non-idem", "Misses"); 3829b50d902SRodney W. Grimes printf("%9d %9d %9d %9d\n", 38391196234SPeter Wemm nfsrvstats.srvcache_inproghits, 38491196234SPeter Wemm nfsrvstats.srvcache_idemdonehits, 38591196234SPeter Wemm nfsrvstats.srvcache_nonidemdonehits, 38691196234SPeter Wemm nfsrvstats.srvcache_misses); 387a62dc406SDoug Rabson printf("Server Write Gathering:\n"); 388a62dc406SDoug Rabson printf("%9.9s %9.9s %9.9s\n", 389a62dc406SDoug Rabson "WriteOps", "WriteRPC", "Opsaved"); 390a62dc406SDoug Rabson printf("%9d %9d %9d\n", 39191196234SPeter Wemm nfsrvstats.srvvop_writes, 39291196234SPeter Wemm nfsrvstats.srvrpccnt[NFSPROC_WRITE], 39391196234SPeter Wemm nfsrvstats.srvrpccnt[NFSPROC_WRITE] - 39491196234SPeter Wemm nfsrvstats.srvvop_writes); 3954893ef0bSMatthew Dillon } 3969b50d902SRodney W. Grimes } 3979b50d902SRodney W. Grimes 3989b50d902SRodney W. Grimes u_char signalled; /* set if alarm goes off "early" */ 3999b50d902SRodney W. Grimes 4009b50d902SRodney W. Grimes /* 4019b50d902SRodney W. Grimes * Print a running summary of nfs statistics. 4029b50d902SRodney W. Grimes * Repeat display every interval seconds, showing statistics 4039b50d902SRodney W. Grimes * collected over that interval. Assumes that interval is non-zero. 4049b50d902SRodney W. Grimes * First line printed at top of screen is always cumulative. 4059b50d902SRodney W. Grimes */ 4069b50d902SRodney W. Grimes void 4074893ef0bSMatthew Dillon sidewaysintpr(u_int interval, int clientOnly, int serverOnly) 4089b50d902SRodney W. Grimes { 40991196234SPeter Wemm struct nfsstats nfsstats, lastst, *nfsstatsp; 41091196234SPeter Wemm struct nfsrvstats nfsrvstats, lastsrvst, *nfsrvstatsp; 4114893ef0bSMatthew Dillon int hdrcnt = 1; 4129b50d902SRodney W. Grimes 41391196234SPeter Wemm nfsstatsp = &lastst; 41491196234SPeter Wemm nfsrvstatsp = &lastsrvst; 415813947b7SJohn Baldwin readstats(&nfsstatsp, &nfsrvstatsp, 0); 41691196234SPeter Wemm if (clientOnly && !nfsstatsp) { 41791196234SPeter Wemm printf("Client not present!\n"); 41891196234SPeter Wemm clientOnly = 0; 41991196234SPeter Wemm } 42091196234SPeter Wemm if (serverOnly && !nfsrvstatsp) { 42191196234SPeter Wemm printf("Server not present!\n"); 42291196234SPeter Wemm serverOnly = 0; 42391196234SPeter Wemm } 4244893ef0bSMatthew Dillon sleep(interval); 4259b50d902SRodney W. Grimes 4264893ef0bSMatthew Dillon for (;;) { 42791196234SPeter Wemm nfsstatsp = &nfsstats; 42891196234SPeter Wemm nfsrvstatsp = &nfsrvstats; 429813947b7SJohn Baldwin readstats(&nfsstatsp, &nfsrvstatsp, 0); 4304893ef0bSMatthew Dillon 4314893ef0bSMatthew Dillon if (--hdrcnt == 0) { 4324893ef0bSMatthew Dillon printhdr(clientOnly, serverOnly); 4334893ef0bSMatthew Dillon if (clientOnly && serverOnly) 4344893ef0bSMatthew Dillon hdrcnt = 10; 4354893ef0bSMatthew Dillon else 4369b50d902SRodney W. Grimes hdrcnt = 20; 4379b50d902SRodney W. Grimes } 4384893ef0bSMatthew Dillon if (clientOnly) { 4394893ef0bSMatthew Dillon printf("%s %6d %6d %6d %6d %6d %6d %6d %6d", 4404893ef0bSMatthew Dillon ((clientOnly && serverOnly) ? "Client:" : ""), 4414893ef0bSMatthew Dillon DELTA(attrcache_hits) + DELTA(attrcache_misses), 4424893ef0bSMatthew Dillon DELTA(lookupcache_hits) + DELTA(lookupcache_misses), 4434893ef0bSMatthew Dillon DELTA(biocache_readlinks), 4444893ef0bSMatthew Dillon DELTA(biocache_reads), 4454893ef0bSMatthew Dillon DELTA(biocache_writes), 446a62dc406SDoug Rabson nfsstats.rpccnt[NFSPROC_RENAME]-lastst.rpccnt[NFSPROC_RENAME], 4474893ef0bSMatthew Dillon DELTA(accesscache_hits) + DELTA(accesscache_misses), 4484893ef0bSMatthew Dillon DELTA(biocache_readdirs) 4494893ef0bSMatthew Dillon ); 4504893ef0bSMatthew Dillon if (widemode) { 4514893ef0bSMatthew Dillon printf(" %s %s %s %s %s %s", 4524893ef0bSMatthew Dillon sperc1(DELTA(attrcache_hits), 4534893ef0bSMatthew Dillon DELTA(attrcache_misses)), 4544893ef0bSMatthew Dillon sperc1(DELTA(lookupcache_hits), 4554893ef0bSMatthew Dillon DELTA(lookupcache_misses)), 4564893ef0bSMatthew Dillon sperc2(DELTA(biocache_reads), 4574893ef0bSMatthew Dillon DELTA(read_bios)), 4584893ef0bSMatthew Dillon sperc2(DELTA(biocache_writes), 4594893ef0bSMatthew Dillon DELTA(write_bios)), 4604893ef0bSMatthew Dillon sperc1(DELTA(accesscache_hits), 4614893ef0bSMatthew Dillon DELTA(accesscache_misses)), 4624893ef0bSMatthew Dillon sperc2(DELTA(biocache_readdirs), 4634893ef0bSMatthew Dillon DELTA(readdir_bios)) 4644893ef0bSMatthew Dillon ); 4654893ef0bSMatthew Dillon } 4664893ef0bSMatthew Dillon printf("\n"); 46791196234SPeter Wemm lastst = nfsstats; 4684893ef0bSMatthew Dillon } 4694893ef0bSMatthew Dillon if (serverOnly) { 4704893ef0bSMatthew Dillon printf("%s %6d %6d %6d %6d %6d %6d %6d %6d", 4714893ef0bSMatthew Dillon ((clientOnly && serverOnly) ? "Server:" : ""), 47291196234SPeter Wemm nfsrvstats.srvrpccnt[NFSPROC_GETATTR]-lastsrvst.srvrpccnt[NFSPROC_GETATTR], 47391196234SPeter Wemm nfsrvstats.srvrpccnt[NFSPROC_LOOKUP]-lastsrvst.srvrpccnt[NFSPROC_LOOKUP], 47491196234SPeter Wemm nfsrvstats.srvrpccnt[NFSPROC_READLINK]-lastsrvst.srvrpccnt[NFSPROC_READLINK], 47591196234SPeter Wemm nfsrvstats.srvrpccnt[NFSPROC_READ]-lastsrvst.srvrpccnt[NFSPROC_READ], 47691196234SPeter Wemm nfsrvstats.srvrpccnt[NFSPROC_WRITE]-lastsrvst.srvrpccnt[NFSPROC_WRITE], 47791196234SPeter Wemm nfsrvstats.srvrpccnt[NFSPROC_RENAME]-lastsrvst.srvrpccnt[NFSPROC_RENAME], 47891196234SPeter Wemm nfsrvstats.srvrpccnt[NFSPROC_ACCESS]-lastsrvst.srvrpccnt[NFSPROC_ACCESS], 47991196234SPeter Wemm (nfsrvstats.srvrpccnt[NFSPROC_READDIR]-lastsrvst.srvrpccnt[NFSPROC_READDIR]) 48091196234SPeter Wemm +(nfsrvstats.srvrpccnt[NFSPROC_READDIRPLUS]-lastsrvst.srvrpccnt[NFSPROC_READDIRPLUS])); 4814893ef0bSMatthew Dillon printf("\n"); 48291196234SPeter Wemm lastsrvst = nfsrvstats; 4834893ef0bSMatthew Dillon } 4849b50d902SRodney W. Grimes fflush(stdout); 4854893ef0bSMatthew Dillon sleep(interval); 4869b50d902SRodney W. Grimes } 4879b50d902SRodney W. Grimes /*NOTREACHED*/ 4889b50d902SRodney W. Grimes } 4899b50d902SRodney W. Grimes 4909b50d902SRodney W. Grimes void 4914893ef0bSMatthew Dillon printhdr(int clientOnly, int serverOnly) 4929b50d902SRodney W. Grimes { 4934893ef0bSMatthew Dillon printf("%s%6.6s %6.6s %6.6s %6.6s %6.6s %6.6s %6.6s %6.6s", 4944893ef0bSMatthew Dillon ((serverOnly && clientOnly) ? " " : " "), 4954893ef0bSMatthew Dillon "GtAttr", "Lookup", "Rdlink", "Read", "Write", "Rename", 4964893ef0bSMatthew Dillon "Access", "Rddir"); 4974893ef0bSMatthew Dillon if (widemode && clientOnly) { 4984893ef0bSMatthew Dillon printf(" Attr Lkup BioR BioW Accs BioD"); 4999b50d902SRodney W. Grimes } 5004893ef0bSMatthew Dillon printf("\n"); 5014893ef0bSMatthew Dillon fflush(stdout); 5029b50d902SRodney W. Grimes } 5039b50d902SRodney W. Grimes 5049b50d902SRodney W. Grimes void 505813947b7SJohn Baldwin usage(void) 5069b50d902SRodney W. Grimes { 5079b50d902SRodney W. Grimes (void)fprintf(stderr, 508813947b7SJohn Baldwin "usage: nfsstat [-cszW] [-M core] [-N system] [-w interval]\n"); 5099b50d902SRodney W. Grimes exit(1); 5109b50d902SRodney W. Grimes } 5114893ef0bSMatthew Dillon 5124893ef0bSMatthew Dillon static char SPBuf[64][8]; 5134893ef0bSMatthew Dillon static int SPIndex; 5144893ef0bSMatthew Dillon 5154893ef0bSMatthew Dillon char * 5164893ef0bSMatthew Dillon sperc1(int hits, int misses) 5174893ef0bSMatthew Dillon { 5184893ef0bSMatthew Dillon char *p = SPBuf[SPIndex]; 5194893ef0bSMatthew Dillon 5204893ef0bSMatthew Dillon if (hits + misses) { 5214893ef0bSMatthew Dillon sprintf(p, "%3d%%", 5224893ef0bSMatthew Dillon (int)(char)((quad_t)hits * 100 / (hits + misses))); 5234893ef0bSMatthew Dillon } else { 5244893ef0bSMatthew Dillon sprintf(p, " -"); 5254893ef0bSMatthew Dillon } 5264893ef0bSMatthew Dillon SPIndex = (SPIndex + 1) & 63; 5274893ef0bSMatthew Dillon return(p); 5284893ef0bSMatthew Dillon } 5294893ef0bSMatthew Dillon 5304893ef0bSMatthew Dillon char * 5314893ef0bSMatthew Dillon sperc2(int ttl, int misses) 5324893ef0bSMatthew Dillon { 5334893ef0bSMatthew Dillon char *p = SPBuf[SPIndex]; 5344893ef0bSMatthew Dillon 5354893ef0bSMatthew Dillon if (ttl) { 5364893ef0bSMatthew Dillon sprintf(p, "%3d%%", 5374893ef0bSMatthew Dillon (int)(char)((quad_t)(ttl - misses) * 100 / ttl)); 5384893ef0bSMatthew Dillon } else { 5394893ef0bSMatthew Dillon sprintf(p, " -"); 5404893ef0bSMatthew Dillon } 5414893ef0bSMatthew Dillon SPIndex = (SPIndex + 1) & 63; 5424893ef0bSMatthew Dillon return(p); 5434893ef0bSMatthew Dillon } 5444893ef0bSMatthew Dillon 545bcdaa850SRick Macklem /* 546bcdaa850SRick Macklem * Print a description of the nfs stats for the experimental client/server. 547bcdaa850SRick Macklem */ 548bcdaa850SRick Macklem void 549bcdaa850SRick Macklem exp_intpr(int clientOnly, int serverOnly) 550bcdaa850SRick Macklem { 551bcdaa850SRick Macklem 552bcdaa850SRick Macklem if (clientOnly != 0) { 553bcdaa850SRick Macklem if (printtitle) { 554bcdaa850SRick Macklem printf("Client Info:\n"); 555bcdaa850SRick Macklem printf("Rpc Counts:\n"); 556bcdaa850SRick Macklem printf( 557bcdaa850SRick Macklem "%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n" 558bcdaa850SRick Macklem , "Getattr", "Setattr", "Lookup", "Readlink", 559bcdaa850SRick Macklem "Read", "Write", "Create", "Remove"); 560bcdaa850SRick Macklem } 561bcdaa850SRick Macklem printf("%9d %9d %9d %9d %9d %9d %9d %9d\n", 562bcdaa850SRick Macklem ext_nfsstats.rpccnt[NFSPROC_GETATTR], 563bcdaa850SRick Macklem ext_nfsstats.rpccnt[NFSPROC_SETATTR], 564bcdaa850SRick Macklem ext_nfsstats.rpccnt[NFSPROC_LOOKUP], 565bcdaa850SRick Macklem ext_nfsstats.rpccnt[NFSPROC_READLINK], 566bcdaa850SRick Macklem ext_nfsstats.rpccnt[NFSPROC_READ], 567bcdaa850SRick Macklem ext_nfsstats.rpccnt[NFSPROC_WRITE], 568bcdaa850SRick Macklem ext_nfsstats.rpccnt[NFSPROC_CREATE], 569bcdaa850SRick Macklem ext_nfsstats.rpccnt[NFSPROC_REMOVE]); 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 , "Rename", "Link", "Symlink", "Mkdir", "Rmdir", 574bcdaa850SRick Macklem "Readdir", "RdirPlus", "Access"); 575bcdaa850SRick Macklem printf("%9d %9d %9d %9d %9d %9d %9d %9d\n", 576bcdaa850SRick Macklem ext_nfsstats.rpccnt[NFSPROC_RENAME], 577bcdaa850SRick Macklem ext_nfsstats.rpccnt[NFSPROC_LINK], 578bcdaa850SRick Macklem ext_nfsstats.rpccnt[NFSPROC_SYMLINK], 579bcdaa850SRick Macklem ext_nfsstats.rpccnt[NFSPROC_MKDIR], 580bcdaa850SRick Macklem ext_nfsstats.rpccnt[NFSPROC_RMDIR], 581bcdaa850SRick Macklem ext_nfsstats.rpccnt[NFSPROC_READDIR], 582bcdaa850SRick Macklem ext_nfsstats.rpccnt[NFSPROC_READDIRPLUS], 583bcdaa850SRick Macklem ext_nfsstats.rpccnt[NFSPROC_ACCESS]); 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 , "Mknod", "Fsstat", "Fsinfo", "PathConf", 588bcdaa850SRick Macklem "Commit", "SetClId", "SetClIdCf", "Lock"); 589bcdaa850SRick Macklem printf("%9d %9d %9d %9d %9d %9d %9d %9d\n", 590bcdaa850SRick Macklem ext_nfsstats.rpccnt[NFSPROC_MKNOD], 591bcdaa850SRick Macklem ext_nfsstats.rpccnt[NFSPROC_FSSTAT], 592bcdaa850SRick Macklem ext_nfsstats.rpccnt[NFSPROC_FSINFO], 593bcdaa850SRick Macklem ext_nfsstats.rpccnt[NFSPROC_PATHCONF], 594bcdaa850SRick Macklem ext_nfsstats.rpccnt[NFSPROC_COMMIT], 595bcdaa850SRick Macklem ext_nfsstats.rpccnt[NFSPROC_SETCLIENTID], 596bcdaa850SRick Macklem ext_nfsstats.rpccnt[NFSPROC_SETCLIENTIDCFRM], 597bcdaa850SRick Macklem ext_nfsstats.rpccnt[NFSPROC_LOCK]); 598bcdaa850SRick Macklem if (printtitle) 599bcdaa850SRick Macklem printf("%9.9s %9.9s %9.9s %9.9s\n", 600bcdaa850SRick Macklem "LockT", "LockU", "Open", "OpenCfr"); 601bcdaa850SRick Macklem printf("%9d %9d %9d %9d\n", 602bcdaa850SRick Macklem ext_nfsstats.rpccnt[NFSPROC_LOCKT], 603bcdaa850SRick Macklem ext_nfsstats.rpccnt[NFSPROC_LOCKU], 604bcdaa850SRick Macklem ext_nfsstats.rpccnt[NFSPROC_OPEN], 605bcdaa850SRick Macklem ext_nfsstats.rpccnt[NFSPROC_OPENCONFIRM]); 606bcdaa850SRick Macklem if (printtitle) 607bcdaa850SRick Macklem printf( 608bcdaa850SRick Macklem "%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n" 609bcdaa850SRick Macklem , "OpenOwner", "Opens", "LockOwner", 610bcdaa850SRick Macklem "Locks", "Delegs", "LocalOwn", 611bcdaa850SRick Macklem "LocalOpen", "LocalLOwn"); 612bcdaa850SRick Macklem printf("%9d %9d %9d %9d %9d %9d %9d %9d\n", 613bcdaa850SRick Macklem ext_nfsstats.clopenowners, 614bcdaa850SRick Macklem ext_nfsstats.clopens, 615bcdaa850SRick Macklem ext_nfsstats.cllockowners, 616bcdaa850SRick Macklem ext_nfsstats.cllocks, 617bcdaa850SRick Macklem ext_nfsstats.cldelegates, 618bcdaa850SRick Macklem ext_nfsstats.cllocalopenowners, 619bcdaa850SRick Macklem ext_nfsstats.cllocalopens, 620bcdaa850SRick Macklem ext_nfsstats.cllocallockowners); 621bcdaa850SRick Macklem if (printtitle) 622bcdaa850SRick Macklem printf("%9.9s\n", "LocalLock"); 623bcdaa850SRick Macklem printf("%9d\n", ext_nfsstats.cllocallocks); 624bcdaa850SRick Macklem if (printtitle) { 625bcdaa850SRick Macklem printf("Rpc Info:\n"); 626bcdaa850SRick Macklem printf("%9.9s %9.9s %9.9s %9.9s %9.9s\n", 627bcdaa850SRick Macklem "TimedOut", "Invalid", "X Replies", "Retries", 628bcdaa850SRick Macklem "Requests"); 629bcdaa850SRick Macklem } 630bcdaa850SRick Macklem printf("%9d %9d %9d %9d %9d\n", 631bcdaa850SRick Macklem ext_nfsstats.rpctimeouts, 632bcdaa850SRick Macklem ext_nfsstats.rpcinvalid, 633bcdaa850SRick Macklem ext_nfsstats.rpcunexpected, 634bcdaa850SRick Macklem ext_nfsstats.rpcretries, 635bcdaa850SRick Macklem ext_nfsstats.rpcrequests); 636bcdaa850SRick Macklem if (printtitle) { 637bcdaa850SRick Macklem printf("Cache Info:\n"); 638bcdaa850SRick Macklem printf("%9.9s %9.9s %9.9s %9.9s", 639bcdaa850SRick Macklem "Attr Hits", "Misses", "Lkup Hits", "Misses"); 640bcdaa850SRick Macklem printf(" %9.9s %9.9s %9.9s %9.9s\n", 641bcdaa850SRick Macklem "BioR Hits", "Misses", "BioW Hits", "Misses"); 642bcdaa850SRick Macklem } 643bcdaa850SRick Macklem printf("%9d %9d %9d %9d", 644bcdaa850SRick Macklem ext_nfsstats.attrcache_hits, 645bcdaa850SRick Macklem ext_nfsstats.attrcache_misses, 646bcdaa850SRick Macklem ext_nfsstats.lookupcache_hits, 647bcdaa850SRick Macklem ext_nfsstats.lookupcache_misses); 648bcdaa850SRick Macklem printf(" %9d %9d %9d %9d\n", 649bcdaa850SRick Macklem ext_nfsstats.biocache_reads, 650bcdaa850SRick Macklem ext_nfsstats.read_bios, 651bcdaa850SRick Macklem ext_nfsstats.biocache_writes, 652bcdaa850SRick Macklem ext_nfsstats.write_bios); 653bcdaa850SRick Macklem if (printtitle) { 654bcdaa850SRick Macklem printf("%9.9s %9.9s %9.9s %9.9s", 655bcdaa850SRick Macklem "BioRLHits", "Misses", "BioD Hits", "Misses"); 656bcdaa850SRick Macklem printf(" %9.9s %9.9s\n", "DirE Hits", "Misses"); 657bcdaa850SRick Macklem } 658bcdaa850SRick Macklem printf("%9d %9d %9d %9d", 659bcdaa850SRick Macklem ext_nfsstats.biocache_readlinks, 660bcdaa850SRick Macklem ext_nfsstats.readlink_bios, 661bcdaa850SRick Macklem ext_nfsstats.biocache_readdirs, 662bcdaa850SRick Macklem ext_nfsstats.readdir_bios); 663bcdaa850SRick Macklem printf(" %9d %9d\n", 664bcdaa850SRick Macklem ext_nfsstats.direofcache_hits, 665bcdaa850SRick Macklem ext_nfsstats.direofcache_misses); 666bcdaa850SRick Macklem } 667bcdaa850SRick Macklem if (serverOnly != 0) { 668bcdaa850SRick Macklem if (printtitle) { 669bcdaa850SRick Macklem printf("\nServer Info:\n"); 670bcdaa850SRick Macklem printf( 671bcdaa850SRick Macklem "%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n" 672bcdaa850SRick Macklem , "Getattr", "Setattr", "Lookup", "Readlink", 673bcdaa850SRick Macklem "Read", "Write", "Create", "Remove"); 674bcdaa850SRick Macklem } 675bcdaa850SRick Macklem printf("%9d %9d %9d %9d %9d %9d %9d %9d\n", 676bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_GETATTR], 677bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_SETATTR], 678bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_LOOKUP], 679bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_READLINK], 680bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_READ], 681bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_WRITE], 682bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_V3CREATE], 683bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_REMOVE]); 684bcdaa850SRick Macklem if (printtitle) 685bcdaa850SRick Macklem printf( 686bcdaa850SRick Macklem "%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n" 687bcdaa850SRick Macklem , "Rename", "Link", "Symlink", "Mkdir", "Rmdir", 688bcdaa850SRick Macklem "Readdir", "RdirPlus", "Access"); 689bcdaa850SRick Macklem printf("%9d %9d %9d %9d %9d %9d %9d %9d\n", 690bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_RENAME], 691bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_LINK], 692bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_SYMLINK], 693bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_MKDIR], 694bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_RMDIR], 695bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_READDIR], 696bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_READDIRPLUS], 697bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_ACCESS]); 698bcdaa850SRick Macklem if (printtitle) 699bcdaa850SRick Macklem printf( 700bcdaa850SRick Macklem "%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n" 701bcdaa850SRick Macklem , "Mknod", "Fsstat", "Fsinfo", "PathConf", 702bcdaa850SRick Macklem "Commit", "LookupP", "SetClId", "SetClIdCf"); 703bcdaa850SRick Macklem printf("%9d %9d %9d %9d %9d %9d %9d %9d\n", 704bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_MKNOD], 705bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_FSSTAT], 706bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_FSINFO], 707bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_PATHCONF], 708bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_COMMIT], 709bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_LOOKUPP], 710bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_SETCLIENTID], 711bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_SETCLIENTIDCFRM]); 712bcdaa850SRick Macklem if (printtitle) 713bcdaa850SRick Macklem printf( 714bcdaa850SRick Macklem "%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n" 715bcdaa850SRick Macklem , "Open", "OpenAttr", "OpenDwnGr", "OpenCfrm", 716bcdaa850SRick Macklem "DelePurge", "DeleRet", "GetFH", "Lock"); 717bcdaa850SRick Macklem printf("%9d %9d %9d %9d %9d %9d %9d %9d\n", 718bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_OPEN], 719bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_OPENATTR], 720bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_OPENDOWNGRADE], 721bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_OPENCONFIRM], 722bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_DELEGPURGE], 723bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_DELEGRETURN], 724bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_GETFH], 725bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_LOCK]); 726bcdaa850SRick Macklem if (printtitle) 727bcdaa850SRick Macklem printf( 728bcdaa850SRick Macklem "%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n" 729bcdaa850SRick Macklem , "LockT", "LockU", "Close", "Verify", "NVerify", 730bcdaa850SRick Macklem "PutFH", "PutPubFH", "PutRootFH"); 731bcdaa850SRick Macklem printf("%9d %9d %9d %9d %9d %9d %9d %9d\n", 732bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_LOCKT], 733bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_LOCKU], 734bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_CLOSE], 735bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_VERIFY], 736bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_NVERIFY], 737bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_PUTFH], 738bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_PUTPUBFH], 739bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_PUTROOTFH]); 740bcdaa850SRick Macklem if (printtitle) 741bcdaa850SRick Macklem printf("%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n", 742bcdaa850SRick Macklem "Renew", "RestoreFH", "SaveFH", "Secinfo", 743bcdaa850SRick Macklem "RelLckOwn", "V4Create"); 744bcdaa850SRick Macklem printf("%9d %9d %9d %9d %9d %9d\n", 745bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_RENEW], 746bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_RESTOREFH], 747bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_SAVEFH], 748bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_SECINFO], 749bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_RELEASELCKOWN], 750bcdaa850SRick Macklem ext_nfsstats.srvrpccnt[NFSV4OP_CREATE]); 751bcdaa850SRick Macklem if (printtitle) { 752bcdaa850SRick Macklem printf("Server:\n"); 753bcdaa850SRick Macklem printf("%9.9s %9.9s %9.9s\n", 754bcdaa850SRick Macklem "Retfailed", "Faults", "Clients"); 755bcdaa850SRick Macklem } 756bcdaa850SRick Macklem printf("%9d %9d %9d\n", 757bcdaa850SRick Macklem ext_nfsstats.srv_errs, ext_nfsstats.srvrpc_errs, 758bcdaa850SRick Macklem ext_nfsstats.srvclients); 759bcdaa850SRick Macklem if (printtitle) 760bcdaa850SRick Macklem printf("%9.9s %9.9s %9.9s %9.9s %9.9s \n", 761bcdaa850SRick Macklem "OpenOwner", "Opens", "LockOwner", 762bcdaa850SRick Macklem "Locks", "Delegs"); 763bcdaa850SRick Macklem printf("%9d %9d %9d %9d %9d \n", 764bcdaa850SRick Macklem ext_nfsstats.srvopenowners, 765bcdaa850SRick Macklem ext_nfsstats.srvopens, 766bcdaa850SRick Macklem ext_nfsstats.srvlockowners, 767bcdaa850SRick Macklem ext_nfsstats.srvlocks, 768bcdaa850SRick Macklem ext_nfsstats.srvdelegates); 769bcdaa850SRick Macklem if (printtitle) { 770bcdaa850SRick Macklem printf("Server Cache Stats:\n"); 771bcdaa850SRick Macklem printf("%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n", 772bcdaa850SRick Macklem "Inprog", "Idem", "Non-idem", "Misses", 773bcdaa850SRick Macklem "CacheSize", "TCPPeak"); 774bcdaa850SRick Macklem } 775bcdaa850SRick Macklem printf("%9d %9d %9d %9d %9d %9d\n", 776bcdaa850SRick Macklem ext_nfsstats.srvcache_inproghits, 777bcdaa850SRick Macklem ext_nfsstats.srvcache_idemdonehits, 778bcdaa850SRick Macklem ext_nfsstats.srvcache_nonidemdonehits, 779bcdaa850SRick Macklem ext_nfsstats.srvcache_misses, 780bcdaa850SRick Macklem ext_nfsstats.srvcache_size, 781bcdaa850SRick Macklem ext_nfsstats.srvcache_tcppeak); 782bcdaa850SRick Macklem } 783bcdaa850SRick Macklem } 784bcdaa850SRick Macklem 785bcdaa850SRick Macklem /* 786bcdaa850SRick Macklem * Print a running summary of nfs statistics for the experimental client and/or 787bcdaa850SRick Macklem * server. 788bcdaa850SRick Macklem * Repeat display every interval seconds, showing statistics 789bcdaa850SRick Macklem * collected over that interval. Assumes that interval is non-zero. 790bcdaa850SRick Macklem * First line printed at top of screen is always cumulative. 791bcdaa850SRick Macklem */ 792bcdaa850SRick Macklem void 793bcdaa850SRick Macklem exp_sidewaysintpr(u_int interval, int clientOnly, int serverOnly) 794bcdaa850SRick Macklem { 795bcdaa850SRick Macklem struct ext_nfsstats nfsstats, lastst, *ext_nfsstatsp; 796bcdaa850SRick Macklem int hdrcnt = 1; 797bcdaa850SRick Macklem 798bcdaa850SRick Macklem ext_nfsstatsp = &lastst; 799bcdaa850SRick Macklem if (nfssvc(NFSSVC_GETSTATS, ext_nfsstatsp) < 0) 800bcdaa850SRick Macklem err(1, "Can't get stats"); 801bcdaa850SRick Macklem sleep(interval); 802bcdaa850SRick Macklem 803bcdaa850SRick Macklem for (;;) { 804bcdaa850SRick Macklem ext_nfsstatsp = &nfsstats; 805bcdaa850SRick Macklem if (nfssvc(NFSSVC_GETSTATS, ext_nfsstatsp) < 0) 806bcdaa850SRick Macklem err(1, "Can't get stats"); 807bcdaa850SRick Macklem 808bcdaa850SRick Macklem if (--hdrcnt == 0) { 809bcdaa850SRick Macklem printhdr(clientOnly, serverOnly); 810bcdaa850SRick Macklem if (clientOnly && serverOnly) 811bcdaa850SRick Macklem hdrcnt = 10; 812bcdaa850SRick Macklem else 813bcdaa850SRick Macklem hdrcnt = 20; 814bcdaa850SRick Macklem } 815bcdaa850SRick Macklem if (clientOnly) { 816bcdaa850SRick Macklem printf("%s %6d %6d %6d %6d %6d %6d %6d %6d", 817bcdaa850SRick Macklem ((clientOnly && serverOnly) ? "Client:" : ""), 818bcdaa850SRick Macklem DELTA(attrcache_hits) + DELTA(attrcache_misses), 819bcdaa850SRick Macklem DELTA(lookupcache_hits) + DELTA(lookupcache_misses), 820bcdaa850SRick Macklem DELTA(biocache_readlinks), 821bcdaa850SRick Macklem DELTA(biocache_reads), 822bcdaa850SRick Macklem DELTA(biocache_writes), 823bcdaa850SRick Macklem nfsstats.rpccnt[NFSPROC_RENAME] - 824bcdaa850SRick Macklem lastst.rpccnt[NFSPROC_RENAME], 825bcdaa850SRick Macklem DELTA(accesscache_hits) + DELTA(accesscache_misses), 826bcdaa850SRick Macklem DELTA(biocache_readdirs) 827bcdaa850SRick Macklem ); 828bcdaa850SRick Macklem if (widemode) { 829bcdaa850SRick Macklem printf(" %s %s %s %s %s %s", 830bcdaa850SRick Macklem sperc1(DELTA(attrcache_hits), 831bcdaa850SRick Macklem DELTA(attrcache_misses)), 832bcdaa850SRick Macklem sperc1(DELTA(lookupcache_hits), 833bcdaa850SRick Macklem DELTA(lookupcache_misses)), 834bcdaa850SRick Macklem sperc2(DELTA(biocache_reads), 835bcdaa850SRick Macklem DELTA(read_bios)), 836bcdaa850SRick Macklem sperc2(DELTA(biocache_writes), 837bcdaa850SRick Macklem DELTA(write_bios)), 838bcdaa850SRick Macklem sperc1(DELTA(accesscache_hits), 839bcdaa850SRick Macklem DELTA(accesscache_misses)), 840bcdaa850SRick Macklem sperc2(DELTA(biocache_readdirs), 841bcdaa850SRick Macklem DELTA(readdir_bios)) 842bcdaa850SRick Macklem ); 843bcdaa850SRick Macklem } 844bcdaa850SRick Macklem printf("\n"); 845bcdaa850SRick Macklem lastst = nfsstats; 846bcdaa850SRick Macklem } 847bcdaa850SRick Macklem if (serverOnly) { 848bcdaa850SRick Macklem printf("%s %6d %6d %6d %6d %6d %6d %6d %6d", 849bcdaa850SRick Macklem ((clientOnly && serverOnly) ? "Server:" : ""), 850bcdaa850SRick Macklem nfsstats.srvrpccnt[NFSPROC_GETATTR] - 851bcdaa850SRick Macklem lastst.srvrpccnt[NFSPROC_GETATTR], 852bcdaa850SRick Macklem nfsstats.srvrpccnt[NFSPROC_LOOKUP] - 853bcdaa850SRick Macklem lastst.srvrpccnt[NFSPROC_LOOKUP], 854bcdaa850SRick Macklem nfsstats.srvrpccnt[NFSPROC_READLINK] - 855bcdaa850SRick Macklem lastst.srvrpccnt[NFSPROC_READLINK], 856bcdaa850SRick Macklem nfsstats.srvrpccnt[NFSPROC_READ] - 857bcdaa850SRick Macklem lastst.srvrpccnt[NFSPROC_READ], 858bcdaa850SRick Macklem nfsstats.srvrpccnt[NFSPROC_WRITE] - 859bcdaa850SRick Macklem lastst.srvrpccnt[NFSPROC_WRITE], 860bcdaa850SRick Macklem nfsstats.srvrpccnt[NFSPROC_RENAME] - 861bcdaa850SRick Macklem lastst.srvrpccnt[NFSPROC_RENAME], 862bcdaa850SRick Macklem nfsstats.srvrpccnt[NFSPROC_ACCESS] - 863bcdaa850SRick Macklem lastst.srvrpccnt[NFSPROC_ACCESS], 864bcdaa850SRick Macklem (nfsstats.srvrpccnt[NFSPROC_READDIR] - 865bcdaa850SRick Macklem lastst.srvrpccnt[NFSPROC_READDIR]) + 866bcdaa850SRick Macklem (nfsstats.srvrpccnt[NFSPROC_READDIRPLUS] - 867bcdaa850SRick Macklem lastst.srvrpccnt[NFSPROC_READDIRPLUS])); 868bcdaa850SRick Macklem printf("\n"); 869bcdaa850SRick Macklem lastst = nfsstats; 870bcdaa850SRick Macklem } 871bcdaa850SRick Macklem fflush(stdout); 872bcdaa850SRick Macklem sleep(interval); 873bcdaa850SRick Macklem } 874bcdaa850SRick Macklem /*NOTREACHED*/ 875bcdaa850SRick Macklem } 876bcdaa850SRick Macklem 877