nfsstat.c revision 225109
11590Srgrimes/* 21590Srgrimes * Copyright (c) 1983, 1989, 1993 31590Srgrimes * The Regents of the University of California. All rights reserved. 41590Srgrimes * 51590Srgrimes * This code is derived from software contributed to Berkeley by 61590Srgrimes * Rick Macklem at The University of Guelph. 71590Srgrimes * 81590Srgrimes * Redistribution and use in source and binary forms, with or without 91590Srgrimes * modification, are permitted provided that the following conditions 101590Srgrimes * are met: 111590Srgrimes * 1. Redistributions of source code must retain the above copyright 121590Srgrimes * notice, this list of conditions and the following disclaimer. 131590Srgrimes * 2. Redistributions in binary form must reproduce the above copyright 141590Srgrimes * notice, this list of conditions and the following disclaimer in the 151590Srgrimes * documentation and/or other materials provided with the distribution. 161590Srgrimes * 4. Neither the name of the University nor the names of its contributors 171590Srgrimes * may be used to endorse or promote products derived from this software 181590Srgrimes * without specific prior written permission. 191590Srgrimes * 201590Srgrimes * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 211590Srgrimes * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 221590Srgrimes * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 231590Srgrimes * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 241590Srgrimes * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 251590Srgrimes * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 261590Srgrimes * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 271590Srgrimes * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 281590Srgrimes * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 291590Srgrimes * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 301590Srgrimes * SUCH DAMAGE. 311590Srgrimes */ 321590Srgrimes 331590Srgrimes#ifndef lint 34194792Sdelphijstatic const char copyright[] = 351590Srgrimes"@(#) Copyright (c) 1983, 1989, 1993\n\ 361590Srgrimes The Regents of the University of California. All rights reserved.\n"; 371590Srgrimes#endif /* not lint */ 381590Srgrimes 391590Srgrimes#ifndef lint 4032649Sbde#if 0 4132649Sbdestatic char sccsid[] = "@(#)nfsstat.c 8.2 (Berkeley) 3/31/95"; 4232649Sbde#endif 433819Swollmanstatic const char rcsid[] = 4450477Speter "$FreeBSD: head/usr.bin/nfsstat/nfsstat.c 225109 2011-08-23 13:17:09Z rmacklem $"; 451590Srgrimes#endif /* not lint */ 461590Srgrimes 471590Srgrimes#include <sys/param.h> 48194190Sed#include <sys/module.h> 491590Srgrimes#include <sys/mount.h> 5011936Sphk#include <sys/time.h> 513819Swollman#include <sys/sysctl.h> 529336Sdfr#include <nfs/nfsproto.h> 5383653Speter#include <nfsclient/nfs.h> 5483653Speter#include <nfsserver/nfs.h> 55192762Srmacklem#include <nfs/nfssvc.h> 56192762Srmacklem 57192762Srmacklem#include <fs/nfs/nfsport.h> 58192762Srmacklem 591590Srgrimes#include <signal.h> 601590Srgrimes#include <fcntl.h> 61200462Sdelphij#include <ctype.h> 621590Srgrimes#include <errno.h> 631590Srgrimes#include <kvm.h> 6477207Stmm#include <limits.h> 651590Srgrimes#include <nlist.h> 661590Srgrimes#include <unistd.h> 671590Srgrimes#include <stdio.h> 681590Srgrimes#include <stdlib.h> 691590Srgrimes#include <string.h> 70200462Sdelphij#include <paths.h> 713819Swollman#include <err.h> 721590Srgrimes 731590Srgrimesstruct nlist nl[] = { 741590Srgrimes#define N_NFSSTAT 0 75194792Sdelphij { .n_name = "nfsstats" }, 7683653Speter#define N_NFSRVSTAT 1 77194792Sdelphij { .n_name = "nfsrvstats" }, 78194792Sdelphij { .n_name = NULL }, 791590Srgrimes}; 801590Srgrimeskvm_t *kd; 811590Srgrimes 823819Swollmanstatic int deadkernel = 0; 8352493Sdillonstatic int widemode = 0; 84172759Sjhbstatic int zflag = 0; 85221455Srmacklemstatic int run_v4 = 1; 86192762Srmacklemstatic int printtitle = 1; 87192762Srmacklemstatic struct ext_nfsstats ext_nfsstats; 88221455Srmacklemstatic int extra_output = 0; 891590Srgrimes 9092921Simpvoid intpr(int, int); 9192921Simpvoid printhdr(int, int); 9292921Simpvoid sidewaysintpr(u_int, int, int); 9392921Simpvoid usage(void); 9492921Simpchar *sperc1(int, int); 9592921Simpchar *sperc2(int, int); 96192762Srmacklemvoid exp_intpr(int, int); 97192762Srmacklemvoid exp_sidewaysintpr(u_int, int, int); 983819Swollman 9952493Sdillon#define DELTA(field) (nfsstats.field - lastst.field) 10052493Sdillon 101131990Sstefanfint 102172759Sjhbmain(int argc, char **argv) 1031590Srgrimes{ 1041590Srgrimes u_int interval; 10552493Sdillon int clientOnly = -1; 10652493Sdillon int serverOnly = -1; 1071590Srgrimes int ch; 1081590Srgrimes char *memf, *nlistf; 10977207Stmm char errbuf[_POSIX2_LINE_MAX]; 1101590Srgrimes 1111590Srgrimes interval = 0; 1121590Srgrimes memf = nlistf = NULL; 113221455Srmacklem while ((ch = getopt(argc, argv, "cesWM:N:ow:z")) != -1) 1141590Srgrimes switch(ch) { 1151590Srgrimes case 'M': 1161590Srgrimes memf = optarg; 1171590Srgrimes break; 1181590Srgrimes case 'N': 1191590Srgrimes nlistf = optarg; 1201590Srgrimes break; 12152493Sdillon case 'W': 12252493Sdillon widemode = 1; 12352493Sdillon break; 1241590Srgrimes case 'w': 1251590Srgrimes interval = atoi(optarg); 1261590Srgrimes break; 12752493Sdillon case 'c': 12852493Sdillon clientOnly = 1; 12952493Sdillon if (serverOnly < 0) 13052493Sdillon serverOnly = 0; 13152493Sdillon break; 13252493Sdillon case 's': 13352493Sdillon serverOnly = 1; 13452493Sdillon if (clientOnly < 0) 13552493Sdillon clientOnly = 0; 13652493Sdillon break; 137172759Sjhb case 'z': 138172759Sjhb zflag = 1; 139172759Sjhb break; 140221455Srmacklem case 'o': 141221455Srmacklem if (extra_output != 0) 142221455Srmacklem err(1, "-o incompatible with -e"); 143221455Srmacklem run_v4 = 0; 144221455Srmacklem break; 145193258Srmacklem case 'e': 146221455Srmacklem if (run_v4 == 0) 147221455Srmacklem err(1, "-e incompatible with -o"); 148221455Srmacklem extra_output = 1; 149192762Srmacklem break; 1501590Srgrimes case '?': 1511590Srgrimes default: 1521590Srgrimes usage(); 1531590Srgrimes } 1541590Srgrimes argc -= optind; 1551590Srgrimes argv += optind; 1561590Srgrimes 1571590Srgrimes#define BACKWARD_COMPATIBILITY 1581590Srgrimes#ifdef BACKWARD_COMPATIBILITY 1591590Srgrimes if (*argv) { 1601590Srgrimes interval = atoi(*argv); 1611590Srgrimes if (*++argv) { 1621590Srgrimes nlistf = *argv; 1631590Srgrimes if (*++argv) 1641590Srgrimes memf = *argv; 1651590Srgrimes } 1661590Srgrimes } 1671590Srgrimes#endif 168192762Srmacklem if (run_v4 != 0 && modfind("nfscommon") < 0) 169221455Srmacklem errx(1, "new client/server not loaded"); 170192762Srmacklem 171221440Srmacklem if (run_v4 == 0 && (nlistf != NULL || memf != NULL)) { 1723819Swollman deadkernel = 1; 1731590Srgrimes 1743819Swollman if ((kd = kvm_openfiles(nlistf, memf, NULL, O_RDONLY, 1753819Swollman errbuf)) == 0) { 1763819Swollman errx(1, "kvm_openfiles: %s", errbuf); 1773819Swollman } 1783819Swollman if (kvm_nlist(kd, nl) != 0) { 1793819Swollman errx(1, "kvm_nlist: can't get names"); 1803819Swollman } 1811590Srgrimes } 1821590Srgrimes 183192762Srmacklem if (interval) { 184192762Srmacklem if (run_v4 > 0) 185192762Srmacklem exp_sidewaysintpr(interval, clientOnly, serverOnly); 186192762Srmacklem else 187192762Srmacklem sidewaysintpr(interval, clientOnly, serverOnly); 188192762Srmacklem } else { 189221455Srmacklem if (extra_output != 0) 190192762Srmacklem exp_intpr(clientOnly, serverOnly); 191192762Srmacklem else 192192762Srmacklem intpr(clientOnly, serverOnly); 193192762Srmacklem } 1941590Srgrimes exit(0); 1951590Srgrimes} 1961590Srgrimes 1971590Srgrimes/* 1983819Swollman * Read the nfs stats using sysctl(3) for live kernels, or kvm_read 1993819Swollman * for dead ones. 2003819Swollman */ 201194792Sdelphijstatic void 202172759Sjhbreadstats(struct nfsstats **stp, struct nfsrvstats **srvstp, int zero) 2033819Swollman{ 204172759Sjhb union { 205172759Sjhb struct nfsstats client; 206172759Sjhb struct nfsrvstats server; 207172759Sjhb } zerostat; 20883653Speter size_t buflen; 20983653Speter 21083653Speter if (deadkernel) { 211172759Sjhb if (*stp != NULL && kvm_read(kd, (u_long)nl[N_NFSSTAT].n_value, 212172759Sjhb *stp, sizeof(struct nfsstats)) < 0) { 21383653Speter *stp = NULL; 2143819Swollman } 215172759Sjhb if (*srvstp != NULL && kvm_read(kd, 216172759Sjhb (u_long)nl[N_NFSRVSTAT].n_value, *srvstp, 217172759Sjhb sizeof(struct nfsrvstats)) < 0) { 21883653Speter *srvstp = NULL; 21983653Speter } 2203819Swollman } else { 221172759Sjhb if (zero) 222172759Sjhb bzero(&zerostat, sizeof(zerostat)); 22383653Speter buflen = sizeof(struct nfsstats); 224221973Srmacklem if (*stp != NULL && sysctlbyname("vfs.oldnfs.nfsstats", *stp, 225172759Sjhb &buflen, zero ? &zerostat : NULL, zero ? buflen : 0) < 0) { 226172759Sjhb if (errno != ENOENT) 227221973Srmacklem err(1, "sysctl: vfs.oldnfs.nfsstats"); 22883653Speter *stp = NULL; 2293819Swollman } 23083653Speter buflen = sizeof(struct nfsrvstats); 231172759Sjhb if (*srvstp != NULL && sysctlbyname("vfs.nfsrv.nfsrvstats", 232172759Sjhb *srvstp, &buflen, zero ? &zerostat : NULL, 233172759Sjhb zero ? buflen : 0) < 0) { 234172759Sjhb if (errno != ENOENT) 235172759Sjhb err(1, "sysctl: vfs.nfsrv.nfsrvstats"); 23683653Speter *srvstp = NULL; 23783653Speter } 2383819Swollman } 2393819Swollman} 2403819Swollman 2413819Swollman/* 2421590Srgrimes * Print a description of the nfs stats. 2431590Srgrimes */ 2441590Srgrimesvoid 24552493Sdillonintpr(int clientOnly, int serverOnly) 2461590Srgrimes{ 24783653Speter struct nfsstats nfsstats, *nfsstatsp; 24883653Speter struct nfsrvstats nfsrvstats, *nfsrvstatsp; 249221455Srmacklem int nfssvc_flag; 2501590Srgrimes 251221455Srmacklem if (run_v4 == 0) { 252221455Srmacklem /* 253221455Srmacklem * Only read the stats we are going to display to avoid zeroing 254221455Srmacklem * stats the user didn't request. 255221455Srmacklem */ 256221455Srmacklem if (clientOnly) 257221455Srmacklem nfsstatsp = &nfsstats; 258221455Srmacklem else 259221455Srmacklem nfsstatsp = NULL; 260221455Srmacklem if (serverOnly) 261221455Srmacklem nfsrvstatsp = &nfsrvstats; 262221455Srmacklem else 263221455Srmacklem nfsrvstatsp = NULL; 264221455Srmacklem 265221455Srmacklem readstats(&nfsstatsp, &nfsrvstatsp, zflag); 266221455Srmacklem 267221455Srmacklem if (clientOnly && !nfsstatsp) { 268221455Srmacklem printf("Client not present!\n"); 269221455Srmacklem clientOnly = 0; 270221455Srmacklem } 271221455Srmacklem } else { 272221455Srmacklem nfssvc_flag = NFSSVC_GETSTATS; 273221455Srmacklem if (zflag != 0) { 274221455Srmacklem if (clientOnly != 0) 275221455Srmacklem nfssvc_flag |= NFSSVC_ZEROCLTSTATS; 276221455Srmacklem if (serverOnly != 0) 277221455Srmacklem nfssvc_flag |= NFSSVC_ZEROSRVSTATS; 278221455Srmacklem } 279221455Srmacklem if (nfssvc(nfssvc_flag, &ext_nfsstats) < 0) 280221455Srmacklem err(1, "Can't get stats"); 28183653Speter } 28252493Sdillon if (clientOnly) { 28352493Sdillon printf("Client Info:\n"); 28452493Sdillon printf("Rpc Counts:\n"); 28552493Sdillon printf("%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n", 28652493Sdillon "Getattr", "Setattr", "Lookup", "Readlink", "Read", 28752493Sdillon "Write", "Create", "Remove"); 288221455Srmacklem if (run_v4 == 0) 289221455Srmacklem printf("%9d %9d %9d %9d %9d %9d %9d %9d\n", 290221455Srmacklem nfsstats.rpccnt[NFSPROC_GETATTR], 291221455Srmacklem nfsstats.rpccnt[NFSPROC_SETATTR], 292221455Srmacklem nfsstats.rpccnt[NFSPROC_LOOKUP], 293221455Srmacklem nfsstats.rpccnt[NFSPROC_READLINK], 294221455Srmacklem nfsstats.rpccnt[NFSPROC_READ], 295221455Srmacklem nfsstats.rpccnt[NFSPROC_WRITE], 296221455Srmacklem nfsstats.rpccnt[NFSPROC_CREATE], 297221455Srmacklem nfsstats.rpccnt[NFSPROC_REMOVE]); 298221455Srmacklem else 299221455Srmacklem printf("%9d %9d %9d %9d %9d %9d %9d %9d\n", 300221455Srmacklem ext_nfsstats.rpccnt[NFSPROC_GETATTR], 301221455Srmacklem ext_nfsstats.rpccnt[NFSPROC_SETATTR], 302221455Srmacklem ext_nfsstats.rpccnt[NFSPROC_LOOKUP], 303221455Srmacklem ext_nfsstats.rpccnt[NFSPROC_READLINK], 304221455Srmacklem ext_nfsstats.rpccnt[NFSPROC_READ], 305221455Srmacklem ext_nfsstats.rpccnt[NFSPROC_WRITE], 306221455Srmacklem ext_nfsstats.rpccnt[NFSPROC_CREATE], 307221455Srmacklem ext_nfsstats.rpccnt[NFSPROC_REMOVE]); 30852493Sdillon printf("%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n", 30952493Sdillon "Rename", "Link", "Symlink", "Mkdir", "Rmdir", 31052493Sdillon "Readdir", "RdirPlus", "Access"); 311221455Srmacklem if (run_v4 == 0) 312221455Srmacklem printf("%9d %9d %9d %9d %9d %9d %9d %9d\n", 313221455Srmacklem nfsstats.rpccnt[NFSPROC_RENAME], 314221455Srmacklem nfsstats.rpccnt[NFSPROC_LINK], 315221455Srmacklem nfsstats.rpccnt[NFSPROC_SYMLINK], 316221455Srmacklem nfsstats.rpccnt[NFSPROC_MKDIR], 317221455Srmacklem nfsstats.rpccnt[NFSPROC_RMDIR], 318221455Srmacklem nfsstats.rpccnt[NFSPROC_READDIR], 319221455Srmacklem nfsstats.rpccnt[NFSPROC_READDIRPLUS], 320221455Srmacklem nfsstats.rpccnt[NFSPROC_ACCESS]); 321221455Srmacklem else 322221455Srmacklem printf("%9d %9d %9d %9d %9d %9d %9d %9d\n", 323221455Srmacklem ext_nfsstats.rpccnt[NFSPROC_RENAME], 324221455Srmacklem ext_nfsstats.rpccnt[NFSPROC_LINK], 325221455Srmacklem ext_nfsstats.rpccnt[NFSPROC_SYMLINK], 326221455Srmacklem ext_nfsstats.rpccnt[NFSPROC_MKDIR], 327221455Srmacklem ext_nfsstats.rpccnt[NFSPROC_RMDIR], 328221455Srmacklem ext_nfsstats.rpccnt[NFSPROC_READDIR], 329221455Srmacklem ext_nfsstats.rpccnt[NFSPROC_READDIRPLUS], 330221455Srmacklem ext_nfsstats.rpccnt[NFSPROC_ACCESS]); 33183653Speter printf("%9.9s %9.9s %9.9s %9.9s %9.9s\n", 33283653Speter "Mknod", "Fsstat", "Fsinfo", "PathConf", "Commit"); 333221455Srmacklem if (run_v4 == 0) 334221455Srmacklem printf("%9d %9d %9d %9d %9d\n", 335221455Srmacklem nfsstats.rpccnt[NFSPROC_MKNOD], 336221455Srmacklem nfsstats.rpccnt[NFSPROC_FSSTAT], 337221455Srmacklem nfsstats.rpccnt[NFSPROC_FSINFO], 338221455Srmacklem nfsstats.rpccnt[NFSPROC_PATHCONF], 339221455Srmacklem nfsstats.rpccnt[NFSPROC_COMMIT]); 340221455Srmacklem else 341221455Srmacklem printf("%9d %9d %9d %9d %9d\n", 342221455Srmacklem ext_nfsstats.rpccnt[NFSPROC_MKNOD], 343221455Srmacklem ext_nfsstats.rpccnt[NFSPROC_FSSTAT], 344221455Srmacklem ext_nfsstats.rpccnt[NFSPROC_FSINFO], 345221455Srmacklem ext_nfsstats.rpccnt[NFSPROC_PATHCONF], 346221455Srmacklem ext_nfsstats.rpccnt[NFSPROC_COMMIT]); 34752493Sdillon printf("Rpc Info:\n"); 34852493Sdillon printf("%9.9s %9.9s %9.9s %9.9s %9.9s\n", 34952493Sdillon "TimedOut", "Invalid", "X Replies", "Retries", 35052493Sdillon "Requests"); 351221455Srmacklem if (run_v4 == 0) 352221455Srmacklem printf("%9d %9d %9d %9d %9d\n", 353221455Srmacklem nfsstats.rpctimeouts, 354221455Srmacklem nfsstats.rpcinvalid, 355221455Srmacklem nfsstats.rpcunexpected, 356221455Srmacklem nfsstats.rpcretries, 357221455Srmacklem nfsstats.rpcrequests); 358221455Srmacklem else 359221455Srmacklem printf("%9d %9d %9d %9d %9d\n", 360221455Srmacklem ext_nfsstats.rpctimeouts, 361221455Srmacklem ext_nfsstats.rpcinvalid, 362221455Srmacklem ext_nfsstats.rpcunexpected, 363221455Srmacklem ext_nfsstats.rpcretries, 364221455Srmacklem ext_nfsstats.rpcrequests); 36552493Sdillon printf("Cache Info:\n"); 36652493Sdillon printf("%9.9s %9.9s %9.9s %9.9s", 36752493Sdillon "Attr Hits", "Misses", "Lkup Hits", "Misses"); 36852493Sdillon printf(" %9.9s %9.9s %9.9s %9.9s\n", 36952493Sdillon "BioR Hits", "Misses", "BioW Hits", "Misses"); 370221455Srmacklem if (run_v4 == 0) { 371221455Srmacklem printf("%9d %9d %9d %9d", 372221455Srmacklem nfsstats.attrcache_hits, 373221455Srmacklem nfsstats.attrcache_misses, 374221455Srmacklem nfsstats.lookupcache_hits, 375221455Srmacklem nfsstats.lookupcache_misses); 376221455Srmacklem printf(" %9d %9d %9d %9d\n", 377221455Srmacklem nfsstats.biocache_reads-nfsstats.read_bios, 378221455Srmacklem nfsstats.read_bios, 379221455Srmacklem nfsstats.biocache_writes-nfsstats.write_bios, 380221455Srmacklem nfsstats.write_bios); 381221455Srmacklem } else { 382221455Srmacklem printf("%9d %9d %9d %9d", 383221455Srmacklem ext_nfsstats.attrcache_hits, 384221455Srmacklem ext_nfsstats.attrcache_misses, 385221455Srmacklem ext_nfsstats.lookupcache_hits, 386221455Srmacklem ext_nfsstats.lookupcache_misses); 387221455Srmacklem printf(" %9d %9d %9d %9d\n", 388221455Srmacklem ext_nfsstats.biocache_reads - 389221455Srmacklem ext_nfsstats.read_bios, 390221455Srmacklem ext_nfsstats.read_bios, 391221455Srmacklem ext_nfsstats.biocache_writes - 392221455Srmacklem ext_nfsstats.write_bios, 393221455Srmacklem ext_nfsstats.write_bios); 394221455Srmacklem } 39552493Sdillon printf("%9.9s %9.9s %9.9s %9.9s", 39652493Sdillon "BioRLHits", "Misses", "BioD Hits", "Misses"); 397220596Sru printf(" %9.9s %9.9s %9.9s %9.9s\n", "DirE Hits", "Misses", "Accs Hits", "Misses"); 398221455Srmacklem if (run_v4 == 0) { 399221455Srmacklem printf("%9d %9d %9d %9d", 400221455Srmacklem nfsstats.biocache_readlinks - 401221455Srmacklem nfsstats.readlink_bios, 402221455Srmacklem nfsstats.readlink_bios, 403221455Srmacklem nfsstats.biocache_readdirs - 404221455Srmacklem nfsstats.readdir_bios, 405221455Srmacklem nfsstats.readdir_bios); 406221455Srmacklem printf(" %9d %9d %9d %9d\n", 407221455Srmacklem nfsstats.direofcache_hits, 408221455Srmacklem nfsstats.direofcache_misses, 409221455Srmacklem nfsstats.accesscache_hits, 410221455Srmacklem nfsstats.accesscache_misses); 411221455Srmacklem } else { 412221455Srmacklem printf("%9d %9d %9d %9d", 413221455Srmacklem ext_nfsstats.biocache_readlinks - 414221455Srmacklem ext_nfsstats.readlink_bios, 415221455Srmacklem ext_nfsstats.readlink_bios, 416221455Srmacklem ext_nfsstats.biocache_readdirs - 417221455Srmacklem ext_nfsstats.readdir_bios, 418221455Srmacklem ext_nfsstats.readdir_bios); 419221455Srmacklem printf(" %9d %9d %9d %9d\n", 420221455Srmacklem ext_nfsstats.direofcache_hits, 421221455Srmacklem ext_nfsstats.direofcache_misses, 422221455Srmacklem ext_nfsstats.accesscache_hits, 423221455Srmacklem ext_nfsstats.accesscache_misses); 424221455Srmacklem } 42552493Sdillon } 426221455Srmacklem if (run_v4 == 0 && serverOnly && !nfsrvstatsp) { 42783653Speter printf("Server not present!\n"); 42883653Speter serverOnly = 0; 42983653Speter } 43052493Sdillon if (serverOnly) { 43152493Sdillon printf("\nServer Info:\n"); 43252493Sdillon printf("%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n", 43352493Sdillon "Getattr", "Setattr", "Lookup", "Readlink", "Read", 43452493Sdillon "Write", "Create", "Remove"); 435221455Srmacklem if (run_v4 == 0) 436221455Srmacklem printf("%9d %9d %9d %9d %9d %9d %9d %9d\n", 437221455Srmacklem nfsrvstats.srvrpccnt[NFSPROC_GETATTR], 438221455Srmacklem nfsrvstats.srvrpccnt[NFSPROC_SETATTR], 439221455Srmacklem nfsrvstats.srvrpccnt[NFSPROC_LOOKUP], 440221455Srmacklem nfsrvstats.srvrpccnt[NFSPROC_READLINK], 441221455Srmacklem nfsrvstats.srvrpccnt[NFSPROC_READ], 442221455Srmacklem nfsrvstats.srvrpccnt[NFSPROC_WRITE], 443221455Srmacklem nfsrvstats.srvrpccnt[NFSPROC_CREATE], 444221455Srmacklem nfsrvstats.srvrpccnt[NFSPROC_REMOVE]); 445221455Srmacklem else 446221455Srmacklem printf("%9d %9d %9d %9d %9d %9d %9d %9d\n", 447221455Srmacklem ext_nfsstats.srvrpccnt[NFSPROC_GETATTR], 448221455Srmacklem ext_nfsstats.srvrpccnt[NFSPROC_SETATTR], 449221455Srmacklem ext_nfsstats.srvrpccnt[NFSPROC_LOOKUP], 450221455Srmacklem ext_nfsstats.srvrpccnt[NFSPROC_READLINK], 451221455Srmacklem ext_nfsstats.srvrpccnt[NFSPROC_READ], 452221455Srmacklem ext_nfsstats.srvrpccnt[NFSPROC_WRITE], 453221455Srmacklem ext_nfsstats.srvrpccnt[NFSPROC_CREATE], 454221455Srmacklem ext_nfsstats.srvrpccnt[NFSPROC_REMOVE]); 45552493Sdillon printf("%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n", 45652493Sdillon "Rename", "Link", "Symlink", "Mkdir", "Rmdir", 45752493Sdillon "Readdir", "RdirPlus", "Access"); 458221455Srmacklem if (run_v4 == 0) 459221455Srmacklem printf("%9d %9d %9d %9d %9d %9d %9d %9d\n", 460221455Srmacklem nfsrvstats.srvrpccnt[NFSPROC_RENAME], 461221455Srmacklem nfsrvstats.srvrpccnt[NFSPROC_LINK], 462221455Srmacklem nfsrvstats.srvrpccnt[NFSPROC_SYMLINK], 463221455Srmacklem nfsrvstats.srvrpccnt[NFSPROC_MKDIR], 464221455Srmacklem nfsrvstats.srvrpccnt[NFSPROC_RMDIR], 465221455Srmacklem nfsrvstats.srvrpccnt[NFSPROC_READDIR], 466221455Srmacklem nfsrvstats.srvrpccnt[NFSPROC_READDIRPLUS], 467221455Srmacklem nfsrvstats.srvrpccnt[NFSPROC_ACCESS]); 468221455Srmacklem else 469221455Srmacklem printf("%9d %9d %9d %9d %9d %9d %9d %9d\n", 470221455Srmacklem ext_nfsstats.srvrpccnt[NFSPROC_RENAME], 471221455Srmacklem ext_nfsstats.srvrpccnt[NFSPROC_LINK], 472221455Srmacklem ext_nfsstats.srvrpccnt[NFSPROC_SYMLINK], 473221455Srmacklem ext_nfsstats.srvrpccnt[NFSPROC_MKDIR], 474221455Srmacklem ext_nfsstats.srvrpccnt[NFSPROC_RMDIR], 475221455Srmacklem ext_nfsstats.srvrpccnt[NFSPROC_READDIR], 476221455Srmacklem ext_nfsstats.srvrpccnt[NFSPROC_READDIRPLUS], 477221455Srmacklem ext_nfsstats.srvrpccnt[NFSPROC_ACCESS]); 47883653Speter printf("%9.9s %9.9s %9.9s %9.9s %9.9s\n", 47983653Speter "Mknod", "Fsstat", "Fsinfo", "PathConf", "Commit"); 480221455Srmacklem if (run_v4 == 0) 481221455Srmacklem printf("%9d %9d %9d %9d %9d\n", 482221455Srmacklem nfsrvstats.srvrpccnt[NFSPROC_MKNOD], 483221455Srmacklem nfsrvstats.srvrpccnt[NFSPROC_FSSTAT], 484221455Srmacklem nfsrvstats.srvrpccnt[NFSPROC_FSINFO], 485221455Srmacklem nfsrvstats.srvrpccnt[NFSPROC_PATHCONF], 486221455Srmacklem nfsrvstats.srvrpccnt[NFSPROC_COMMIT]); 487221455Srmacklem else 488221455Srmacklem printf("%9d %9d %9d %9d %9d\n", 489221455Srmacklem ext_nfsstats.srvrpccnt[NFSPROC_MKNOD], 490221455Srmacklem ext_nfsstats.srvrpccnt[NFSPROC_FSSTAT], 491221455Srmacklem ext_nfsstats.srvrpccnt[NFSPROC_FSINFO], 492221455Srmacklem ext_nfsstats.srvrpccnt[NFSPROC_PATHCONF], 493221455Srmacklem ext_nfsstats.srvrpccnt[NFSPROC_COMMIT]); 49452493Sdillon printf("Server Ret-Failed\n"); 495221455Srmacklem if (run_v4 == 0) 496221455Srmacklem printf("%17d\n", nfsrvstats.srvrpc_errs); 497221455Srmacklem else 498221455Srmacklem printf("%17d\n", ext_nfsstats.srvrpc_errs); 49952493Sdillon printf("Server Faults\n"); 500221455Srmacklem if (run_v4 == 0) 501221455Srmacklem printf("%13d\n", nfsrvstats.srv_errs); 502221455Srmacklem else 503221455Srmacklem printf("%13d\n", ext_nfsstats.srv_errs); 50452493Sdillon printf("Server Cache Stats:\n"); 50552493Sdillon printf("%9.9s %9.9s %9.9s %9.9s\n", 50652493Sdillon "Inprog", "Idem", "Non-idem", "Misses"); 507221455Srmacklem if (run_v4 == 0) 508221455Srmacklem printf("%9d %9d %9d %9d\n", 509221455Srmacklem nfsrvstats.srvcache_inproghits, 510221455Srmacklem nfsrvstats.srvcache_idemdonehits, 511221455Srmacklem nfsrvstats.srvcache_nonidemdonehits, 512221455Srmacklem nfsrvstats.srvcache_misses); 513221455Srmacklem else 514221455Srmacklem printf("%9d %9d %9d %9d\n", 515221455Srmacklem ext_nfsstats.srvcache_inproghits, 516221455Srmacklem ext_nfsstats.srvcache_idemdonehits, 517221455Srmacklem ext_nfsstats.srvcache_nonidemdonehits, 518221455Srmacklem ext_nfsstats.srvcache_misses); 51952493Sdillon printf("Server Write Gathering:\n"); 52052493Sdillon printf("%9.9s %9.9s %9.9s\n", 52152493Sdillon "WriteOps", "WriteRPC", "Opsaved"); 522221455Srmacklem if (run_v4 == 0) 523221455Srmacklem printf("%9d %9d %9d\n", 524221455Srmacklem nfsrvstats.srvvop_writes, 525221455Srmacklem nfsrvstats.srvrpccnt[NFSPROC_WRITE], 526221455Srmacklem nfsrvstats.srvrpccnt[NFSPROC_WRITE] - 527221455Srmacklem nfsrvstats.srvvop_writes); 528221455Srmacklem else 529221455Srmacklem /* 530221455Srmacklem * The new client doesn't do write gathering. It was 531221455Srmacklem * only useful for NFSv2. 532221455Srmacklem */ 533221455Srmacklem printf("%9d %9d %9d\n", 534221455Srmacklem ext_nfsstats.srvrpccnt[NFSPROC_WRITE], 535221455Srmacklem ext_nfsstats.srvrpccnt[NFSPROC_WRITE], 0); 53652493Sdillon } 5371590Srgrimes} 5381590Srgrimes 5391590Srgrimesu_char signalled; /* set if alarm goes off "early" */ 5401590Srgrimes 5411590Srgrimes/* 5421590Srgrimes * Print a running summary of nfs statistics. 5431590Srgrimes * Repeat display every interval seconds, showing statistics 5441590Srgrimes * collected over that interval. Assumes that interval is non-zero. 5451590Srgrimes * First line printed at top of screen is always cumulative. 5461590Srgrimes */ 5471590Srgrimesvoid 54852493Sdillonsidewaysintpr(u_int interval, int clientOnly, int serverOnly) 5491590Srgrimes{ 55083653Speter struct nfsstats nfsstats, lastst, *nfsstatsp; 55183653Speter struct nfsrvstats nfsrvstats, lastsrvst, *nfsrvstatsp; 55252493Sdillon int hdrcnt = 1; 5531590Srgrimes 55483653Speter nfsstatsp = &lastst; 55583653Speter nfsrvstatsp = &lastsrvst; 556172759Sjhb readstats(&nfsstatsp, &nfsrvstatsp, 0); 55783653Speter if (clientOnly && !nfsstatsp) { 55883653Speter printf("Client not present!\n"); 55983653Speter clientOnly = 0; 56083653Speter } 56183653Speter if (serverOnly && !nfsrvstatsp) { 56283653Speter printf("Server not present!\n"); 56383653Speter serverOnly = 0; 56483653Speter } 56552493Sdillon sleep(interval); 5661590Srgrimes 56752493Sdillon for (;;) { 56883653Speter nfsstatsp = &nfsstats; 56983653Speter nfsrvstatsp = &nfsrvstats; 570172759Sjhb readstats(&nfsstatsp, &nfsrvstatsp, 0); 57152493Sdillon 57252493Sdillon if (--hdrcnt == 0) { 57352493Sdillon printhdr(clientOnly, serverOnly); 57452493Sdillon if (clientOnly && serverOnly) 57552493Sdillon hdrcnt = 10; 57652493Sdillon else 57752493Sdillon hdrcnt = 20; 5781590Srgrimes } 57952493Sdillon if (clientOnly) { 58052493Sdillon printf("%s %6d %6d %6d %6d %6d %6d %6d %6d", 58152493Sdillon ((clientOnly && serverOnly) ? "Client:" : ""), 58252493Sdillon DELTA(attrcache_hits) + DELTA(attrcache_misses), 58352493Sdillon DELTA(lookupcache_hits) + DELTA(lookupcache_misses), 58452493Sdillon DELTA(biocache_readlinks), 58552493Sdillon DELTA(biocache_reads), 58652493Sdillon DELTA(biocache_writes), 58752493Sdillon nfsstats.rpccnt[NFSPROC_RENAME]-lastst.rpccnt[NFSPROC_RENAME], 58852493Sdillon DELTA(accesscache_hits) + DELTA(accesscache_misses), 58952493Sdillon DELTA(biocache_readdirs) 59052493Sdillon ); 59152493Sdillon if (widemode) { 59252493Sdillon printf(" %s %s %s %s %s %s", 59352493Sdillon sperc1(DELTA(attrcache_hits), 59452493Sdillon DELTA(attrcache_misses)), 59552493Sdillon sperc1(DELTA(lookupcache_hits), 59652493Sdillon DELTA(lookupcache_misses)), 59752493Sdillon sperc2(DELTA(biocache_reads), 59852493Sdillon DELTA(read_bios)), 59952493Sdillon sperc2(DELTA(biocache_writes), 60052493Sdillon DELTA(write_bios)), 60152493Sdillon sperc1(DELTA(accesscache_hits), 60252493Sdillon DELTA(accesscache_misses)), 60352493Sdillon sperc2(DELTA(biocache_readdirs), 60452493Sdillon DELTA(readdir_bios)) 60552493Sdillon ); 60652493Sdillon } 60752493Sdillon printf("\n"); 60883653Speter lastst = nfsstats; 60952493Sdillon } 61052493Sdillon if (serverOnly) { 61152493Sdillon printf("%s %6d %6d %6d %6d %6d %6d %6d %6d", 61252493Sdillon ((clientOnly && serverOnly) ? "Server:" : ""), 61383653Speter nfsrvstats.srvrpccnt[NFSPROC_GETATTR]-lastsrvst.srvrpccnt[NFSPROC_GETATTR], 61483653Speter nfsrvstats.srvrpccnt[NFSPROC_LOOKUP]-lastsrvst.srvrpccnt[NFSPROC_LOOKUP], 61583653Speter nfsrvstats.srvrpccnt[NFSPROC_READLINK]-lastsrvst.srvrpccnt[NFSPROC_READLINK], 61683653Speter nfsrvstats.srvrpccnt[NFSPROC_READ]-lastsrvst.srvrpccnt[NFSPROC_READ], 61783653Speter nfsrvstats.srvrpccnt[NFSPROC_WRITE]-lastsrvst.srvrpccnt[NFSPROC_WRITE], 61883653Speter nfsrvstats.srvrpccnt[NFSPROC_RENAME]-lastsrvst.srvrpccnt[NFSPROC_RENAME], 61983653Speter nfsrvstats.srvrpccnt[NFSPROC_ACCESS]-lastsrvst.srvrpccnt[NFSPROC_ACCESS], 62083653Speter (nfsrvstats.srvrpccnt[NFSPROC_READDIR]-lastsrvst.srvrpccnt[NFSPROC_READDIR]) 62183653Speter +(nfsrvstats.srvrpccnt[NFSPROC_READDIRPLUS]-lastsrvst.srvrpccnt[NFSPROC_READDIRPLUS])); 62252493Sdillon printf("\n"); 62383653Speter lastsrvst = nfsrvstats; 62452493Sdillon } 6251590Srgrimes fflush(stdout); 62652493Sdillon sleep(interval); 6271590Srgrimes } 6281590Srgrimes /*NOTREACHED*/ 6291590Srgrimes} 6301590Srgrimes 6311590Srgrimesvoid 63252493Sdillonprinthdr(int clientOnly, int serverOnly) 6331590Srgrimes{ 63452493Sdillon printf("%s%6.6s %6.6s %6.6s %6.6s %6.6s %6.6s %6.6s %6.6s", 63552493Sdillon ((serverOnly && clientOnly) ? " " : " "), 63652493Sdillon "GtAttr", "Lookup", "Rdlink", "Read", "Write", "Rename", 63752493Sdillon "Access", "Rddir"); 63852493Sdillon if (widemode && clientOnly) { 63952493Sdillon printf(" Attr Lkup BioR BioW Accs BioD"); 64052493Sdillon } 64152493Sdillon printf("\n"); 6421590Srgrimes fflush(stdout); 6431590Srgrimes} 6441590Srgrimes 6451590Srgrimesvoid 646172759Sjhbusage(void) 6471590Srgrimes{ 6481590Srgrimes (void)fprintf(stderr, 649221492Sru "usage: nfsstat [-ceoszW] [-M core] [-N system] [-w wait]\n"); 6501590Srgrimes exit(1); 6511590Srgrimes} 65252493Sdillon 65352493Sdillonstatic char SPBuf[64][8]; 65452493Sdillonstatic int SPIndex; 65552493Sdillon 65652493Sdillonchar * 65752493Sdillonsperc1(int hits, int misses) 65852493Sdillon{ 65952493Sdillon char *p = SPBuf[SPIndex]; 66052493Sdillon 66152493Sdillon if (hits + misses) { 66252493Sdillon sprintf(p, "%3d%%", 66352493Sdillon (int)(char)((quad_t)hits * 100 / (hits + misses))); 66452493Sdillon } else { 66552493Sdillon sprintf(p, " -"); 66652493Sdillon } 66752493Sdillon SPIndex = (SPIndex + 1) & 63; 66852493Sdillon return(p); 66952493Sdillon} 67052493Sdillon 67152493Sdillonchar * 67252493Sdillonsperc2(int ttl, int misses) 67352493Sdillon{ 67452493Sdillon char *p = SPBuf[SPIndex]; 67552493Sdillon 67652493Sdillon if (ttl) { 67752493Sdillon sprintf(p, "%3d%%", 67852493Sdillon (int)(char)((quad_t)(ttl - misses) * 100 / ttl)); 67952493Sdillon } else { 68052493Sdillon sprintf(p, " -"); 68152493Sdillon } 68252493Sdillon SPIndex = (SPIndex + 1) & 63; 68352493Sdillon return(p); 68452493Sdillon} 68552493Sdillon 686192762Srmacklem/* 687192762Srmacklem * Print a description of the nfs stats for the experimental client/server. 688192762Srmacklem */ 689192762Srmacklemvoid 690192762Srmacklemexp_intpr(int clientOnly, int serverOnly) 691192762Srmacklem{ 692221440Srmacklem int nfssvc_flag; 693192762Srmacklem 694221440Srmacklem nfssvc_flag = NFSSVC_GETSTATS; 695221440Srmacklem if (zflag != 0) { 696221440Srmacklem if (clientOnly != 0) 697221440Srmacklem nfssvc_flag |= NFSSVC_ZEROCLTSTATS; 698221440Srmacklem if (serverOnly != 0) 699221440Srmacklem nfssvc_flag |= NFSSVC_ZEROSRVSTATS; 700221440Srmacklem } 701221440Srmacklem if (nfssvc(nfssvc_flag, &ext_nfsstats) < 0) 702221440Srmacklem err(1, "Can't get stats"); 703192762Srmacklem if (clientOnly != 0) { 704192762Srmacklem if (printtitle) { 705192762Srmacklem printf("Client Info:\n"); 706192762Srmacklem printf("Rpc Counts:\n"); 707192762Srmacklem printf( 708192762Srmacklem "%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n" 709192762Srmacklem , "Getattr", "Setattr", "Lookup", "Readlink", 710192762Srmacklem "Read", "Write", "Create", "Remove"); 711192762Srmacklem } 712192762Srmacklem printf("%9d %9d %9d %9d %9d %9d %9d %9d\n", 713192762Srmacklem ext_nfsstats.rpccnt[NFSPROC_GETATTR], 714192762Srmacklem ext_nfsstats.rpccnt[NFSPROC_SETATTR], 715192762Srmacklem ext_nfsstats.rpccnt[NFSPROC_LOOKUP], 716192762Srmacklem ext_nfsstats.rpccnt[NFSPROC_READLINK], 717192762Srmacklem ext_nfsstats.rpccnt[NFSPROC_READ], 718192762Srmacklem ext_nfsstats.rpccnt[NFSPROC_WRITE], 719192762Srmacklem ext_nfsstats.rpccnt[NFSPROC_CREATE], 720192762Srmacklem ext_nfsstats.rpccnt[NFSPROC_REMOVE]); 721192762Srmacklem if (printtitle) 722192762Srmacklem printf( 723192762Srmacklem "%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n" 724192762Srmacklem , "Rename", "Link", "Symlink", "Mkdir", "Rmdir", 725192762Srmacklem "Readdir", "RdirPlus", "Access"); 726192762Srmacklem printf("%9d %9d %9d %9d %9d %9d %9d %9d\n", 727192762Srmacklem ext_nfsstats.rpccnt[NFSPROC_RENAME], 728192762Srmacklem ext_nfsstats.rpccnt[NFSPROC_LINK], 729192762Srmacklem ext_nfsstats.rpccnt[NFSPROC_SYMLINK], 730192762Srmacklem ext_nfsstats.rpccnt[NFSPROC_MKDIR], 731192762Srmacklem ext_nfsstats.rpccnt[NFSPROC_RMDIR], 732192762Srmacklem ext_nfsstats.rpccnt[NFSPROC_READDIR], 733192762Srmacklem ext_nfsstats.rpccnt[NFSPROC_READDIRPLUS], 734192762Srmacklem ext_nfsstats.rpccnt[NFSPROC_ACCESS]); 735192762Srmacklem if (printtitle) 736192762Srmacklem printf( 737192762Srmacklem "%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n" 738192762Srmacklem , "Mknod", "Fsstat", "Fsinfo", "PathConf", 739192762Srmacklem "Commit", "SetClId", "SetClIdCf", "Lock"); 740192762Srmacklem printf("%9d %9d %9d %9d %9d %9d %9d %9d\n", 741192762Srmacklem ext_nfsstats.rpccnt[NFSPROC_MKNOD], 742192762Srmacklem ext_nfsstats.rpccnt[NFSPROC_FSSTAT], 743192762Srmacklem ext_nfsstats.rpccnt[NFSPROC_FSINFO], 744192762Srmacklem ext_nfsstats.rpccnt[NFSPROC_PATHCONF], 745192762Srmacklem ext_nfsstats.rpccnt[NFSPROC_COMMIT], 746192762Srmacklem ext_nfsstats.rpccnt[NFSPROC_SETCLIENTID], 747192762Srmacklem ext_nfsstats.rpccnt[NFSPROC_SETCLIENTIDCFRM], 748192762Srmacklem ext_nfsstats.rpccnt[NFSPROC_LOCK]); 749192762Srmacklem if (printtitle) 750192762Srmacklem printf("%9.9s %9.9s %9.9s %9.9s\n", 751192762Srmacklem "LockT", "LockU", "Open", "OpenCfr"); 752192762Srmacklem printf("%9d %9d %9d %9d\n", 753192762Srmacklem ext_nfsstats.rpccnt[NFSPROC_LOCKT], 754192762Srmacklem ext_nfsstats.rpccnt[NFSPROC_LOCKU], 755192762Srmacklem ext_nfsstats.rpccnt[NFSPROC_OPEN], 756192762Srmacklem ext_nfsstats.rpccnt[NFSPROC_OPENCONFIRM]); 757192762Srmacklem if (printtitle) 758192762Srmacklem printf( 759192762Srmacklem "%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n" 760192762Srmacklem , "OpenOwner", "Opens", "LockOwner", 761192762Srmacklem "Locks", "Delegs", "LocalOwn", 762192762Srmacklem "LocalOpen", "LocalLOwn"); 763192762Srmacklem printf("%9d %9d %9d %9d %9d %9d %9d %9d\n", 764192762Srmacklem ext_nfsstats.clopenowners, 765192762Srmacklem ext_nfsstats.clopens, 766192762Srmacklem ext_nfsstats.cllockowners, 767192762Srmacklem ext_nfsstats.cllocks, 768192762Srmacklem ext_nfsstats.cldelegates, 769192762Srmacklem ext_nfsstats.cllocalopenowners, 770192762Srmacklem ext_nfsstats.cllocalopens, 771192762Srmacklem ext_nfsstats.cllocallockowners); 772192762Srmacklem if (printtitle) 773192762Srmacklem printf("%9.9s\n", "LocalLock"); 774192762Srmacklem printf("%9d\n", ext_nfsstats.cllocallocks); 775192762Srmacklem if (printtitle) { 776192762Srmacklem printf("Rpc Info:\n"); 777192762Srmacklem printf("%9.9s %9.9s %9.9s %9.9s %9.9s\n", 778192762Srmacklem "TimedOut", "Invalid", "X Replies", "Retries", 779192762Srmacklem "Requests"); 780192762Srmacklem } 781192762Srmacklem printf("%9d %9d %9d %9d %9d\n", 782192762Srmacklem ext_nfsstats.rpctimeouts, 783192762Srmacklem ext_nfsstats.rpcinvalid, 784192762Srmacklem ext_nfsstats.rpcunexpected, 785192762Srmacklem ext_nfsstats.rpcretries, 786192762Srmacklem ext_nfsstats.rpcrequests); 787192762Srmacklem if (printtitle) { 788192762Srmacklem printf("Cache Info:\n"); 789192762Srmacklem printf("%9.9s %9.9s %9.9s %9.9s", 790192762Srmacklem "Attr Hits", "Misses", "Lkup Hits", "Misses"); 791192762Srmacklem printf(" %9.9s %9.9s %9.9s %9.9s\n", 792192762Srmacklem "BioR Hits", "Misses", "BioW Hits", "Misses"); 793192762Srmacklem } 794192762Srmacklem printf("%9d %9d %9d %9d", 795192762Srmacklem ext_nfsstats.attrcache_hits, 796192762Srmacklem ext_nfsstats.attrcache_misses, 797192762Srmacklem ext_nfsstats.lookupcache_hits, 798192762Srmacklem ext_nfsstats.lookupcache_misses); 799192762Srmacklem printf(" %9d %9d %9d %9d\n", 800221454Srmacklem ext_nfsstats.biocache_reads - ext_nfsstats.read_bios, 801192762Srmacklem ext_nfsstats.read_bios, 802221454Srmacklem ext_nfsstats.biocache_writes - ext_nfsstats.write_bios, 803192762Srmacklem ext_nfsstats.write_bios); 804192762Srmacklem if (printtitle) { 805192762Srmacklem printf("%9.9s %9.9s %9.9s %9.9s", 806192762Srmacklem "BioRLHits", "Misses", "BioD Hits", "Misses"); 807192762Srmacklem printf(" %9.9s %9.9s\n", "DirE Hits", "Misses"); 808192762Srmacklem } 809192762Srmacklem printf("%9d %9d %9d %9d", 810221454Srmacklem ext_nfsstats.biocache_readlinks - 811192762Srmacklem ext_nfsstats.readlink_bios, 812221454Srmacklem ext_nfsstats.readlink_bios, 813221454Srmacklem ext_nfsstats.biocache_readdirs - 814221454Srmacklem ext_nfsstats.readdir_bios, 815192762Srmacklem ext_nfsstats.readdir_bios); 816192762Srmacklem printf(" %9d %9d\n", 817192762Srmacklem ext_nfsstats.direofcache_hits, 818192762Srmacklem ext_nfsstats.direofcache_misses); 819192762Srmacklem } 820192762Srmacklem if (serverOnly != 0) { 821192762Srmacklem if (printtitle) { 822192762Srmacklem printf("\nServer Info:\n"); 823192762Srmacklem printf( 824192762Srmacklem "%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n" 825192762Srmacklem , "Getattr", "Setattr", "Lookup", "Readlink", 826192762Srmacklem "Read", "Write", "Create", "Remove"); 827192762Srmacklem } 828192762Srmacklem printf("%9d %9d %9d %9d %9d %9d %9d %9d\n", 829192762Srmacklem ext_nfsstats.srvrpccnt[NFSV4OP_GETATTR], 830192762Srmacklem ext_nfsstats.srvrpccnt[NFSV4OP_SETATTR], 831192762Srmacklem ext_nfsstats.srvrpccnt[NFSV4OP_LOOKUP], 832192762Srmacklem ext_nfsstats.srvrpccnt[NFSV4OP_READLINK], 833192762Srmacklem ext_nfsstats.srvrpccnt[NFSV4OP_READ], 834192762Srmacklem ext_nfsstats.srvrpccnt[NFSV4OP_WRITE], 835192762Srmacklem ext_nfsstats.srvrpccnt[NFSV4OP_V3CREATE], 836192762Srmacklem ext_nfsstats.srvrpccnt[NFSV4OP_REMOVE]); 837192762Srmacklem if (printtitle) 838192762Srmacklem printf( 839192762Srmacklem "%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n" 840192762Srmacklem , "Rename", "Link", "Symlink", "Mkdir", "Rmdir", 841192762Srmacklem "Readdir", "RdirPlus", "Access"); 842192762Srmacklem printf("%9d %9d %9d %9d %9d %9d %9d %9d\n", 843192762Srmacklem ext_nfsstats.srvrpccnt[NFSV4OP_RENAME], 844192762Srmacklem ext_nfsstats.srvrpccnt[NFSV4OP_LINK], 845192762Srmacklem ext_nfsstats.srvrpccnt[NFSV4OP_SYMLINK], 846192762Srmacklem ext_nfsstats.srvrpccnt[NFSV4OP_MKDIR], 847192762Srmacklem ext_nfsstats.srvrpccnt[NFSV4OP_RMDIR], 848192762Srmacklem ext_nfsstats.srvrpccnt[NFSV4OP_READDIR], 849192762Srmacklem ext_nfsstats.srvrpccnt[NFSV4OP_READDIRPLUS], 850192762Srmacklem ext_nfsstats.srvrpccnt[NFSV4OP_ACCESS]); 851192762Srmacklem if (printtitle) 852192762Srmacklem printf( 853192762Srmacklem "%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n" 854192762Srmacklem , "Mknod", "Fsstat", "Fsinfo", "PathConf", 855192762Srmacklem "Commit", "LookupP", "SetClId", "SetClIdCf"); 856192762Srmacklem printf("%9d %9d %9d %9d %9d %9d %9d %9d\n", 857192762Srmacklem ext_nfsstats.srvrpccnt[NFSV4OP_MKNOD], 858192762Srmacklem ext_nfsstats.srvrpccnt[NFSV4OP_FSSTAT], 859192762Srmacklem ext_nfsstats.srvrpccnt[NFSV4OP_FSINFO], 860192762Srmacklem ext_nfsstats.srvrpccnt[NFSV4OP_PATHCONF], 861192762Srmacklem ext_nfsstats.srvrpccnt[NFSV4OP_COMMIT], 862192762Srmacklem ext_nfsstats.srvrpccnt[NFSV4OP_LOOKUPP], 863192762Srmacklem ext_nfsstats.srvrpccnt[NFSV4OP_SETCLIENTID], 864192762Srmacklem ext_nfsstats.srvrpccnt[NFSV4OP_SETCLIENTIDCFRM]); 865192762Srmacklem if (printtitle) 866192762Srmacklem printf( 867192762Srmacklem "%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n" 868192762Srmacklem , "Open", "OpenAttr", "OpenDwnGr", "OpenCfrm", 869192762Srmacklem "DelePurge", "DeleRet", "GetFH", "Lock"); 870192762Srmacklem printf("%9d %9d %9d %9d %9d %9d %9d %9d\n", 871192762Srmacklem ext_nfsstats.srvrpccnt[NFSV4OP_OPEN], 872192762Srmacklem ext_nfsstats.srvrpccnt[NFSV4OP_OPENATTR], 873192762Srmacklem ext_nfsstats.srvrpccnt[NFSV4OP_OPENDOWNGRADE], 874192762Srmacklem ext_nfsstats.srvrpccnt[NFSV4OP_OPENCONFIRM], 875192762Srmacklem ext_nfsstats.srvrpccnt[NFSV4OP_DELEGPURGE], 876192762Srmacklem ext_nfsstats.srvrpccnt[NFSV4OP_DELEGRETURN], 877192762Srmacklem ext_nfsstats.srvrpccnt[NFSV4OP_GETFH], 878192762Srmacklem ext_nfsstats.srvrpccnt[NFSV4OP_LOCK]); 879192762Srmacklem if (printtitle) 880192762Srmacklem printf( 881192762Srmacklem "%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n" 882192762Srmacklem , "LockT", "LockU", "Close", "Verify", "NVerify", 883192762Srmacklem "PutFH", "PutPubFH", "PutRootFH"); 884192762Srmacklem printf("%9d %9d %9d %9d %9d %9d %9d %9d\n", 885192762Srmacklem ext_nfsstats.srvrpccnt[NFSV4OP_LOCKT], 886192762Srmacklem ext_nfsstats.srvrpccnt[NFSV4OP_LOCKU], 887192762Srmacklem ext_nfsstats.srvrpccnt[NFSV4OP_CLOSE], 888192762Srmacklem ext_nfsstats.srvrpccnt[NFSV4OP_VERIFY], 889192762Srmacklem ext_nfsstats.srvrpccnt[NFSV4OP_NVERIFY], 890192762Srmacklem ext_nfsstats.srvrpccnt[NFSV4OP_PUTFH], 891192762Srmacklem ext_nfsstats.srvrpccnt[NFSV4OP_PUTPUBFH], 892192762Srmacklem ext_nfsstats.srvrpccnt[NFSV4OP_PUTROOTFH]); 893192762Srmacklem if (printtitle) 894192762Srmacklem printf("%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n", 895192762Srmacklem "Renew", "RestoreFH", "SaveFH", "Secinfo", 896192762Srmacklem "RelLckOwn", "V4Create"); 897192762Srmacklem printf("%9d %9d %9d %9d %9d %9d\n", 898192762Srmacklem ext_nfsstats.srvrpccnt[NFSV4OP_RENEW], 899192762Srmacklem ext_nfsstats.srvrpccnt[NFSV4OP_RESTOREFH], 900192762Srmacklem ext_nfsstats.srvrpccnt[NFSV4OP_SAVEFH], 901192762Srmacklem ext_nfsstats.srvrpccnt[NFSV4OP_SECINFO], 902192762Srmacklem ext_nfsstats.srvrpccnt[NFSV4OP_RELEASELCKOWN], 903192762Srmacklem ext_nfsstats.srvrpccnt[NFSV4OP_CREATE]); 904192762Srmacklem if (printtitle) { 905192762Srmacklem printf("Server:\n"); 906192762Srmacklem printf("%9.9s %9.9s %9.9s\n", 907192762Srmacklem "Retfailed", "Faults", "Clients"); 908192762Srmacklem } 909192762Srmacklem printf("%9d %9d %9d\n", 910192762Srmacklem ext_nfsstats.srv_errs, ext_nfsstats.srvrpc_errs, 911192762Srmacklem ext_nfsstats.srvclients); 912192762Srmacklem if (printtitle) 913192762Srmacklem printf("%9.9s %9.9s %9.9s %9.9s %9.9s \n", 914192762Srmacklem "OpenOwner", "Opens", "LockOwner", 915192762Srmacklem "Locks", "Delegs"); 916192762Srmacklem printf("%9d %9d %9d %9d %9d \n", 917192762Srmacklem ext_nfsstats.srvopenowners, 918192762Srmacklem ext_nfsstats.srvopens, 919192762Srmacklem ext_nfsstats.srvlockowners, 920192762Srmacklem ext_nfsstats.srvlocks, 921192762Srmacklem ext_nfsstats.srvdelegates); 922192762Srmacklem if (printtitle) { 923192762Srmacklem printf("Server Cache Stats:\n"); 924192762Srmacklem printf("%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n", 925192762Srmacklem "Inprog", "Idem", "Non-idem", "Misses", 926192762Srmacklem "CacheSize", "TCPPeak"); 927192762Srmacklem } 928192762Srmacklem printf("%9d %9d %9d %9d %9d %9d\n", 929192762Srmacklem ext_nfsstats.srvcache_inproghits, 930192762Srmacklem ext_nfsstats.srvcache_idemdonehits, 931192762Srmacklem ext_nfsstats.srvcache_nonidemdonehits, 932192762Srmacklem ext_nfsstats.srvcache_misses, 933192762Srmacklem ext_nfsstats.srvcache_size, 934192762Srmacklem ext_nfsstats.srvcache_tcppeak); 935192762Srmacklem } 936192762Srmacklem} 937192762Srmacklem 938192762Srmacklem/* 939192762Srmacklem * Print a running summary of nfs statistics for the experimental client and/or 940192762Srmacklem * server. 941192762Srmacklem * Repeat display every interval seconds, showing statistics 942192762Srmacklem * collected over that interval. Assumes that interval is non-zero. 943192762Srmacklem * First line printed at top of screen is always cumulative. 944192762Srmacklem */ 945192762Srmacklemvoid 946192762Srmacklemexp_sidewaysintpr(u_int interval, int clientOnly, int serverOnly) 947192762Srmacklem{ 948192762Srmacklem struct ext_nfsstats nfsstats, lastst, *ext_nfsstatsp; 949192762Srmacklem int hdrcnt = 1; 950192762Srmacklem 951192762Srmacklem ext_nfsstatsp = &lastst; 952221435Srmacklem if (nfssvc(NFSSVC_GETSTATS, ext_nfsstatsp) < 0) 953192762Srmacklem err(1, "Can't get stats"); 954192762Srmacklem sleep(interval); 955192762Srmacklem 956192762Srmacklem for (;;) { 957192762Srmacklem ext_nfsstatsp = &nfsstats; 958221435Srmacklem if (nfssvc(NFSSVC_GETSTATS, ext_nfsstatsp) < 0) 959192762Srmacklem err(1, "Can't get stats"); 960192762Srmacklem 961192762Srmacklem if (--hdrcnt == 0) { 962192762Srmacklem printhdr(clientOnly, serverOnly); 963192762Srmacklem if (clientOnly && serverOnly) 964192762Srmacklem hdrcnt = 10; 965192762Srmacklem else 966192762Srmacklem hdrcnt = 20; 967192762Srmacklem } 968192762Srmacklem if (clientOnly) { 969192762Srmacklem printf("%s %6d %6d %6d %6d %6d %6d %6d %6d", 970192762Srmacklem ((clientOnly && serverOnly) ? "Client:" : ""), 971192762Srmacklem DELTA(attrcache_hits) + DELTA(attrcache_misses), 972192762Srmacklem DELTA(lookupcache_hits) + DELTA(lookupcache_misses), 973192762Srmacklem DELTA(biocache_readlinks), 974192762Srmacklem DELTA(biocache_reads), 975192762Srmacklem DELTA(biocache_writes), 976192762Srmacklem nfsstats.rpccnt[NFSPROC_RENAME] - 977192762Srmacklem lastst.rpccnt[NFSPROC_RENAME], 978192762Srmacklem DELTA(accesscache_hits) + DELTA(accesscache_misses), 979192762Srmacklem DELTA(biocache_readdirs) 980192762Srmacklem ); 981192762Srmacklem if (widemode) { 982192762Srmacklem printf(" %s %s %s %s %s %s", 983192762Srmacklem sperc1(DELTA(attrcache_hits), 984192762Srmacklem DELTA(attrcache_misses)), 985192762Srmacklem sperc1(DELTA(lookupcache_hits), 986192762Srmacklem DELTA(lookupcache_misses)), 987192762Srmacklem sperc2(DELTA(biocache_reads), 988192762Srmacklem DELTA(read_bios)), 989192762Srmacklem sperc2(DELTA(biocache_writes), 990192762Srmacklem DELTA(write_bios)), 991192762Srmacklem sperc1(DELTA(accesscache_hits), 992192762Srmacklem DELTA(accesscache_misses)), 993192762Srmacklem sperc2(DELTA(biocache_readdirs), 994192762Srmacklem DELTA(readdir_bios)) 995192762Srmacklem ); 996192762Srmacklem } 997192762Srmacklem printf("\n"); 998192762Srmacklem lastst = nfsstats; 999192762Srmacklem } 1000192762Srmacklem if (serverOnly) { 1001192762Srmacklem printf("%s %6d %6d %6d %6d %6d %6d %6d %6d", 1002192762Srmacklem ((clientOnly && serverOnly) ? "Server:" : ""), 1003225109Srmacklem nfsstats.srvrpccnt[NFSV4OP_GETATTR] - 1004225109Srmacklem lastst.srvrpccnt[NFSV4OP_GETATTR], 1005225109Srmacklem nfsstats.srvrpccnt[NFSV4OP_LOOKUP] - 1006225109Srmacklem lastst.srvrpccnt[NFSV4OP_LOOKUP], 1007225109Srmacklem nfsstats.srvrpccnt[NFSV4OP_READLINK] - 1008225109Srmacklem lastst.srvrpccnt[NFSV4OP_READLINK], 1009225109Srmacklem nfsstats.srvrpccnt[NFSV4OP_READ] - 1010225109Srmacklem lastst.srvrpccnt[NFSV4OP_READ], 1011225109Srmacklem nfsstats.srvrpccnt[NFSV4OP_WRITE] - 1012225109Srmacklem lastst.srvrpccnt[NFSV4OP_WRITE], 1013225109Srmacklem nfsstats.srvrpccnt[NFSV4OP_RENAME] - 1014225109Srmacklem lastst.srvrpccnt[NFSV4OP_RENAME], 1015225109Srmacklem nfsstats.srvrpccnt[NFSV4OP_ACCESS] - 1016225109Srmacklem lastst.srvrpccnt[NFSV4OP_ACCESS], 1017225109Srmacklem (nfsstats.srvrpccnt[NFSV4OP_READDIR] - 1018225109Srmacklem lastst.srvrpccnt[NFSV4OP_READDIR]) + 1019225109Srmacklem (nfsstats.srvrpccnt[NFSV4OP_READDIRPLUS] - 1020225109Srmacklem lastst.srvrpccnt[NFSV4OP_READDIRPLUS])); 1021192762Srmacklem printf("\n"); 1022192762Srmacklem lastst = nfsstats; 1023192762Srmacklem } 1024192762Srmacklem fflush(stdout); 1025192762Srmacklem sleep(interval); 1026192762Srmacklem } 1027192762Srmacklem /*NOTREACHED*/ 1028192762Srmacklem} 1029192762Srmacklem 1030