19b50d902SRodney W. Grimes /* 29b50d902SRodney W. Grimes * Copyright (c) 1983, 1989, 1993 39b50d902SRodney W. Grimes * The Regents of the University of California. All rights reserved. 49b50d902SRodney W. Grimes * 59b50d902SRodney W. Grimes * This code is derived from software contributed to Berkeley by 69b50d902SRodney W. Grimes * Rick Macklem at The University of Guelph. 79b50d902SRodney W. Grimes * 89b50d902SRodney W. Grimes * Redistribution and use in source and binary forms, with or without 99b50d902SRodney W. Grimes * modification, are permitted provided that the following conditions 109b50d902SRodney W. Grimes * are met: 119b50d902SRodney W. Grimes * 1. Redistributions of source code must retain the above copyright 129b50d902SRodney W. Grimes * notice, this list of conditions and the following disclaimer. 139b50d902SRodney W. Grimes * 2. Redistributions in binary form must reproduce the above copyright 149b50d902SRodney W. Grimes * notice, this list of conditions and the following disclaimer in the 159b50d902SRodney W. Grimes * documentation and/or other materials provided with the distribution. 169b50d902SRodney W. Grimes * 4. Neither the name of the University nor the names of its contributors 179b50d902SRodney W. Grimes * may be used to endorse or promote products derived from this software 189b50d902SRodney W. Grimes * without specific prior written permission. 199b50d902SRodney W. Grimes * 209b50d902SRodney W. Grimes * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 219b50d902SRodney W. Grimes * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 229b50d902SRodney W. Grimes * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 239b50d902SRodney W. Grimes * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 249b50d902SRodney W. Grimes * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 259b50d902SRodney W. Grimes * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 269b50d902SRodney W. Grimes * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 279b50d902SRodney W. Grimes * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 289b50d902SRodney W. Grimes * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 299b50d902SRodney W. Grimes * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 309b50d902SRodney W. Grimes * SUCH DAMAGE. 319b50d902SRodney W. Grimes */ 32693957f8SRick Macklem /*- 33693957f8SRick Macklem * Copyright (c) 2004, 2008, 2009 Silicon Graphics International Corp. 34693957f8SRick Macklem * All rights reserved. 35693957f8SRick Macklem * 36693957f8SRick Macklem * Redistribution and use in source and binary forms, with or without 37693957f8SRick Macklem * modification, are permitted provided that the following conditions 38693957f8SRick Macklem * are met: 39693957f8SRick Macklem * 1. Redistributions of source code must retain the above copyright 40693957f8SRick Macklem * notice, this list of conditions, and the following disclaimer, 41693957f8SRick Macklem * without modification. 42693957f8SRick Macklem * 2. Redistributions in binary form must reproduce at minimum a disclaimer 43693957f8SRick Macklem * substantially similar to the "NO WARRANTY" disclaimer below 44693957f8SRick Macklem * ("Disclaimer") and any redistribution must be conditioned upon 45693957f8SRick Macklem * including a substantially similar Disclaimer requirement for further 46693957f8SRick Macklem * binary redistribution. 47693957f8SRick Macklem * 48693957f8SRick Macklem * NO WARRANTY 49693957f8SRick Macklem * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 50693957f8SRick Macklem * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 51693957f8SRick Macklem * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 52693957f8SRick Macklem * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 53693957f8SRick Macklem * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 54693957f8SRick Macklem * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 55693957f8SRick Macklem * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 56693957f8SRick Macklem * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 57693957f8SRick Macklem * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 58693957f8SRick Macklem * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 59693957f8SRick Macklem * POSSIBILITY OF SUCH DAMAGES. 60693957f8SRick Macklem */ 61693957f8SRick Macklem 629b50d902SRodney W. Grimes 639b50d902SRodney W. Grimes #ifndef lint 64db995e00SXin LI static const char copyright[] = 659b50d902SRodney W. Grimes "@(#) Copyright (c) 1983, 1989, 1993\n\ 669b50d902SRodney W. Grimes The Regents of the University of California. All rights reserved.\n"; 679b50d902SRodney W. Grimes #endif /* not lint */ 689b50d902SRodney W. Grimes 699b50d902SRodney W. Grimes #ifndef lint 70eae79dd1SBruce Evans #if 0 71eae79dd1SBruce Evans static char sccsid[] = "@(#)nfsstat.c 8.2 (Berkeley) 3/31/95"; 72eae79dd1SBruce Evans #endif 7307e532e7SGarrett Wollman static const char rcsid[] = 74c3aac50fSPeter Wemm "$FreeBSD$"; 759b50d902SRodney W. Grimes #endif /* not lint */ 769b50d902SRodney W. Grimes 779b50d902SRodney W. Grimes #include <sys/param.h> 7833f5882eSEd Schouten #include <sys/module.h> 799b50d902SRodney W. Grimes #include <sys/mount.h> 805a4838fcSPoul-Henning Kamp #include <sys/time.h> 8107e532e7SGarrett Wollman #include <sys/sysctl.h> 82a62dc406SDoug Rabson #include <nfs/nfsproto.h> 8391196234SPeter Wemm #include <nfsclient/nfs.h> 8491196234SPeter Wemm #include <nfsserver/nfs.h> 85bcdaa850SRick Macklem #include <nfs/nfssvc.h> 86bcdaa850SRick Macklem 87bcdaa850SRick Macklem #include <fs/nfs/nfsport.h> 88bcdaa850SRick Macklem 899b50d902SRodney W. Grimes #include <signal.h> 909b50d902SRodney W. Grimes #include <fcntl.h> 91821df508SXin LI #include <ctype.h> 929b50d902SRodney W. Grimes #include <errno.h> 939c9f2eefSThomas Moestl #include <limits.h> 949b50d902SRodney W. Grimes #include <nlist.h> 959b50d902SRodney W. Grimes #include <unistd.h> 969b50d902SRodney W. Grimes #include <stdio.h> 97693957f8SRick Macklem #include <stdint.h> 989b50d902SRodney W. Grimes #include <stdlib.h> 999b50d902SRodney W. Grimes #include <string.h> 100821df508SXin LI #include <paths.h> 101693957f8SRick Macklem #include <devstat.h> 10207e532e7SGarrett Wollman #include <err.h> 1039b50d902SRodney W. Grimes 1044893ef0bSMatthew Dillon static int widemode = 0; 105813947b7SJohn Baldwin static int zflag = 0; 106bcdaa850SRick Macklem static int printtitle = 1; 107693957f8SRick Macklem static struct nfsstatsv1 ext_nfsstats; 108e85b7d75SRick Macklem static int extra_output = 0; 10907e532e7SGarrett Wollman 110722e2552SEdward Tomasz Napierala static void intpr(int, int); 111693957f8SRick Macklem static void printhdr(int, int, int); 112722e2552SEdward Tomasz Napierala static void usage(void); 113722e2552SEdward Tomasz Napierala static char *sperc1(int, int); 114722e2552SEdward Tomasz Napierala static char *sperc2(int, int); 115722e2552SEdward Tomasz Napierala static void exp_intpr(int, int); 116*0744a2b0SRick Macklem static void exp41_intpr(int, int); 117693957f8SRick Macklem static void exp_sidewaysintpr(u_int, int, int, int); 118693957f8SRick Macklem static void compute_new_stats(struct nfsstatsv1 *cur_stats, 119693957f8SRick Macklem struct nfsstatsv1 *prev_stats, int curop, long double etime, 120693957f8SRick Macklem long double *mbsec, long double *kb_per_transfer, 121693957f8SRick Macklem long double *transfers_per_second, long double *ms_per_transfer, 122693957f8SRick Macklem uint64_t *queue_len, long double *busy_pct); 1234893ef0bSMatthew Dillon 1244893ef0bSMatthew Dillon #define DELTA(field) (nfsstats.field - lastst.field) 1259b50d902SRodney W. Grimes 126693957f8SRick Macklem #define STAT_TYPE_READ 0 127693957f8SRick Macklem #define STAT_TYPE_WRITE 1 128693957f8SRick Macklem #define STAT_TYPE_COMMIT 2 129693957f8SRick Macklem #define NUM_STAT_TYPES 3 130693957f8SRick Macklem 131693957f8SRick Macklem struct stattypes { 132693957f8SRick Macklem int stat_type; 133693957f8SRick Macklem int nfs_type; 134684d18c9SRick Macklem }; 135684d18c9SRick Macklem static struct stattypes statstruct[] = { 136693957f8SRick Macklem {STAT_TYPE_READ, NFSV4OP_READ}, 137693957f8SRick Macklem {STAT_TYPE_WRITE, NFSV4OP_WRITE}, 138693957f8SRick Macklem {STAT_TYPE_COMMIT, NFSV4OP_COMMIT} 139693957f8SRick Macklem }; 140693957f8SRick Macklem 141693957f8SRick Macklem #define STAT_TYPE_TO_NFS(stat_type) statstruct[stat_type].nfs_type 142693957f8SRick Macklem 14370c3c978SStefan Farfeleder int 144813947b7SJohn Baldwin main(int argc, char **argv) 1459b50d902SRodney W. Grimes { 1469b50d902SRodney W. Grimes u_int interval; 1474893ef0bSMatthew Dillon int clientOnly = -1; 1484893ef0bSMatthew Dillon int serverOnly = -1; 149693957f8SRick Macklem int newStats = 0; 1509b50d902SRodney W. Grimes int ch; 1519b50d902SRodney W. Grimes char *memf, *nlistf; 152a6c903b8SRick Macklem int mntlen, i; 153a6c903b8SRick Macklem char buf[1024]; 154a6c903b8SRick Macklem struct statfs *mntbuf; 155a6c903b8SRick Macklem struct nfscl_dumpmntopts dumpmntopts; 1569b50d902SRodney W. Grimes 1579b50d902SRodney W. Grimes interval = 0; 1589b50d902SRodney W. Grimes memf = nlistf = NULL; 159*0744a2b0SRick Macklem while ((ch = getopt(argc, argv, "cdEesWM:mN:w:z")) != -1) 1609b50d902SRodney W. Grimes switch(ch) { 1619b50d902SRodney W. Grimes case 'M': 1629b50d902SRodney W. Grimes memf = optarg; 1639b50d902SRodney W. Grimes break; 164a6c903b8SRick Macklem case 'm': 165a6c903b8SRick Macklem /* Display mount options for NFS mount points. */ 166a6c903b8SRick Macklem mntlen = getmntinfo(&mntbuf, MNT_NOWAIT); 167a6c903b8SRick Macklem for (i = 0; i < mntlen; i++) { 168a6c903b8SRick Macklem if (strcmp(mntbuf->f_fstypename, "nfs") == 0) { 169a6c903b8SRick Macklem dumpmntopts.ndmnt_fname = 170a6c903b8SRick Macklem mntbuf->f_mntonname; 171a6c903b8SRick Macklem dumpmntopts.ndmnt_buf = buf; 172a6c903b8SRick Macklem dumpmntopts.ndmnt_blen = sizeof(buf); 173a6c903b8SRick Macklem if (nfssvc(NFSSVC_DUMPMNTOPTS, 174a6c903b8SRick Macklem &dumpmntopts) >= 0) 175a6c903b8SRick Macklem printf("%s on %s\n%s\n", 176a6c903b8SRick Macklem mntbuf->f_mntfromname, 177a6c903b8SRick Macklem mntbuf->f_mntonname, buf); 1787c44c114SRick Macklem else if (errno == EPERM) 1797c44c114SRick Macklem errx(1, "Only priviledged users" 1807c44c114SRick Macklem " can use the -m option"); 181a6c903b8SRick Macklem } 182a6c903b8SRick Macklem mntbuf++; 183a6c903b8SRick Macklem } 184a6c903b8SRick Macklem exit(0); 1859b50d902SRodney W. Grimes case 'N': 1869b50d902SRodney W. Grimes nlistf = optarg; 1879b50d902SRodney W. Grimes break; 1884893ef0bSMatthew Dillon case 'W': 1894893ef0bSMatthew Dillon widemode = 1; 1904893ef0bSMatthew Dillon break; 1919b50d902SRodney W. Grimes case 'w': 1929b50d902SRodney W. Grimes interval = atoi(optarg); 1939b50d902SRodney W. Grimes break; 1944893ef0bSMatthew Dillon case 'c': 1954893ef0bSMatthew Dillon clientOnly = 1; 1964893ef0bSMatthew Dillon if (serverOnly < 0) 1974893ef0bSMatthew Dillon serverOnly = 0; 1984893ef0bSMatthew Dillon break; 199693957f8SRick Macklem case 'd': 200693957f8SRick Macklem newStats = 1; 201693957f8SRick Macklem if (interval == 0) 202693957f8SRick Macklem interval = 1; 203693957f8SRick Macklem break; 2044893ef0bSMatthew Dillon case 's': 2054893ef0bSMatthew Dillon serverOnly = 1; 2064893ef0bSMatthew Dillon if (clientOnly < 0) 2074893ef0bSMatthew Dillon clientOnly = 0; 2084893ef0bSMatthew Dillon break; 209813947b7SJohn Baldwin case 'z': 210813947b7SJohn Baldwin zflag = 1; 211813947b7SJohn Baldwin break; 212*0744a2b0SRick Macklem case 'E': 213*0744a2b0SRick Macklem if (extra_output != 0) 214*0744a2b0SRick Macklem errx(1, "-e and -E are mutually exclusive"); 215*0744a2b0SRick Macklem extra_output = 2; 216*0744a2b0SRick Macklem break; 21761a2fc1fSRick Macklem case 'e': 218*0744a2b0SRick Macklem if (extra_output != 0) 219*0744a2b0SRick Macklem errx(1, "-e and -E are mutually exclusive"); 220e85b7d75SRick Macklem extra_output = 1; 221bcdaa850SRick Macklem break; 2229b50d902SRodney W. Grimes case '?': 2239b50d902SRodney W. Grimes default: 2249b50d902SRodney W. Grimes usage(); 2259b50d902SRodney W. Grimes } 2269b50d902SRodney W. Grimes argc -= optind; 2279b50d902SRodney W. Grimes argv += optind; 2289b50d902SRodney W. Grimes 2299b50d902SRodney W. Grimes #define BACKWARD_COMPATIBILITY 2309b50d902SRodney W. Grimes #ifdef BACKWARD_COMPATIBILITY 2319b50d902SRodney W. Grimes if (*argv) { 2329b50d902SRodney W. Grimes interval = atoi(*argv); 2339b50d902SRodney W. Grimes if (*++argv) { 2349b50d902SRodney W. Grimes nlistf = *argv; 2359b50d902SRodney W. Grimes if (*++argv) 2369b50d902SRodney W. Grimes memf = *argv; 2379b50d902SRodney W. Grimes } 2389b50d902SRodney W. Grimes } 2399b50d902SRodney W. Grimes #endif 240722e2552SEdward Tomasz Napierala if (modfind("nfscommon") < 0) 241722e2552SEdward Tomasz Napierala errx(1, "NFS client/server not loaded"); 2429b50d902SRodney W. Grimes 243bcdaa850SRick Macklem if (interval) { 244693957f8SRick Macklem exp_sidewaysintpr(interval, clientOnly, serverOnly, 245693957f8SRick Macklem newStats); 246bcdaa850SRick Macklem } else { 247*0744a2b0SRick Macklem if (extra_output == 2) 248*0744a2b0SRick Macklem exp41_intpr(clientOnly, serverOnly); 249*0744a2b0SRick Macklem else if (extra_output == 1) 250bcdaa850SRick Macklem exp_intpr(clientOnly, serverOnly); 2519b50d902SRodney W. Grimes else 2524893ef0bSMatthew Dillon intpr(clientOnly, serverOnly); 253bcdaa850SRick Macklem } 2549b50d902SRodney W. Grimes exit(0); 2559b50d902SRodney W. Grimes } 2569b50d902SRodney W. Grimes 2579b50d902SRodney W. Grimes /* 2589b50d902SRodney W. Grimes * Print a description of the nfs stats. 2599b50d902SRodney W. Grimes */ 260722e2552SEdward Tomasz Napierala static void 2614893ef0bSMatthew Dillon intpr(int clientOnly, int serverOnly) 2629b50d902SRodney W. Grimes { 263e85b7d75SRick Macklem int nfssvc_flag; 2649b50d902SRodney W. Grimes 265693957f8SRick Macklem nfssvc_flag = NFSSVC_GETSTATS | NFSSVC_NEWSTRUCT; 266e85b7d75SRick Macklem if (zflag != 0) { 267e85b7d75SRick Macklem if (clientOnly != 0) 268e85b7d75SRick Macklem nfssvc_flag |= NFSSVC_ZEROCLTSTATS; 269e85b7d75SRick Macklem if (serverOnly != 0) 270e85b7d75SRick Macklem nfssvc_flag |= NFSSVC_ZEROSRVSTATS; 271e85b7d75SRick Macklem } 272693957f8SRick Macklem ext_nfsstats.vers = NFSSTATS_V1; 273e85b7d75SRick Macklem if (nfssvc(nfssvc_flag, &ext_nfsstats) < 0) 274e85b7d75SRick Macklem err(1, "Can't get stats"); 2754893ef0bSMatthew Dillon if (clientOnly) { 2769b50d902SRodney W. Grimes printf("Client Info:\n"); 2779b50d902SRodney W. Grimes printf("Rpc Counts:\n"); 2789b50d902SRodney W. Grimes printf("%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n", 2799b50d902SRodney W. Grimes "Getattr", "Setattr", "Lookup", "Readlink", "Read", 2809b50d902SRodney W. Grimes "Write", "Create", "Remove"); 281693957f8SRick Macklem printf("%9ju %9ju %9ju %9ju %9ju %9ju %9ju %9ju\n", 282693957f8SRick Macklem (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_GETATTR], 283693957f8SRick Macklem (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_SETATTR], 284693957f8SRick Macklem (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_LOOKUP], 285693957f8SRick Macklem (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_READLINK], 286693957f8SRick Macklem (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_READ], 287693957f8SRick Macklem (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_WRITE], 288693957f8SRick Macklem (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_CREATE], 289693957f8SRick Macklem (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_REMOVE]); 2909b50d902SRodney W. Grimes printf("%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n", 2919b50d902SRodney W. Grimes "Rename", "Link", "Symlink", "Mkdir", "Rmdir", 292a62dc406SDoug Rabson "Readdir", "RdirPlus", "Access"); 293693957f8SRick Macklem printf("%9ju %9ju %9ju %9ju %9ju %9ju %9ju %9ju\n", 294693957f8SRick Macklem (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_RENAME], 295693957f8SRick Macklem (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_LINK], 296693957f8SRick Macklem (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_SYMLINK], 297693957f8SRick Macklem (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_MKDIR], 298693957f8SRick Macklem (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_RMDIR], 299693957f8SRick Macklem (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_READDIR], 300693957f8SRick Macklem (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_READDIRPLUS], 301693957f8SRick Macklem (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_ACCESS]); 30291196234SPeter Wemm printf("%9.9s %9.9s %9.9s %9.9s %9.9s\n", 30391196234SPeter Wemm "Mknod", "Fsstat", "Fsinfo", "PathConf", "Commit"); 304693957f8SRick Macklem printf("%9ju %9ju %9ju %9ju %9ju\n", 305693957f8SRick Macklem (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_MKNOD], 306693957f8SRick Macklem (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_FSSTAT], 307693957f8SRick Macklem (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_FSINFO], 308693957f8SRick Macklem (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_PATHCONF], 309693957f8SRick Macklem (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_COMMIT]); 3109b50d902SRodney W. Grimes printf("Rpc Info:\n"); 3119b50d902SRodney W. Grimes printf("%9.9s %9.9s %9.9s %9.9s %9.9s\n", 3124893ef0bSMatthew Dillon "TimedOut", "Invalid", "X Replies", "Retries", 3134893ef0bSMatthew Dillon "Requests"); 314693957f8SRick Macklem printf("%9ju %9ju %9ju %9ju %9ju\n", 315693957f8SRick Macklem (uintmax_t)ext_nfsstats.rpctimeouts, 316693957f8SRick Macklem (uintmax_t)ext_nfsstats.rpcinvalid, 317693957f8SRick Macklem (uintmax_t)ext_nfsstats.rpcunexpected, 318693957f8SRick Macklem (uintmax_t)ext_nfsstats.rpcretries, 319693957f8SRick Macklem (uintmax_t)ext_nfsstats.rpcrequests); 3209b50d902SRodney W. Grimes printf("Cache Info:\n"); 3219b50d902SRodney W. Grimes printf("%9.9s %9.9s %9.9s %9.9s", 3229b50d902SRodney W. Grimes "Attr Hits", "Misses", "Lkup Hits", "Misses"); 3239b50d902SRodney W. Grimes printf(" %9.9s %9.9s %9.9s %9.9s\n", 3249b50d902SRodney W. Grimes "BioR Hits", "Misses", "BioW Hits", "Misses"); 325693957f8SRick Macklem printf("%9ju %9ju %9ju %9ju", 326693957f8SRick Macklem (uintmax_t)ext_nfsstats.attrcache_hits, 327693957f8SRick Macklem (uintmax_t)ext_nfsstats.attrcache_misses, 328693957f8SRick Macklem (uintmax_t)ext_nfsstats.lookupcache_hits, 329693957f8SRick Macklem (uintmax_t)ext_nfsstats.lookupcache_misses); 330693957f8SRick Macklem printf(" %9ju %9ju %9ju %9ju\n", 331693957f8SRick Macklem (uintmax_t)(ext_nfsstats.biocache_reads - 332693957f8SRick Macklem ext_nfsstats.read_bios), 333693957f8SRick Macklem (uintmax_t)ext_nfsstats.read_bios, 334693957f8SRick Macklem (uintmax_t)(ext_nfsstats.biocache_writes - 335693957f8SRick Macklem ext_nfsstats.write_bios), 336693957f8SRick Macklem (uintmax_t)ext_nfsstats.write_bios); 3379b50d902SRodney W. Grimes printf("%9.9s %9.9s %9.9s %9.9s", 3389b50d902SRodney W. Grimes "BioRLHits", "Misses", "BioD Hits", "Misses"); 3394898f742SRuslan Ermilov printf(" %9.9s %9.9s %9.9s %9.9s\n", "DirE Hits", "Misses", "Accs Hits", "Misses"); 340693957f8SRick Macklem printf("%9ju %9ju %9ju %9ju", 341693957f8SRick Macklem (uintmax_t)(ext_nfsstats.biocache_readlinks - 342693957f8SRick Macklem ext_nfsstats.readlink_bios), 343693957f8SRick Macklem (uintmax_t)ext_nfsstats.readlink_bios, 344693957f8SRick Macklem (uintmax_t)(ext_nfsstats.biocache_readdirs - 345693957f8SRick Macklem ext_nfsstats.readdir_bios), 346693957f8SRick Macklem (uintmax_t)ext_nfsstats.readdir_bios); 347693957f8SRick Macklem printf(" %9ju %9ju %9ju %9ju\n", 348693957f8SRick Macklem (uintmax_t)ext_nfsstats.direofcache_hits, 349693957f8SRick Macklem (uintmax_t)ext_nfsstats.direofcache_misses, 350693957f8SRick Macklem (uintmax_t)ext_nfsstats.accesscache_hits, 351693957f8SRick Macklem (uintmax_t)ext_nfsstats.accesscache_misses); 3524893ef0bSMatthew Dillon } 3534893ef0bSMatthew Dillon if (serverOnly) { 3549b50d902SRodney W. Grimes printf("\nServer Info:\n"); 3559b50d902SRodney W. Grimes printf("%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n", 3569b50d902SRodney W. Grimes "Getattr", "Setattr", "Lookup", "Readlink", "Read", 3579b50d902SRodney W. Grimes "Write", "Create", "Remove"); 358693957f8SRick Macklem printf("%9ju %9ju %9ju %9ju %9ju %9ju %9ju %9ju\n", 359693957f8SRick Macklem (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_GETATTR], 360693957f8SRick Macklem (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_SETATTR], 361693957f8SRick Macklem (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_LOOKUP], 362693957f8SRick Macklem (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_READLINK], 363693957f8SRick Macklem (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_READ], 364693957f8SRick Macklem (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_WRITE], 365693957f8SRick Macklem (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_CREATE], 366693957f8SRick Macklem (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_REMOVE]); 3679b50d902SRodney W. Grimes printf("%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n", 3689b50d902SRodney W. Grimes "Rename", "Link", "Symlink", "Mkdir", "Rmdir", 369a62dc406SDoug Rabson "Readdir", "RdirPlus", "Access"); 370693957f8SRick Macklem printf("%9ju %9ju %9ju %9ju %9ju %9ju %9ju %9ju\n", 371693957f8SRick Macklem (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_RENAME], 372693957f8SRick Macklem (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_LINK], 373693957f8SRick Macklem (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_SYMLINK], 374693957f8SRick Macklem (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_MKDIR], 375693957f8SRick Macklem (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_RMDIR], 376693957f8SRick Macklem (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_READDIR], 377693957f8SRick Macklem (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_READDIRPLUS], 378693957f8SRick Macklem (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_ACCESS]); 37991196234SPeter Wemm printf("%9.9s %9.9s %9.9s %9.9s %9.9s\n", 38091196234SPeter Wemm "Mknod", "Fsstat", "Fsinfo", "PathConf", "Commit"); 381693957f8SRick Macklem printf("%9ju %9ju %9ju %9ju %9ju\n", 382693957f8SRick Macklem (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_MKNOD], 383693957f8SRick Macklem (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_FSSTAT], 384693957f8SRick Macklem (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_FSINFO], 385693957f8SRick Macklem (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_PATHCONF], 386693957f8SRick Macklem (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_COMMIT]); 3879b50d902SRodney W. Grimes printf("Server Ret-Failed\n"); 388693957f8SRick Macklem printf("%17ju\n", (uintmax_t)ext_nfsstats.srvrpc_errs); 3899b50d902SRodney W. Grimes printf("Server Faults\n"); 390693957f8SRick Macklem printf("%13ju\n", (uintmax_t)ext_nfsstats.srv_errs); 3919b50d902SRodney W. Grimes printf("Server Cache Stats:\n"); 3929b50d902SRodney W. Grimes printf("%9.9s %9.9s %9.9s %9.9s\n", 3939b50d902SRodney W. Grimes "Inprog", "Idem", "Non-idem", "Misses"); 394693957f8SRick Macklem printf("%9ju %9ju %9ju %9ju\n", 395693957f8SRick Macklem (uintmax_t)ext_nfsstats.srvcache_inproghits, 396693957f8SRick Macklem (uintmax_t)ext_nfsstats.srvcache_idemdonehits, 397693957f8SRick Macklem (uintmax_t)ext_nfsstats.srvcache_nonidemdonehits, 398693957f8SRick Macklem (uintmax_t)ext_nfsstats.srvcache_misses); 399a62dc406SDoug Rabson printf("Server Write Gathering:\n"); 400a62dc406SDoug Rabson printf("%9.9s %9.9s %9.9s\n", 401a62dc406SDoug Rabson "WriteOps", "WriteRPC", "Opsaved"); 402e85b7d75SRick Macklem /* 403e85b7d75SRick Macklem * The new client doesn't do write gathering. It was 404e85b7d75SRick Macklem * only useful for NFSv2. 405e85b7d75SRick Macklem */ 406693957f8SRick Macklem printf("%9ju %9ju %9d\n", 407693957f8SRick Macklem (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_WRITE], 408693957f8SRick Macklem (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_WRITE], 0); 4094893ef0bSMatthew Dillon } 4109b50d902SRodney W. Grimes } 4119b50d902SRodney W. Grimes 412722e2552SEdward Tomasz Napierala static void 413693957f8SRick Macklem printhdr(int clientOnly, int serverOnly, int newStats) 4149b50d902SRodney W. Grimes { 415693957f8SRick Macklem 416693957f8SRick Macklem if (newStats) { 417693957f8SRick Macklem printf(" [%s Read %s] [%s Write %s] " 418693957f8SRick Macklem "%s[=========== Total ============]\n" 419693957f8SRick Macklem " KB/t tps MB/s%s KB/t tps MB/s%s " 420693957f8SRick Macklem "%sKB/t tps MB/s ms ql %%b", 421693957f8SRick Macklem widemode ? "========" : "=====", 422693957f8SRick Macklem widemode ? "========" : "=====", 423693957f8SRick Macklem widemode ? "========" : "=====", 424693957f8SRick Macklem widemode ? "=======" : "====", 425693957f8SRick Macklem widemode ? "[Commit ] " : "", 426693957f8SRick Macklem widemode ? " ms" : "", 427693957f8SRick Macklem widemode ? " ms" : "", 428693957f8SRick Macklem widemode ? "tps ms " : ""); 429693957f8SRick Macklem } else { 4304893ef0bSMatthew Dillon printf("%s%6.6s %6.6s %6.6s %6.6s %6.6s %6.6s %6.6s %6.6s", 4314893ef0bSMatthew Dillon ((serverOnly && clientOnly) ? " " : " "), 4324893ef0bSMatthew Dillon "GtAttr", "Lookup", "Rdlink", "Read", "Write", "Rename", 4334893ef0bSMatthew Dillon "Access", "Rddir"); 4344893ef0bSMatthew Dillon if (widemode && clientOnly) { 4354893ef0bSMatthew Dillon printf(" Attr Lkup BioR BioW Accs BioD"); 4369b50d902SRodney W. Grimes } 437693957f8SRick Macklem } 4384893ef0bSMatthew Dillon printf("\n"); 4394893ef0bSMatthew Dillon fflush(stdout); 4409b50d902SRodney W. Grimes } 4419b50d902SRodney W. Grimes 442722e2552SEdward Tomasz Napierala static void 443813947b7SJohn Baldwin usage(void) 4449b50d902SRodney W. Grimes { 4459b50d902SRodney W. Grimes (void)fprintf(stderr, 446693957f8SRick Macklem "usage: nfsstat [-cdemszW] [-M core] [-N system] [-w wait]\n"); 4479b50d902SRodney W. Grimes exit(1); 4489b50d902SRodney W. Grimes } 4494893ef0bSMatthew Dillon 4504893ef0bSMatthew Dillon static char SPBuf[64][8]; 4514893ef0bSMatthew Dillon static int SPIndex; 4524893ef0bSMatthew Dillon 453722e2552SEdward Tomasz Napierala static char * 4544893ef0bSMatthew Dillon sperc1(int hits, int misses) 4554893ef0bSMatthew Dillon { 4564893ef0bSMatthew Dillon char *p = SPBuf[SPIndex]; 4574893ef0bSMatthew Dillon 4584893ef0bSMatthew Dillon if (hits + misses) { 4594893ef0bSMatthew Dillon sprintf(p, "%3d%%", 4604893ef0bSMatthew Dillon (int)(char)((quad_t)hits * 100 / (hits + misses))); 4614893ef0bSMatthew Dillon } else { 4624893ef0bSMatthew Dillon sprintf(p, " -"); 4634893ef0bSMatthew Dillon } 4644893ef0bSMatthew Dillon SPIndex = (SPIndex + 1) & 63; 4654893ef0bSMatthew Dillon return(p); 4664893ef0bSMatthew Dillon } 4674893ef0bSMatthew Dillon 468722e2552SEdward Tomasz Napierala static char * 4694893ef0bSMatthew Dillon sperc2(int ttl, int misses) 4704893ef0bSMatthew Dillon { 4714893ef0bSMatthew Dillon char *p = SPBuf[SPIndex]; 4724893ef0bSMatthew Dillon 4734893ef0bSMatthew Dillon if (ttl) { 4744893ef0bSMatthew Dillon sprintf(p, "%3d%%", 4754893ef0bSMatthew Dillon (int)(char)((quad_t)(ttl - misses) * 100 / ttl)); 4764893ef0bSMatthew Dillon } else { 4774893ef0bSMatthew Dillon sprintf(p, " -"); 4784893ef0bSMatthew Dillon } 4794893ef0bSMatthew Dillon SPIndex = (SPIndex + 1) & 63; 4804893ef0bSMatthew Dillon return(p); 4814893ef0bSMatthew Dillon } 4824893ef0bSMatthew Dillon 483693957f8SRick Macklem #define DELTA_T(field) \ 484693957f8SRick Macklem devstat_compute_etime(&cur_stats->field, \ 485693957f8SRick Macklem (prev_stats ? &prev_stats->field : NULL)) 486693957f8SRick Macklem 487693957f8SRick Macklem /* 488693957f8SRick Macklem * XXX KDM mostly copied from ctlstat. We should commonize the code (and 489693957f8SRick Macklem * the devstat code) somehow. 490693957f8SRick Macklem */ 491693957f8SRick Macklem static void 492693957f8SRick Macklem compute_new_stats(struct nfsstatsv1 *cur_stats, 493693957f8SRick Macklem struct nfsstatsv1 *prev_stats, int curop, 494693957f8SRick Macklem long double etime, long double *mbsec, 495693957f8SRick Macklem long double *kb_per_transfer, 496693957f8SRick Macklem long double *transfers_per_second, 497693957f8SRick Macklem long double *ms_per_transfer, uint64_t *queue_len, 498693957f8SRick Macklem long double *busy_pct) 499693957f8SRick Macklem { 500693957f8SRick Macklem uint64_t total_bytes = 0, total_operations = 0; 501693957f8SRick Macklem struct bintime total_time_bt; 502693957f8SRick Macklem struct timespec total_time_ts; 503693957f8SRick Macklem 504693957f8SRick Macklem bzero(&total_time_bt, sizeof(total_time_bt)); 505693957f8SRick Macklem bzero(&total_time_ts, sizeof(total_time_ts)); 506693957f8SRick Macklem 507693957f8SRick Macklem total_bytes = cur_stats->srvbytes[curop]; 508693957f8SRick Macklem total_operations = cur_stats->srvops[curop]; 509693957f8SRick Macklem if (prev_stats != NULL) { 510693957f8SRick Macklem total_bytes -= prev_stats->srvbytes[curop]; 511693957f8SRick Macklem total_operations -= prev_stats->srvops[curop]; 512693957f8SRick Macklem } 513693957f8SRick Macklem 514693957f8SRick Macklem *mbsec = total_bytes; 515693957f8SRick Macklem *mbsec /= 1024 * 1024; 516693957f8SRick Macklem if (etime > 0.0) { 517693957f8SRick Macklem *busy_pct = DELTA_T(busytime); 518693957f8SRick Macklem if (*busy_pct < 0) 519693957f8SRick Macklem *busy_pct = 0; 520693957f8SRick Macklem *busy_pct /= etime; 521693957f8SRick Macklem *busy_pct *= 100; 522693957f8SRick Macklem if (*busy_pct < 0) 523693957f8SRick Macklem *busy_pct = 0; 524693957f8SRick Macklem *mbsec /= etime; 525693957f8SRick Macklem } else { 526693957f8SRick Macklem *busy_pct = 0; 527693957f8SRick Macklem *mbsec = 0; 528693957f8SRick Macklem } 529693957f8SRick Macklem *kb_per_transfer = total_bytes; 530693957f8SRick Macklem *kb_per_transfer /= 1024; 531693957f8SRick Macklem if (total_operations > 0) 532693957f8SRick Macklem *kb_per_transfer /= total_operations; 533693957f8SRick Macklem else 534693957f8SRick Macklem *kb_per_transfer = 0; 535693957f8SRick Macklem if (etime > 0.0) { 536693957f8SRick Macklem *transfers_per_second = total_operations; 537693957f8SRick Macklem *transfers_per_second /= etime; 538693957f8SRick Macklem } else { 539693957f8SRick Macklem *transfers_per_second = 0.0; 540693957f8SRick Macklem } 541693957f8SRick Macklem 542693957f8SRick Macklem if (total_operations > 0) { 543693957f8SRick Macklem *ms_per_transfer = DELTA_T(srvduration[curop]); 544693957f8SRick Macklem *ms_per_transfer /= total_operations; 545693957f8SRick Macklem *ms_per_transfer *= 1000; 546693957f8SRick Macklem } else 547693957f8SRick Macklem *ms_per_transfer = 0.0; 548693957f8SRick Macklem 549693957f8SRick Macklem *queue_len = cur_stats->srvstartcnt - cur_stats->srvdonecnt; 550693957f8SRick Macklem } 551693957f8SRick Macklem 552bcdaa850SRick Macklem /* 553bcdaa850SRick Macklem * Print a description of the nfs stats for the experimental client/server. 554bcdaa850SRick Macklem */ 555722e2552SEdward Tomasz Napierala static void 556bcdaa850SRick Macklem exp_intpr(int clientOnly, int serverOnly) 557bcdaa850SRick Macklem { 5580e8f7d19SRick Macklem int nfssvc_flag; 559bcdaa850SRick Macklem 560693957f8SRick Macklem nfssvc_flag = NFSSVC_GETSTATS | NFSSVC_NEWSTRUCT; 5610e8f7d19SRick Macklem if (zflag != 0) { 5620e8f7d19SRick Macklem if (clientOnly != 0) 5630e8f7d19SRick Macklem nfssvc_flag |= NFSSVC_ZEROCLTSTATS; 5640e8f7d19SRick Macklem if (serverOnly != 0) 5650e8f7d19SRick Macklem nfssvc_flag |= NFSSVC_ZEROSRVSTATS; 5660e8f7d19SRick Macklem } 567693957f8SRick Macklem ext_nfsstats.vers = NFSSTATS_V1; 5680e8f7d19SRick Macklem if (nfssvc(nfssvc_flag, &ext_nfsstats) < 0) 5690e8f7d19SRick Macklem err(1, "Can't get stats"); 570bcdaa850SRick Macklem if (clientOnly != 0) { 571bcdaa850SRick Macklem if (printtitle) { 572bcdaa850SRick Macklem printf("Client Info:\n"); 573bcdaa850SRick Macklem printf("Rpc Counts:\n"); 574bcdaa850SRick Macklem printf( 575bcdaa850SRick Macklem "%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n" 576bcdaa850SRick Macklem , "Getattr", "Setattr", "Lookup", "Readlink", 577bcdaa850SRick Macklem "Read", "Write", "Create", "Remove"); 578bcdaa850SRick Macklem } 579693957f8SRick Macklem printf("%9ju %9ju %9ju %9ju %9ju %9ju %9ju %9ju\n", 580693957f8SRick Macklem (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_GETATTR], 581693957f8SRick Macklem (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_SETATTR], 582693957f8SRick Macklem (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_LOOKUP], 583693957f8SRick Macklem (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_READLINK], 584693957f8SRick Macklem (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_READ], 585693957f8SRick Macklem (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_WRITE], 586693957f8SRick Macklem (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_CREATE], 587693957f8SRick Macklem (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_REMOVE]); 588bcdaa850SRick Macklem if (printtitle) 589bcdaa850SRick Macklem printf( 590bcdaa850SRick Macklem "%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n" 591bcdaa850SRick Macklem , "Rename", "Link", "Symlink", "Mkdir", "Rmdir", 592bcdaa850SRick Macklem "Readdir", "RdirPlus", "Access"); 593693957f8SRick Macklem printf("%9ju %9ju %9ju %9ju %9ju %9ju %9ju %9ju\n", 594693957f8SRick Macklem (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_RENAME], 595693957f8SRick Macklem (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_LINK], 596693957f8SRick Macklem (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_SYMLINK], 597693957f8SRick Macklem (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_MKDIR], 598693957f8SRick Macklem (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_RMDIR], 599693957f8SRick Macklem (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_READDIR], 600693957f8SRick Macklem (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_READDIRPLUS], 601693957f8SRick Macklem (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_ACCESS]); 602bcdaa850SRick Macklem if (printtitle) 603bcdaa850SRick Macklem printf( 604bcdaa850SRick Macklem "%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n" 605bcdaa850SRick Macklem , "Mknod", "Fsstat", "Fsinfo", "PathConf", 606bcdaa850SRick Macklem "Commit", "SetClId", "SetClIdCf", "Lock"); 607693957f8SRick Macklem printf("%9ju %9ju %9ju %9ju %9ju %9ju %9ju %9ju\n", 608693957f8SRick Macklem (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_MKNOD], 609693957f8SRick Macklem (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_FSSTAT], 610693957f8SRick Macklem (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_FSINFO], 611693957f8SRick Macklem (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_PATHCONF], 612693957f8SRick Macklem (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_COMMIT], 613693957f8SRick Macklem (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_SETCLIENTID], 614693957f8SRick Macklem (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_SETCLIENTIDCFRM], 615693957f8SRick Macklem (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_LOCK]); 616bcdaa850SRick Macklem if (printtitle) 617bcdaa850SRick Macklem printf("%9.9s %9.9s %9.9s %9.9s\n", 618bcdaa850SRick Macklem "LockT", "LockU", "Open", "OpenCfr"); 619693957f8SRick Macklem printf("%9ju %9ju %9ju %9ju\n", 620693957f8SRick Macklem (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_LOCKT], 621693957f8SRick Macklem (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_LOCKU], 622693957f8SRick Macklem (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_OPEN], 623693957f8SRick Macklem (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_OPENCONFIRM]); 624bcdaa850SRick Macklem if (printtitle) 625bcdaa850SRick Macklem printf( 626bcdaa850SRick Macklem "%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n" 627bcdaa850SRick Macklem , "OpenOwner", "Opens", "LockOwner", 628bcdaa850SRick Macklem "Locks", "Delegs", "LocalOwn", 629bcdaa850SRick Macklem "LocalOpen", "LocalLOwn"); 630693957f8SRick Macklem printf("%9ju %9ju %9ju %9ju %9ju %9ju %9ju %9ju\n", 631693957f8SRick Macklem (uintmax_t)ext_nfsstats.clopenowners, 632693957f8SRick Macklem (uintmax_t)ext_nfsstats.clopens, 633693957f8SRick Macklem (uintmax_t)ext_nfsstats.cllockowners, 634693957f8SRick Macklem (uintmax_t)ext_nfsstats.cllocks, 635693957f8SRick Macklem (uintmax_t)ext_nfsstats.cldelegates, 636693957f8SRick Macklem (uintmax_t)ext_nfsstats.cllocalopenowners, 637693957f8SRick Macklem (uintmax_t)ext_nfsstats.cllocalopens, 638693957f8SRick Macklem (uintmax_t)ext_nfsstats.cllocallockowners); 639bcdaa850SRick Macklem if (printtitle) 640bcdaa850SRick Macklem printf("%9.9s\n", "LocalLock"); 641693957f8SRick Macklem printf("%9ju\n", (uintmax_t)ext_nfsstats.cllocallocks); 642bcdaa850SRick Macklem if (printtitle) { 643bcdaa850SRick Macklem printf("Rpc Info:\n"); 644bcdaa850SRick Macklem printf("%9.9s %9.9s %9.9s %9.9s %9.9s\n", 645bcdaa850SRick Macklem "TimedOut", "Invalid", "X Replies", "Retries", 646bcdaa850SRick Macklem "Requests"); 647bcdaa850SRick Macklem } 648693957f8SRick Macklem printf("%9ju %9ju %9ju %9ju %9ju\n", 649693957f8SRick Macklem (uintmax_t)ext_nfsstats.rpctimeouts, 650693957f8SRick Macklem (uintmax_t)ext_nfsstats.rpcinvalid, 651693957f8SRick Macklem (uintmax_t)ext_nfsstats.rpcunexpected, 652693957f8SRick Macklem (uintmax_t)ext_nfsstats.rpcretries, 653693957f8SRick Macklem (uintmax_t)ext_nfsstats.rpcrequests); 654bcdaa850SRick Macklem if (printtitle) { 655bcdaa850SRick Macklem printf("Cache Info:\n"); 656bcdaa850SRick Macklem printf("%9.9s %9.9s %9.9s %9.9s", 657bcdaa850SRick Macklem "Attr Hits", "Misses", "Lkup Hits", "Misses"); 658bcdaa850SRick Macklem printf(" %9.9s %9.9s %9.9s %9.9s\n", 659bcdaa850SRick Macklem "BioR Hits", "Misses", "BioW Hits", "Misses"); 660bcdaa850SRick Macklem } 661693957f8SRick Macklem printf("%9ju %9ju %9ju %9ju", 662693957f8SRick Macklem (uintmax_t)ext_nfsstats.attrcache_hits, 663693957f8SRick Macklem (uintmax_t)ext_nfsstats.attrcache_misses, 664693957f8SRick Macklem (uintmax_t)ext_nfsstats.lookupcache_hits, 665693957f8SRick Macklem (uintmax_t)ext_nfsstats.lookupcache_misses); 666693957f8SRick Macklem printf(" %9ju %9ju %9ju %9ju\n", 667693957f8SRick Macklem (uintmax_t)(ext_nfsstats.biocache_reads - 668693957f8SRick Macklem ext_nfsstats.read_bios), 669693957f8SRick Macklem (uintmax_t)ext_nfsstats.read_bios, 670693957f8SRick Macklem (uintmax_t)(ext_nfsstats.biocache_writes - 671693957f8SRick Macklem ext_nfsstats.write_bios), 672693957f8SRick Macklem (uintmax_t)ext_nfsstats.write_bios); 673bcdaa850SRick Macklem if (printtitle) { 674bcdaa850SRick Macklem printf("%9.9s %9.9s %9.9s %9.9s", 675bcdaa850SRick Macklem "BioRLHits", "Misses", "BioD Hits", "Misses"); 676bcdaa850SRick Macklem printf(" %9.9s %9.9s\n", "DirE Hits", "Misses"); 677bcdaa850SRick Macklem } 678693957f8SRick Macklem printf("%9ju %9ju %9ju %9ju", 679693957f8SRick Macklem (uintmax_t)(ext_nfsstats.biocache_readlinks - 680693957f8SRick Macklem ext_nfsstats.readlink_bios), 681693957f8SRick Macklem (uintmax_t)ext_nfsstats.readlink_bios, 682693957f8SRick Macklem (uintmax_t)(ext_nfsstats.biocache_readdirs - 683693957f8SRick Macklem ext_nfsstats.readdir_bios), 684693957f8SRick Macklem (uintmax_t)ext_nfsstats.readdir_bios); 685693957f8SRick Macklem printf(" %9ju %9ju\n", 686693957f8SRick Macklem (uintmax_t)ext_nfsstats.direofcache_hits, 687693957f8SRick Macklem (uintmax_t)ext_nfsstats.direofcache_misses); 688bcdaa850SRick Macklem } 689bcdaa850SRick Macklem if (serverOnly != 0) { 690bcdaa850SRick Macklem if (printtitle) { 691bcdaa850SRick Macklem printf("\nServer Info:\n"); 692bcdaa850SRick Macklem printf( 693bcdaa850SRick Macklem "%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n" 694bcdaa850SRick Macklem , "Getattr", "Setattr", "Lookup", "Readlink", 695bcdaa850SRick Macklem "Read", "Write", "Create", "Remove"); 696bcdaa850SRick Macklem } 697693957f8SRick Macklem printf("%9ju %9ju %9ju %9ju %9ju %9ju %9ju %9ju\n", 698693957f8SRick Macklem (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_GETATTR], 699693957f8SRick Macklem (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_SETATTR], 700693957f8SRick Macklem (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_LOOKUP], 701693957f8SRick Macklem (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_READLINK], 702693957f8SRick Macklem (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_READ], 703693957f8SRick Macklem (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_WRITE], 704693957f8SRick Macklem (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_V3CREATE], 705693957f8SRick Macklem (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_REMOVE]); 706bcdaa850SRick Macklem if (printtitle) 707bcdaa850SRick Macklem printf( 708bcdaa850SRick Macklem "%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n" 709bcdaa850SRick Macklem , "Rename", "Link", "Symlink", "Mkdir", "Rmdir", 710bcdaa850SRick Macklem "Readdir", "RdirPlus", "Access"); 711693957f8SRick Macklem printf("%9ju %9ju %9ju %9ju %9ju %9ju %9ju %9ju\n", 712693957f8SRick Macklem (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_RENAME], 713693957f8SRick Macklem (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_LINK], 714693957f8SRick Macklem (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_SYMLINK], 715693957f8SRick Macklem (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_MKDIR], 716693957f8SRick Macklem (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_RMDIR], 717693957f8SRick Macklem (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_READDIR], 718693957f8SRick Macklem (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_READDIRPLUS], 719693957f8SRick Macklem (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_ACCESS]); 720bcdaa850SRick Macklem if (printtitle) 721bcdaa850SRick Macklem printf( 722bcdaa850SRick Macklem "%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n" 723bcdaa850SRick Macklem , "Mknod", "Fsstat", "Fsinfo", "PathConf", 724bcdaa850SRick Macklem "Commit", "LookupP", "SetClId", "SetClIdCf"); 725693957f8SRick Macklem printf("%9ju %9ju %9ju %9ju %9ju %9ju %9ju %9ju\n", 726693957f8SRick Macklem (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_MKNOD], 727693957f8SRick Macklem (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_FSSTAT], 728693957f8SRick Macklem (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_FSINFO], 729693957f8SRick Macklem (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_PATHCONF], 730693957f8SRick Macklem (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_COMMIT], 731693957f8SRick Macklem (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_LOOKUPP], 732693957f8SRick Macklem (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_SETCLIENTID], 733693957f8SRick Macklem (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_SETCLIENTIDCFRM]); 734bcdaa850SRick Macklem if (printtitle) 735bcdaa850SRick Macklem printf( 736bcdaa850SRick Macklem "%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n" 737bcdaa850SRick Macklem , "Open", "OpenAttr", "OpenDwnGr", "OpenCfrm", 738bcdaa850SRick Macklem "DelePurge", "DeleRet", "GetFH", "Lock"); 739693957f8SRick Macklem printf("%9ju %9ju %9ju %9ju %9ju %9ju %9ju %9ju\n", 740693957f8SRick Macklem (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_OPEN], 741693957f8SRick Macklem (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_OPENATTR], 742693957f8SRick Macklem (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_OPENDOWNGRADE], 743693957f8SRick Macklem (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_OPENCONFIRM], 744693957f8SRick Macklem (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_DELEGPURGE], 745693957f8SRick Macklem (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_DELEGRETURN], 746693957f8SRick Macklem (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_GETFH], 747693957f8SRick Macklem (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_LOCK]); 748bcdaa850SRick Macklem if (printtitle) 749bcdaa850SRick Macklem printf( 750bcdaa850SRick Macklem "%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n" 751bcdaa850SRick Macklem , "LockT", "LockU", "Close", "Verify", "NVerify", 752bcdaa850SRick Macklem "PutFH", "PutPubFH", "PutRootFH"); 753693957f8SRick Macklem printf("%9ju %9ju %9ju %9ju %9ju %9ju %9ju %9ju\n", 754693957f8SRick Macklem (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_LOCKT], 755693957f8SRick Macklem (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_LOCKU], 756693957f8SRick Macklem (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_CLOSE], 757693957f8SRick Macklem (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_VERIFY], 758693957f8SRick Macklem (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_NVERIFY], 759693957f8SRick Macklem (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_PUTFH], 760693957f8SRick Macklem (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_PUTPUBFH], 761693957f8SRick Macklem (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_PUTROOTFH]); 762bcdaa850SRick Macklem if (printtitle) 763bcdaa850SRick Macklem printf("%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n", 764bcdaa850SRick Macklem "Renew", "RestoreFH", "SaveFH", "Secinfo", 765bcdaa850SRick Macklem "RelLckOwn", "V4Create"); 766693957f8SRick Macklem printf("%9ju %9ju %9ju %9ju %9ju %9ju\n", 767693957f8SRick Macklem (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_RENEW], 768693957f8SRick Macklem (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_RESTOREFH], 769693957f8SRick Macklem (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_SAVEFH], 770693957f8SRick Macklem (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_SECINFO], 771693957f8SRick Macklem (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_RELEASELCKOWN], 772693957f8SRick Macklem (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_CREATE]); 773bcdaa850SRick Macklem if (printtitle) { 774bcdaa850SRick Macklem printf("Server:\n"); 775bcdaa850SRick Macklem printf("%9.9s %9.9s %9.9s\n", 776bcdaa850SRick Macklem "Retfailed", "Faults", "Clients"); 777bcdaa850SRick Macklem } 778693957f8SRick Macklem printf("%9ju %9ju %9ju\n", 779693957f8SRick Macklem (uintmax_t)ext_nfsstats.srv_errs, 780693957f8SRick Macklem (uintmax_t)ext_nfsstats.srvrpc_errs, 781693957f8SRick Macklem (uintmax_t)ext_nfsstats.srvclients); 782bcdaa850SRick Macklem if (printtitle) 783bcdaa850SRick Macklem printf("%9.9s %9.9s %9.9s %9.9s %9.9s \n", 784bcdaa850SRick Macklem "OpenOwner", "Opens", "LockOwner", 785bcdaa850SRick Macklem "Locks", "Delegs"); 786693957f8SRick Macklem printf("%9ju %9ju %9ju %9ju %9ju \n", 787693957f8SRick Macklem (uintmax_t)ext_nfsstats.srvopenowners, 788693957f8SRick Macklem (uintmax_t)ext_nfsstats.srvopens, 789693957f8SRick Macklem (uintmax_t)ext_nfsstats.srvlockowners, 790693957f8SRick Macklem (uintmax_t)ext_nfsstats.srvlocks, 791693957f8SRick Macklem (uintmax_t)ext_nfsstats.srvdelegates); 792bcdaa850SRick Macklem if (printtitle) { 793bcdaa850SRick Macklem printf("Server Cache Stats:\n"); 794bcdaa850SRick Macklem printf("%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n", 795bcdaa850SRick Macklem "Inprog", "Idem", "Non-idem", "Misses", 796bcdaa850SRick Macklem "CacheSize", "TCPPeak"); 797bcdaa850SRick Macklem } 798693957f8SRick Macklem printf("%9ju %9ju %9ju %9ju %9ju %9ju\n", 799693957f8SRick Macklem (uintmax_t)ext_nfsstats.srvcache_inproghits, 800693957f8SRick Macklem (uintmax_t)ext_nfsstats.srvcache_idemdonehits, 801693957f8SRick Macklem (uintmax_t)ext_nfsstats.srvcache_nonidemdonehits, 802693957f8SRick Macklem (uintmax_t)ext_nfsstats.srvcache_misses, 803693957f8SRick Macklem (uintmax_t)ext_nfsstats.srvcache_size, 804693957f8SRick Macklem (uintmax_t)ext_nfsstats.srvcache_tcppeak); 805bcdaa850SRick Macklem } 806bcdaa850SRick Macklem } 807bcdaa850SRick Macklem 808*0744a2b0SRick Macklem /* 809*0744a2b0SRick Macklem * Print a description of the nfs stats for the client/server, 810*0744a2b0SRick Macklem * including NFSv4.1. 811*0744a2b0SRick Macklem */ 812*0744a2b0SRick Macklem static void 813*0744a2b0SRick Macklem exp41_intpr(int clientOnly, int serverOnly) 814*0744a2b0SRick Macklem { 815*0744a2b0SRick Macklem int nfssvc_flag; 816*0744a2b0SRick Macklem 817*0744a2b0SRick Macklem nfssvc_flag = NFSSVC_GETSTATS | NFSSVC_NEWSTRUCT; 818*0744a2b0SRick Macklem if (zflag != 0) { 819*0744a2b0SRick Macklem if (clientOnly != 0) 820*0744a2b0SRick Macklem nfssvc_flag |= NFSSVC_ZEROCLTSTATS; 821*0744a2b0SRick Macklem if (serverOnly != 0) 822*0744a2b0SRick Macklem nfssvc_flag |= NFSSVC_ZEROSRVSTATS; 823*0744a2b0SRick Macklem } 824*0744a2b0SRick Macklem ext_nfsstats.vers = NFSSTATS_V1; 825*0744a2b0SRick Macklem if (nfssvc(nfssvc_flag, &ext_nfsstats) < 0) 826*0744a2b0SRick Macklem err(1, "Can't get stats"); 827*0744a2b0SRick Macklem if (clientOnly != 0) { 828*0744a2b0SRick Macklem if (printtitle) { 829*0744a2b0SRick Macklem printf("Client Info:\n"); 830*0744a2b0SRick Macklem printf("RPC Counts:\n"); 831*0744a2b0SRick Macklem printf( 832*0744a2b0SRick Macklem "%12.12s %12.12s %12.12s %12.12s %12.12s %12.12s\n", 833*0744a2b0SRick Macklem "Getattr", "Setattr", "Lookup", "Readlink", "Read", 834*0744a2b0SRick Macklem "Write"); 835*0744a2b0SRick Macklem } 836*0744a2b0SRick Macklem printf("%12ju %12ju %12ju %12ju %12ju %12ju\n", 837*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_GETATTR], 838*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_SETATTR], 839*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_LOOKUP], 840*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_READLINK], 841*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_READ], 842*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_WRITE]); 843*0744a2b0SRick Macklem if (printtitle) 844*0744a2b0SRick Macklem printf( 845*0744a2b0SRick Macklem "%12.12s %12.12s %12.12s %12.12s %12.12s %12.12s\n", 846*0744a2b0SRick Macklem "Create", "Remove", "Rename", "Link", "Symlink", 847*0744a2b0SRick Macklem "Mkdir"); 848*0744a2b0SRick Macklem printf("%12ju %12ju %12ju %12ju %12ju %12ju\n", 849*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_CREATE], 850*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_REMOVE], 851*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_RENAME], 852*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_LINK], 853*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_SYMLINK], 854*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_MKDIR]); 855*0744a2b0SRick Macklem if (printtitle) 856*0744a2b0SRick Macklem printf( 857*0744a2b0SRick Macklem "%12.12s %12.12s %12.12s %12.12s %12.12s %12.12s\n", 858*0744a2b0SRick Macklem "Rmdir", "Readdir", "RdirPlus", "Access", "Mknod", 859*0744a2b0SRick Macklem "Fsstat"); 860*0744a2b0SRick Macklem printf("%12ju %12ju %12ju %12ju %12ju %12ju\n", 861*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_RMDIR], 862*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_READDIR], 863*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_READDIRPLUS], 864*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_ACCESS], 865*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_MKNOD], 866*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_FSSTAT]); 867*0744a2b0SRick Macklem if (printtitle) 868*0744a2b0SRick Macklem printf( 869*0744a2b0SRick Macklem "%12.12s %12.12s %12.12s %12.12s %12.12s %12.12s\n", 870*0744a2b0SRick Macklem "Fsinfo", "PathConf", "Commit", "SetClId", 871*0744a2b0SRick Macklem "SetClIdCf", "Lock"); 872*0744a2b0SRick Macklem printf("%12ju %12ju %12ju %12ju %12ju %12ju\n", 873*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_FSINFO], 874*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_PATHCONF], 875*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_COMMIT], 876*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_SETCLIENTID], 877*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_SETCLIENTIDCFRM], 878*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_LOCK]); 879*0744a2b0SRick Macklem if (printtitle) 880*0744a2b0SRick Macklem printf( 881*0744a2b0SRick Macklem "%12.12s %12.12s %12.12s %12.12s %12.12s %12.12s\n", 882*0744a2b0SRick Macklem "LockT", "LockU", "Open", "OpenCfr", "OpenDownGr", 883*0744a2b0SRick Macklem "Close"); 884*0744a2b0SRick Macklem printf("%12ju %12ju %12ju %12ju %12ju %12ju\n", 885*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_LOCKT], 886*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_LOCKU], 887*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_OPEN], 888*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_OPENCONFIRM], 889*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_OPENDOWNGRADE], 890*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_CLOSE]); 891*0744a2b0SRick Macklem if (printtitle) 892*0744a2b0SRick Macklem printf( 893*0744a2b0SRick Macklem "%12.12s %12.12s %12.12s %12.12s %12.12s %12.12s\n", 894*0744a2b0SRick Macklem "RelLckOwn", "FreeStateID", "PutRootFH", "DelegRet", 895*0744a2b0SRick Macklem "GetACL", "SetACL"); 896*0744a2b0SRick Macklem printf("%12ju %12ju %12ju %12ju %12ju %12ju\n", 897*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_RELEASELCKOWN], 898*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_FREESTATEID], 899*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_PUTROOTFH], 900*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_DELEGRETURN], 901*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_GETACL], 902*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_SETACL]); 903*0744a2b0SRick Macklem if (printtitle) 904*0744a2b0SRick Macklem printf( 905*0744a2b0SRick Macklem "%12.12s %12.12s %12.12s %12.12s %12.12s %12.12s\n", 906*0744a2b0SRick Macklem "ExchangeID", "CreateSess", "DestroySess", 907*0744a2b0SRick Macklem "DestroyClId", "LayoutGet", "GetDevInfo"); 908*0744a2b0SRick Macklem printf("%12ju %12ju %12ju %12ju %12ju %12ju\n", 909*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_EXCHANGEID], 910*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_CREATESESSION], 911*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_DESTROYSESSION], 912*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_DESTROYCLIENT], 913*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_LAYOUTGET], 914*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_GETDEVICEINFO]); 915*0744a2b0SRick Macklem if (printtitle) 916*0744a2b0SRick Macklem printf( 917*0744a2b0SRick Macklem "%12.12s %12.12s %12.12s %12.12s %12.12s %12.12s\n", 918*0744a2b0SRick Macklem "LayoutCommit", "LayoutReturn", "ReclaimCompl", 919*0744a2b0SRick Macklem "ReadDataS", "WriteDataS", "CommitDataS"); 920*0744a2b0SRick Macklem printf("%12ju %12ju %12ju %12ju %12ju %12ju\n", 921*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_LAYOUTCOMMIT], 922*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_LAYOUTRETURN], 923*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_RECLAIMCOMPL], 924*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_READDS], 925*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_WRITEDS], 926*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_COMMITDS]); 927*0744a2b0SRick Macklem if (printtitle) 928*0744a2b0SRick Macklem printf( 929*0744a2b0SRick Macklem "%12.12s %12.12s %12.12s %12.12s %12.12s %12.12s\n", 930*0744a2b0SRick Macklem "OpenOwner", "Opens", "LockOwner", "Locks", 931*0744a2b0SRick Macklem "Delegs", "LocalOwn"); 932*0744a2b0SRick Macklem printf("%12ju %12ju %12ju %12ju %12ju %12ju\n", 933*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.clopenowners, 934*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.clopens, 935*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.cllockowners, 936*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.cllocks, 937*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.cldelegates, 938*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.cllocalopenowners); 939*0744a2b0SRick Macklem if (printtitle) 940*0744a2b0SRick Macklem printf("%12.12s %12.12s %12.12s\n", 941*0744a2b0SRick Macklem "LocalOpen", "LocalLOwn", "LocalLock"); 942*0744a2b0SRick Macklem printf("%12ju %12ju %12ju\n", 943*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.cllocalopens, 944*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.cllocallockowners, 945*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.cllocallocks); 946*0744a2b0SRick Macklem if (printtitle) { 947*0744a2b0SRick Macklem printf("Rpc Info:\n"); 948*0744a2b0SRick Macklem printf("%12.12s %12.12s %12.12s %12.12s %12.12s\n", 949*0744a2b0SRick Macklem "TimedOut", "Invalid", "X Replies", "Retries", 950*0744a2b0SRick Macklem "Requests"); 951*0744a2b0SRick Macklem } 952*0744a2b0SRick Macklem printf("%12ju %12ju %12ju %12ju %12ju\n", 953*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.rpctimeouts, 954*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.rpcinvalid, 955*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.rpcunexpected, 956*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.rpcretries, 957*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.rpcrequests); 958*0744a2b0SRick Macklem if (printtitle) { 959*0744a2b0SRick Macklem printf("Cache Info:\n"); 960*0744a2b0SRick Macklem printf("%12.12s %12.12s %12.12s %12.12s\n", 961*0744a2b0SRick Macklem "Attr Hits", "Misses", "Lkup Hits", "Misses"); 962*0744a2b0SRick Macklem } 963*0744a2b0SRick Macklem printf("%12ju %12ju %12ju %12ju\n", 964*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.attrcache_hits, 965*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.attrcache_misses, 966*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.lookupcache_hits, 967*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.lookupcache_misses); 968*0744a2b0SRick Macklem if (printtitle) 969*0744a2b0SRick Macklem printf("%12.12s %12.12s %12.12s %12.12s\n", 970*0744a2b0SRick Macklem "BioR Hits", "Misses", "BioW Hits", "Misses"); 971*0744a2b0SRick Macklem printf("%12ju %12ju %12ju %12ju\n", 972*0744a2b0SRick Macklem (uintmax_t)(ext_nfsstats.biocache_reads - 973*0744a2b0SRick Macklem ext_nfsstats.read_bios), 974*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.read_bios, 975*0744a2b0SRick Macklem (uintmax_t)(ext_nfsstats.biocache_writes - 976*0744a2b0SRick Macklem ext_nfsstats.write_bios), 977*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.write_bios); 978*0744a2b0SRick Macklem if (printtitle) 979*0744a2b0SRick Macklem printf("%12.12s %12.12s %12.12s %12.12s\n", 980*0744a2b0SRick Macklem "BioRLHits", "Misses", "BioD Hits", "Misses"); 981*0744a2b0SRick Macklem printf("%12ju %12ju %12ju %12ju\n", 982*0744a2b0SRick Macklem (uintmax_t)(ext_nfsstats.biocache_readlinks - 983*0744a2b0SRick Macklem ext_nfsstats.readlink_bios), 984*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.readlink_bios, 985*0744a2b0SRick Macklem (uintmax_t)(ext_nfsstats.biocache_readdirs - 986*0744a2b0SRick Macklem ext_nfsstats.readdir_bios), 987*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.readdir_bios); 988*0744a2b0SRick Macklem if (printtitle) 989*0744a2b0SRick Macklem printf("%12.12s %12.12s\n", "DirE Hits", "Misses"); 990*0744a2b0SRick Macklem printf("%12ju %12ju\n", 991*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.direofcache_hits, 992*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.direofcache_misses); 993*0744a2b0SRick Macklem } 994*0744a2b0SRick Macklem if (serverOnly != 0) { 995*0744a2b0SRick Macklem if (printtitle) { 996*0744a2b0SRick Macklem printf("\nServer Info:\n"); 997*0744a2b0SRick Macklem printf( 998*0744a2b0SRick Macklem "%12.12s %12.12s %12.12s %12.12s %12.12s %12.12s\n", 999*0744a2b0SRick Macklem "Getattr", "Setattr", "Lookup", "Readlink", 1000*0744a2b0SRick Macklem "Read", "Write"); 1001*0744a2b0SRick Macklem } 1002*0744a2b0SRick Macklem printf("%12ju %12ju %12ju %12ju %12ju %12ju\n", 1003*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_GETATTR], 1004*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_SETATTR], 1005*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_LOOKUP], 1006*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_READLINK], 1007*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_READ], 1008*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_WRITE]); 1009*0744a2b0SRick Macklem if (printtitle) 1010*0744a2b0SRick Macklem printf( 1011*0744a2b0SRick Macklem "%12.12s %12.12s %12.12s %12.12s %12.12s %12.12s\n", 1012*0744a2b0SRick Macklem "Create", "Remove", "Rename", "Link", "Symlink", 1013*0744a2b0SRick Macklem "Mkdir"); 1014*0744a2b0SRick Macklem printf("%12ju %12ju %12ju %12ju %12ju %12ju\n", 1015*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_V3CREATE], 1016*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_REMOVE], 1017*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_RENAME], 1018*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_LINK], 1019*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_SYMLINK], 1020*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_MKDIR]); 1021*0744a2b0SRick Macklem if (printtitle) 1022*0744a2b0SRick Macklem printf( 1023*0744a2b0SRick Macklem "%12.12s %12.12s %12.12s %12.12s %12.12s %12.12s\n", 1024*0744a2b0SRick Macklem "Rmdir", "Readdir", "RdirPlus", "Access", "Mknod", 1025*0744a2b0SRick Macklem "Fsstat"); 1026*0744a2b0SRick Macklem printf("%12ju %12ju %12ju %12ju %12ju %12ju\n", 1027*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_RMDIR], 1028*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_READDIR], 1029*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_READDIRPLUS], 1030*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_ACCESS], 1031*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_MKNOD], 1032*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_FSSTAT]); 1033*0744a2b0SRick Macklem if (printtitle) 1034*0744a2b0SRick Macklem printf( 1035*0744a2b0SRick Macklem "%12.12s %12.12s %12.12s %12.12s %12.12s %12.12s\n", 1036*0744a2b0SRick Macklem "Fsinfo", "PathConf", "Commit", "LookupP", 1037*0744a2b0SRick Macklem "SetClId", "SetClIdCf"); 1038*0744a2b0SRick Macklem printf("%12ju %12ju %12ju %12ju %12ju %12ju\n", 1039*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_FSINFO], 1040*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_PATHCONF], 1041*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_COMMIT], 1042*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_LOOKUPP], 1043*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_SETCLIENTID], 1044*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_SETCLIENTIDCFRM]); 1045*0744a2b0SRick Macklem if (printtitle) 1046*0744a2b0SRick Macklem printf( 1047*0744a2b0SRick Macklem "%12.12s %12.12s %12.12s %12.12s %12.12s %12.12s\n", 1048*0744a2b0SRick Macklem "Open", "OpenAttr", "OpenDwnGr", "OpenCfrm", 1049*0744a2b0SRick Macklem "DelePurge", "DeleRet"); 1050*0744a2b0SRick Macklem printf("%12ju %12ju %12ju %12ju %12ju %12ju\n", 1051*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_OPEN], 1052*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_OPENATTR], 1053*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_OPENDOWNGRADE], 1054*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_OPENCONFIRM], 1055*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_DELEGPURGE], 1056*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_DELEGRETURN]); 1057*0744a2b0SRick Macklem if (printtitle) 1058*0744a2b0SRick Macklem printf( 1059*0744a2b0SRick Macklem "%12.12s %12.12s %12.12s %12.12s %12.12s %12.12s\n", 1060*0744a2b0SRick Macklem "GetFH", "Lock", "LockT", "LockU", "Close", 1061*0744a2b0SRick Macklem "Verify"); 1062*0744a2b0SRick Macklem printf("%12ju %12ju %12ju %12ju %12ju %12ju\n", 1063*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_GETFH], 1064*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_LOCK], 1065*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_LOCKT], 1066*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_LOCKU], 1067*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_CLOSE], 1068*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_VERIFY]); 1069*0744a2b0SRick Macklem if (printtitle) 1070*0744a2b0SRick Macklem printf( 1071*0744a2b0SRick Macklem "%12.12s %12.12s %12.12s %12.12s %12.12s %12.12s\n", 1072*0744a2b0SRick Macklem "NVerify", "PutFH", "PutPubFH", "PutRootFH", 1073*0744a2b0SRick Macklem "Renew", "RestoreFH"); 1074*0744a2b0SRick Macklem printf("%12ju %12ju %12ju %12ju %12ju %12ju\n", 1075*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_NVERIFY], 1076*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_PUTFH], 1077*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_PUTPUBFH], 1078*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_PUTROOTFH], 1079*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_RENEW], 1080*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_RESTOREFH]); 1081*0744a2b0SRick Macklem if (printtitle) 1082*0744a2b0SRick Macklem printf( 1083*0744a2b0SRick Macklem "%12.12s %12.12s %12.12s %12.12s %12.12s %12.12s\n", 1084*0744a2b0SRick Macklem "SaveFH", "Secinfo", "RelLckOwn", "V4Create", 1085*0744a2b0SRick Macklem "BackChannelCtrl", "BindConnToSess"); 1086*0744a2b0SRick Macklem printf("%12ju %12ju %12ju %12ju %12ju %12ju\n", 1087*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_SAVEFH], 1088*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_SECINFO], 1089*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_RELEASELCKOWN], 1090*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_CREATE], 1091*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_BACKCHANNELCTL], 1092*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_BINDCONNTOSESS]); 1093*0744a2b0SRick Macklem if (printtitle) 1094*0744a2b0SRick Macklem printf( 1095*0744a2b0SRick Macklem "%12.12s %12.12s %12.12s %12.12s %12.12s %12.12s\n", 1096*0744a2b0SRick Macklem "ExchangeID", "CreateSess", "DestroySess", 1097*0744a2b0SRick Macklem "FreeStateID", "GetDirDeleg", "GetDevInfo"); 1098*0744a2b0SRick Macklem printf("%12ju %12ju %12ju %12ju %12ju %12ju\n", 1099*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_EXCHANGEID], 1100*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_CREATESESSION], 1101*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_DESTROYSESSION], 1102*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_FREESTATEID], 1103*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_GETDIRDELEG], 1104*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_GETDEVINFO]); 1105*0744a2b0SRick Macklem if (printtitle) 1106*0744a2b0SRick Macklem printf( 1107*0744a2b0SRick Macklem "%12.12s %12.12s %12.12s %12.12s %12.12s %12.12s\n", 1108*0744a2b0SRick Macklem "GetDevList", "LayoutCommit", "LayoutGet", 1109*0744a2b0SRick Macklem "LayoutReturn", "SecInfNoName", "Sequence"); 1110*0744a2b0SRick Macklem printf("%12ju %12ju %12ju %12ju %12ju %12ju\n", 1111*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_GETDEVLIST], 1112*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_LAYOUTCOMMIT], 1113*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_LAYOUTGET], 1114*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_LAYOUTRETURN], 1115*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_SECINFONONAME], 1116*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_SEQUENCE]); 1117*0744a2b0SRick Macklem if (printtitle) 1118*0744a2b0SRick Macklem printf( 1119*0744a2b0SRick Macklem "%12.12s %12.12s %12.12s %12.12s %12.12s\n", 1120*0744a2b0SRick Macklem "SetSSV", "TestStateID", "WantDeleg", 1121*0744a2b0SRick Macklem "DestroyClID", "ReclaimCompl"); 1122*0744a2b0SRick Macklem printf("%12ju %12ju %12ju %12ju %12ju\n", 1123*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_SETSSV], 1124*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_TESTSTATEID], 1125*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_WANTDELEG], 1126*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_DESTROYCLIENTID], 1127*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_RECLAIMCOMPL]); 1128*0744a2b0SRick Macklem if (printtitle) { 1129*0744a2b0SRick Macklem printf("Server:\n"); 1130*0744a2b0SRick Macklem printf("%12.12s %12.12s %12.12s\n", 1131*0744a2b0SRick Macklem "Retfailed", "Faults", "Clients"); 1132*0744a2b0SRick Macklem } 1133*0744a2b0SRick Macklem printf("%12ju %12ju %12ju\n", 1134*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.srv_errs, 1135*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.srvrpc_errs, 1136*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.srvclients); 1137*0744a2b0SRick Macklem if (printtitle) 1138*0744a2b0SRick Macklem printf("%12.12s %12.12s %12.12s %12.12s %12.12s\n", 1139*0744a2b0SRick Macklem "OpenOwner", "Opens", "LockOwner", 1140*0744a2b0SRick Macklem "Locks", "Delegs"); 1141*0744a2b0SRick Macklem printf("%12ju %12ju %12ju %12ju %12ju\n", 1142*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.srvopenowners, 1143*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.srvopens, 1144*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.srvlockowners, 1145*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.srvlocks, 1146*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.srvdelegates); 1147*0744a2b0SRick Macklem if (printtitle) { 1148*0744a2b0SRick Macklem printf("Server Cache Stats:\n"); 1149*0744a2b0SRick Macklem printf( 1150*0744a2b0SRick Macklem "%12.12s %12.12s %12.12s %12.12s %12.12s %12.12s\n", 1151*0744a2b0SRick Macklem "Inprog", "Idem", "Non-idem", "Misses", 1152*0744a2b0SRick Macklem "CacheSize", "TCPPeak"); 1153*0744a2b0SRick Macklem } 1154*0744a2b0SRick Macklem printf("%12ju %12ju %12ju %12ju %12ju %12ju\n", 1155*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.srvcache_inproghits, 1156*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.srvcache_idemdonehits, 1157*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.srvcache_nonidemdonehits, 1158*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.srvcache_misses, 1159*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.srvcache_size, 1160*0744a2b0SRick Macklem (uintmax_t)ext_nfsstats.srvcache_tcppeak); 1161*0744a2b0SRick Macklem } 1162*0744a2b0SRick Macklem } 1163*0744a2b0SRick Macklem 1164693957f8SRick Macklem static void 1165693957f8SRick Macklem compute_totals(struct nfsstatsv1 *total_stats, struct nfsstatsv1 *cur_stats) 1166693957f8SRick Macklem { 1167693957f8SRick Macklem int i; 1168693957f8SRick Macklem 1169693957f8SRick Macklem bzero(total_stats, sizeof(*total_stats)); 1170693957f8SRick Macklem for (i = 0; i < (NFSV42_NOPS + NFSV4OP_FAKENOPS); i++) { 1171693957f8SRick Macklem total_stats->srvbytes[0] += cur_stats->srvbytes[i]; 1172693957f8SRick Macklem total_stats->srvops[0] += cur_stats->srvops[i]; 1173693957f8SRick Macklem bintime_add(&total_stats->srvduration[0], 1174693957f8SRick Macklem &cur_stats->srvduration[i]); 1175693957f8SRick Macklem total_stats->srvrpccnt[i] = cur_stats->srvrpccnt[i]; 1176693957f8SRick Macklem } 1177693957f8SRick Macklem total_stats->srvstartcnt = cur_stats->srvstartcnt; 1178693957f8SRick Macklem total_stats->srvdonecnt = cur_stats->srvdonecnt; 1179693957f8SRick Macklem total_stats->busytime = cur_stats->busytime; 1180693957f8SRick Macklem 1181693957f8SRick Macklem } 1182693957f8SRick Macklem 1183bcdaa850SRick Macklem /* 1184bcdaa850SRick Macklem * Print a running summary of nfs statistics for the experimental client and/or 1185bcdaa850SRick Macklem * server. 1186bcdaa850SRick Macklem * Repeat display every interval seconds, showing statistics 1187bcdaa850SRick Macklem * collected over that interval. Assumes that interval is non-zero. 1188bcdaa850SRick Macklem * First line printed at top of screen is always cumulative. 1189bcdaa850SRick Macklem */ 1190722e2552SEdward Tomasz Napierala static void 1191693957f8SRick Macklem exp_sidewaysintpr(u_int interval, int clientOnly, int serverOnly, 1192693957f8SRick Macklem int newStats) 1193bcdaa850SRick Macklem { 1194693957f8SRick Macklem struct nfsstatsv1 nfsstats, lastst, *ext_nfsstatsp; 1195693957f8SRick Macklem struct nfsstatsv1 curtotal, lasttotal; 1196693957f8SRick Macklem struct timespec ts, lastts; 1197bcdaa850SRick Macklem int hdrcnt = 1; 1198bcdaa850SRick Macklem 1199bcdaa850SRick Macklem ext_nfsstatsp = &lastst; 1200693957f8SRick Macklem ext_nfsstatsp->vers = NFSSTATS_V1; 1201693957f8SRick Macklem if (nfssvc(NFSSVC_GETSTATS | NFSSVC_NEWSTRUCT, ext_nfsstatsp) < 0) 1202bcdaa850SRick Macklem err(1, "Can't get stats"); 1203693957f8SRick Macklem clock_gettime(CLOCK_MONOTONIC, &lastts); 1204693957f8SRick Macklem compute_totals(&lasttotal, ext_nfsstatsp); 1205bcdaa850SRick Macklem sleep(interval); 1206bcdaa850SRick Macklem 1207bcdaa850SRick Macklem for (;;) { 1208bcdaa850SRick Macklem ext_nfsstatsp = &nfsstats; 1209693957f8SRick Macklem ext_nfsstatsp->vers = NFSSTATS_V1; 1210693957f8SRick Macklem if (nfssvc(NFSSVC_GETSTATS | NFSSVC_NEWSTRUCT, ext_nfsstatsp) 1211693957f8SRick Macklem < 0) 1212bcdaa850SRick Macklem err(1, "Can't get stats"); 1213693957f8SRick Macklem clock_gettime(CLOCK_MONOTONIC, &ts); 1214bcdaa850SRick Macklem 1215bcdaa850SRick Macklem if (--hdrcnt == 0) { 1216693957f8SRick Macklem printhdr(clientOnly, serverOnly, newStats); 1217693957f8SRick Macklem if (newStats) 1218693957f8SRick Macklem hdrcnt = 20; 1219693957f8SRick Macklem else if (clientOnly && serverOnly) 1220bcdaa850SRick Macklem hdrcnt = 10; 1221bcdaa850SRick Macklem else 1222bcdaa850SRick Macklem hdrcnt = 20; 1223bcdaa850SRick Macklem } 1224693957f8SRick Macklem if (clientOnly && newStats == 0) { 1225693957f8SRick Macklem printf("%s %6ju %6ju %6ju %6ju %6ju %6ju %6ju %6ju", 1226bcdaa850SRick Macklem ((clientOnly && serverOnly) ? "Client:" : ""), 1227693957f8SRick Macklem (uintmax_t)DELTA(rpccnt[NFSPROC_GETATTR]), 1228693957f8SRick Macklem (uintmax_t)DELTA(rpccnt[NFSPROC_LOOKUP]), 1229693957f8SRick Macklem (uintmax_t)DELTA(rpccnt[NFSPROC_READLINK]), 1230693957f8SRick Macklem (uintmax_t)DELTA(rpccnt[NFSPROC_READ]), 1231693957f8SRick Macklem (uintmax_t)DELTA(rpccnt[NFSPROC_WRITE]), 1232693957f8SRick Macklem (uintmax_t)DELTA(rpccnt[NFSPROC_RENAME]), 1233693957f8SRick Macklem (uintmax_t)DELTA(rpccnt[NFSPROC_ACCESS]), 1234693957f8SRick Macklem (uintmax_t)(DELTA(rpccnt[NFSPROC_READDIR]) + 1235693957f8SRick Macklem DELTA(rpccnt[NFSPROC_READDIRPLUS])) 1236bcdaa850SRick Macklem ); 1237bcdaa850SRick Macklem if (widemode) { 1238bcdaa850SRick Macklem printf(" %s %s %s %s %s %s", 1239bcdaa850SRick Macklem sperc1(DELTA(attrcache_hits), 1240bcdaa850SRick Macklem DELTA(attrcache_misses)), 1241bcdaa850SRick Macklem sperc1(DELTA(lookupcache_hits), 1242bcdaa850SRick Macklem DELTA(lookupcache_misses)), 1243bcdaa850SRick Macklem sperc2(DELTA(biocache_reads), 1244bcdaa850SRick Macklem DELTA(read_bios)), 1245bcdaa850SRick Macklem sperc2(DELTA(biocache_writes), 1246bcdaa850SRick Macklem DELTA(write_bios)), 1247bcdaa850SRick Macklem sperc1(DELTA(accesscache_hits), 1248bcdaa850SRick Macklem DELTA(accesscache_misses)), 1249bcdaa850SRick Macklem sperc2(DELTA(biocache_readdirs), 1250bcdaa850SRick Macklem DELTA(readdir_bios)) 1251bcdaa850SRick Macklem ); 1252bcdaa850SRick Macklem } 1253bcdaa850SRick Macklem printf("\n"); 1254bcdaa850SRick Macklem } 1255693957f8SRick Macklem 1256693957f8SRick Macklem if (serverOnly && newStats) { 1257693957f8SRick Macklem long double cur_secs, last_secs, etime; 1258693957f8SRick Macklem long double mbsec; 1259693957f8SRick Macklem long double kb_per_transfer; 1260693957f8SRick Macklem long double transfers_per_second; 1261693957f8SRick Macklem long double ms_per_transfer; 1262693957f8SRick Macklem uint64_t queue_len; 1263693957f8SRick Macklem long double busy_pct; 1264693957f8SRick Macklem int i; 1265693957f8SRick Macklem 1266693957f8SRick Macklem cur_secs = ts.tv_sec + 1267693957f8SRick Macklem ((long double)ts.tv_nsec / 1000000000); 1268693957f8SRick Macklem last_secs = lastts.tv_sec + 1269693957f8SRick Macklem ((long double)lastts.tv_nsec / 1000000000); 1270693957f8SRick Macklem etime = cur_secs - last_secs; 1271693957f8SRick Macklem 1272693957f8SRick Macklem compute_totals(&curtotal, &nfsstats); 1273693957f8SRick Macklem 1274693957f8SRick Macklem for (i = 0; i < NUM_STAT_TYPES; i++) { 1275693957f8SRick Macklem compute_new_stats(&nfsstats, &lastst, 1276693957f8SRick Macklem STAT_TYPE_TO_NFS(i), etime, &mbsec, 1277693957f8SRick Macklem &kb_per_transfer, 1278693957f8SRick Macklem &transfers_per_second, 1279693957f8SRick Macklem &ms_per_transfer, &queue_len, 1280693957f8SRick Macklem &busy_pct); 1281693957f8SRick Macklem 1282693957f8SRick Macklem if (i == STAT_TYPE_COMMIT) { 1283693957f8SRick Macklem if (widemode == 0) 1284693957f8SRick Macklem continue; 1285693957f8SRick Macklem 1286693957f8SRick Macklem printf("%2.0Lf %7.2Lf ", 1287693957f8SRick Macklem transfers_per_second, 1288693957f8SRick Macklem ms_per_transfer); 1289693957f8SRick Macklem } else { 1290693957f8SRick Macklem printf("%5.2Lf %5.0Lf %7.2Lf ", 1291693957f8SRick Macklem kb_per_transfer, 1292693957f8SRick Macklem transfers_per_second, mbsec); 1293693957f8SRick Macklem if (widemode) 1294693957f8SRick Macklem printf("%5.2Lf ", 1295693957f8SRick Macklem ms_per_transfer); 1296693957f8SRick Macklem } 1297693957f8SRick Macklem } 1298693957f8SRick Macklem 1299693957f8SRick Macklem compute_new_stats(&curtotal, &lasttotal, 0, etime, 1300693957f8SRick Macklem &mbsec, &kb_per_transfer, &transfers_per_second, 1301693957f8SRick Macklem &ms_per_transfer, &queue_len, &busy_pct); 1302693957f8SRick Macklem 1303693957f8SRick Macklem printf("%5.2Lf %5.0Lf %7.2Lf %5.2Lf %3ju %3.0Lf\n", 1304693957f8SRick Macklem kb_per_transfer, transfers_per_second, mbsec, 1305693957f8SRick Macklem ms_per_transfer, queue_len, busy_pct); 1306693957f8SRick Macklem } else if (serverOnly) { 1307693957f8SRick Macklem printf("%s %6ju %6ju %6ju %6ju %6ju %6ju %6ju %6ju", 1308bcdaa850SRick Macklem ((clientOnly && serverOnly) ? "Server:" : ""), 1309693957f8SRick Macklem (uintmax_t)DELTA(srvrpccnt[NFSV4OP_GETATTR]), 1310693957f8SRick Macklem (uintmax_t)DELTA(srvrpccnt[NFSV4OP_LOOKUP]), 1311693957f8SRick Macklem (uintmax_t)DELTA(srvrpccnt[NFSV4OP_READLINK]), 1312693957f8SRick Macklem (uintmax_t)DELTA(srvrpccnt[NFSV4OP_READ]), 1313693957f8SRick Macklem (uintmax_t)DELTA(srvrpccnt[NFSV4OP_WRITE]), 1314693957f8SRick Macklem (uintmax_t)DELTA(srvrpccnt[NFSV4OP_RENAME]), 1315693957f8SRick Macklem (uintmax_t)DELTA(srvrpccnt[NFSV4OP_ACCESS]), 1316693957f8SRick Macklem (uintmax_t)(DELTA(srvrpccnt[NFSV4OP_READDIR]) + 1317693957f8SRick Macklem DELTA(srvrpccnt[NFSV4OP_READDIRPLUS]))); 1318bcdaa850SRick Macklem printf("\n"); 1319bcdaa850SRick Macklem } 1320693957f8SRick Macklem bcopy(&nfsstats, &lastst, sizeof(lastst)); 1321693957f8SRick Macklem bcopy(&curtotal, &lasttotal, sizeof(lasttotal)); 1322693957f8SRick Macklem lastts = ts; 1323bcdaa850SRick Macklem fflush(stdout); 1324bcdaa850SRick Macklem sleep(interval); 1325bcdaa850SRick Macklem } 1326bcdaa850SRick Macklem /*NOTREACHED*/ 1327bcdaa850SRick Macklem } 1328