Index: head/usr.bin/nfsstat/nfsstat.c =================================================================== --- head/usr.bin/nfsstat/nfsstat.c +++ head/usr.bin/nfsstat/nfsstat.c @@ -113,6 +113,7 @@ static char *sperc1(int, int); static char *sperc2(int, int); static void exp_intpr(int, int); +static void exp41_intpr(int, int); static void exp_sidewaysintpr(u_int, int, int, int); static void compute_new_stats(struct nfsstatsv1 *cur_stats, struct nfsstatsv1 *prev_stats, int curop, long double etime, @@ -155,7 +156,7 @@ interval = 0; memf = nlistf = NULL; - while ((ch = getopt(argc, argv, "cdesWM:mN:w:z")) != -1) + while ((ch = getopt(argc, argv, "cdEesWM:mN:w:z")) != -1) switch(ch) { case 'M': memf = optarg; @@ -208,7 +209,14 @@ case 'z': zflag = 1; break; + case 'E': + if (extra_output != 0) + errx(1, "-e and -E are mutually exclusive"); + extra_output = 2; + break; case 'e': + if (extra_output != 0) + errx(1, "-e and -E are mutually exclusive"); extra_output = 1; break; case '?': @@ -236,7 +244,9 @@ exp_sidewaysintpr(interval, clientOnly, serverOnly, newStats); } else { - if (extra_output != 0) + if (extra_output == 2) + exp41_intpr(clientOnly, serverOnly); + else if (extra_output == 1) exp_intpr(clientOnly, serverOnly); else intpr(clientOnly, serverOnly); @@ -795,6 +805,362 @@ } } +/* + * Print a description of the nfs stats for the client/server, + * including NFSv4.1. + */ +static void +exp41_intpr(int clientOnly, int serverOnly) +{ + int nfssvc_flag; + + nfssvc_flag = NFSSVC_GETSTATS | NFSSVC_NEWSTRUCT; + if (zflag != 0) { + if (clientOnly != 0) + nfssvc_flag |= NFSSVC_ZEROCLTSTATS; + if (serverOnly != 0) + nfssvc_flag |= NFSSVC_ZEROSRVSTATS; + } + ext_nfsstats.vers = NFSSTATS_V1; + if (nfssvc(nfssvc_flag, &ext_nfsstats) < 0) + err(1, "Can't get stats"); + if (clientOnly != 0) { + if (printtitle) { + printf("Client Info:\n"); + printf("RPC Counts:\n"); + printf( + "%12.12s %12.12s %12.12s %12.12s %12.12s %12.12s\n", + "Getattr", "Setattr", "Lookup", "Readlink", "Read", + "Write"); + } + printf("%12ju %12ju %12ju %12ju %12ju %12ju\n", + (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_GETATTR], + (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_SETATTR], + (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_LOOKUP], + (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_READLINK], + (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_READ], + (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_WRITE]); + if (printtitle) + printf( + "%12.12s %12.12s %12.12s %12.12s %12.12s %12.12s\n", + "Create", "Remove", "Rename", "Link", "Symlink", + "Mkdir"); + printf("%12ju %12ju %12ju %12ju %12ju %12ju\n", + (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_CREATE], + (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_REMOVE], + (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_RENAME], + (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_LINK], + (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_SYMLINK], + (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_MKDIR]); + if (printtitle) + printf( + "%12.12s %12.12s %12.12s %12.12s %12.12s %12.12s\n", + "Rmdir", "Readdir", "RdirPlus", "Access", "Mknod", + "Fsstat"); + printf("%12ju %12ju %12ju %12ju %12ju %12ju\n", + (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_RMDIR], + (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_READDIR], + (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_READDIRPLUS], + (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_ACCESS], + (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_MKNOD], + (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_FSSTAT]); + if (printtitle) + printf( + "%12.12s %12.12s %12.12s %12.12s %12.12s %12.12s\n", + "Fsinfo", "PathConf", "Commit", "SetClId", + "SetClIdCf", "Lock"); + printf("%12ju %12ju %12ju %12ju %12ju %12ju\n", + (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_FSINFO], + (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_PATHCONF], + (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_COMMIT], + (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_SETCLIENTID], + (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_SETCLIENTIDCFRM], + (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_LOCK]); + if (printtitle) + printf( + "%12.12s %12.12s %12.12s %12.12s %12.12s %12.12s\n", + "LockT", "LockU", "Open", "OpenCfr", "OpenDownGr", + "Close"); + printf("%12ju %12ju %12ju %12ju %12ju %12ju\n", + (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_LOCKT], + (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_LOCKU], + (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_OPEN], + (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_OPENCONFIRM], + (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_OPENDOWNGRADE], + (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_CLOSE]); + if (printtitle) + printf( + "%12.12s %12.12s %12.12s %12.12s %12.12s %12.12s\n", + "RelLckOwn", "FreeStateID", "PutRootFH", "DelegRet", + "GetACL", "SetACL"); + printf("%12ju %12ju %12ju %12ju %12ju %12ju\n", + (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_RELEASELCKOWN], + (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_FREESTATEID], + (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_PUTROOTFH], + (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_DELEGRETURN], + (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_GETACL], + (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_SETACL]); + if (printtitle) + printf( + "%12.12s %12.12s %12.12s %12.12s %12.12s %12.12s\n", + "ExchangeID", "CreateSess", "DestroySess", + "DestroyClId", "LayoutGet", "GetDevInfo"); + printf("%12ju %12ju %12ju %12ju %12ju %12ju\n", + (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_EXCHANGEID], + (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_CREATESESSION], + (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_DESTROYSESSION], + (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_DESTROYCLIENT], + (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_LAYOUTGET], + (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_GETDEVICEINFO]); + if (printtitle) + printf( + "%12.12s %12.12s %12.12s %12.12s %12.12s %12.12s\n", + "LayoutCommit", "LayoutReturn", "ReclaimCompl", + "ReadDataS", "WriteDataS", "CommitDataS"); + printf("%12ju %12ju %12ju %12ju %12ju %12ju\n", + (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_LAYOUTCOMMIT], + (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_LAYOUTRETURN], + (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_RECLAIMCOMPL], + (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_READDS], + (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_WRITEDS], + (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_COMMITDS]); + if (printtitle) + printf( + "%12.12s %12.12s %12.12s %12.12s %12.12s %12.12s\n", + "OpenOwner", "Opens", "LockOwner", "Locks", + "Delegs", "LocalOwn"); + printf("%12ju %12ju %12ju %12ju %12ju %12ju\n", + (uintmax_t)ext_nfsstats.clopenowners, + (uintmax_t)ext_nfsstats.clopens, + (uintmax_t)ext_nfsstats.cllockowners, + (uintmax_t)ext_nfsstats.cllocks, + (uintmax_t)ext_nfsstats.cldelegates, + (uintmax_t)ext_nfsstats.cllocalopenowners); + if (printtitle) + printf("%12.12s %12.12s %12.12s\n", + "LocalOpen", "LocalLOwn", "LocalLock"); + printf("%12ju %12ju %12ju\n", + (uintmax_t)ext_nfsstats.cllocalopens, + (uintmax_t)ext_nfsstats.cllocallockowners, + (uintmax_t)ext_nfsstats.cllocallocks); + if (printtitle) { + printf("Rpc Info:\n"); + printf("%12.12s %12.12s %12.12s %12.12s %12.12s\n", + "TimedOut", "Invalid", "X Replies", "Retries", + "Requests"); + } + printf("%12ju %12ju %12ju %12ju %12ju\n", + (uintmax_t)ext_nfsstats.rpctimeouts, + (uintmax_t)ext_nfsstats.rpcinvalid, + (uintmax_t)ext_nfsstats.rpcunexpected, + (uintmax_t)ext_nfsstats.rpcretries, + (uintmax_t)ext_nfsstats.rpcrequests); + if (printtitle) { + printf("Cache Info:\n"); + printf("%12.12s %12.12s %12.12s %12.12s\n", + "Attr Hits", "Misses", "Lkup Hits", "Misses"); + } + printf("%12ju %12ju %12ju %12ju\n", + (uintmax_t)ext_nfsstats.attrcache_hits, + (uintmax_t)ext_nfsstats.attrcache_misses, + (uintmax_t)ext_nfsstats.lookupcache_hits, + (uintmax_t)ext_nfsstats.lookupcache_misses); + if (printtitle) + printf("%12.12s %12.12s %12.12s %12.12s\n", + "BioR Hits", "Misses", "BioW Hits", "Misses"); + printf("%12ju %12ju %12ju %12ju\n", + (uintmax_t)(ext_nfsstats.biocache_reads - + ext_nfsstats.read_bios), + (uintmax_t)ext_nfsstats.read_bios, + (uintmax_t)(ext_nfsstats.biocache_writes - + ext_nfsstats.write_bios), + (uintmax_t)ext_nfsstats.write_bios); + if (printtitle) + printf("%12.12s %12.12s %12.12s %12.12s\n", + "BioRLHits", "Misses", "BioD Hits", "Misses"); + printf("%12ju %12ju %12ju %12ju\n", + (uintmax_t)(ext_nfsstats.biocache_readlinks - + ext_nfsstats.readlink_bios), + (uintmax_t)ext_nfsstats.readlink_bios, + (uintmax_t)(ext_nfsstats.biocache_readdirs - + ext_nfsstats.readdir_bios), + (uintmax_t)ext_nfsstats.readdir_bios); + if (printtitle) + printf("%12.12s %12.12s\n", "DirE Hits", "Misses"); + printf("%12ju %12ju\n", + (uintmax_t)ext_nfsstats.direofcache_hits, + (uintmax_t)ext_nfsstats.direofcache_misses); + } + if (serverOnly != 0) { + if (printtitle) { + printf("\nServer Info:\n"); + printf( + "%12.12s %12.12s %12.12s %12.12s %12.12s %12.12s\n", + "Getattr", "Setattr", "Lookup", "Readlink", + "Read", "Write"); + } + printf("%12ju %12ju %12ju %12ju %12ju %12ju\n", + (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_GETATTR], + (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_SETATTR], + (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_LOOKUP], + (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_READLINK], + (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_READ], + (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_WRITE]); + if (printtitle) + printf( + "%12.12s %12.12s %12.12s %12.12s %12.12s %12.12s\n", + "Create", "Remove", "Rename", "Link", "Symlink", + "Mkdir"); + printf("%12ju %12ju %12ju %12ju %12ju %12ju\n", + (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_V3CREATE], + (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_REMOVE], + (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_RENAME], + (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_LINK], + (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_SYMLINK], + (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_MKDIR]); + if (printtitle) + printf( + "%12.12s %12.12s %12.12s %12.12s %12.12s %12.12s\n", + "Rmdir", "Readdir", "RdirPlus", "Access", "Mknod", + "Fsstat"); + printf("%12ju %12ju %12ju %12ju %12ju %12ju\n", + (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_RMDIR], + (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_READDIR], + (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_READDIRPLUS], + (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_ACCESS], + (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_MKNOD], + (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_FSSTAT]); + if (printtitle) + printf( + "%12.12s %12.12s %12.12s %12.12s %12.12s %12.12s\n", + "Fsinfo", "PathConf", "Commit", "LookupP", + "SetClId", "SetClIdCf"); + printf("%12ju %12ju %12ju %12ju %12ju %12ju\n", + (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_FSINFO], + (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_PATHCONF], + (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_COMMIT], + (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_LOOKUPP], + (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_SETCLIENTID], + (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_SETCLIENTIDCFRM]); + if (printtitle) + printf( + "%12.12s %12.12s %12.12s %12.12s %12.12s %12.12s\n", + "Open", "OpenAttr", "OpenDwnGr", "OpenCfrm", + "DelePurge", "DeleRet"); + printf("%12ju %12ju %12ju %12ju %12ju %12ju\n", + (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_OPEN], + (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_OPENATTR], + (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_OPENDOWNGRADE], + (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_OPENCONFIRM], + (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_DELEGPURGE], + (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_DELEGRETURN]); + if (printtitle) + printf( + "%12.12s %12.12s %12.12s %12.12s %12.12s %12.12s\n", + "GetFH", "Lock", "LockT", "LockU", "Close", + "Verify"); + printf("%12ju %12ju %12ju %12ju %12ju %12ju\n", + (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_GETFH], + (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_LOCK], + (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_LOCKT], + (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_LOCKU], + (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_CLOSE], + (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_VERIFY]); + if (printtitle) + printf( + "%12.12s %12.12s %12.12s %12.12s %12.12s %12.12s\n", + "NVerify", "PutFH", "PutPubFH", "PutRootFH", + "Renew", "RestoreFH"); + printf("%12ju %12ju %12ju %12ju %12ju %12ju\n", + (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_NVERIFY], + (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_PUTFH], + (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_PUTPUBFH], + (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_PUTROOTFH], + (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_RENEW], + (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_RESTOREFH]); + if (printtitle) + printf( + "%12.12s %12.12s %12.12s %12.12s %12.12s %12.12s\n", + "SaveFH", "Secinfo", "RelLckOwn", "V4Create", + "BackChannelCtrl", "BindConnToSess"); + printf("%12ju %12ju %12ju %12ju %12ju %12ju\n", + (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_SAVEFH], + (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_SECINFO], + (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_RELEASELCKOWN], + (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_CREATE], + (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_BACKCHANNELCTL], + (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_BINDCONNTOSESS]); + if (printtitle) + printf( + "%12.12s %12.12s %12.12s %12.12s %12.12s %12.12s\n", + "ExchangeID", "CreateSess", "DestroySess", + "FreeStateID", "GetDirDeleg", "GetDevInfo"); + printf("%12ju %12ju %12ju %12ju %12ju %12ju\n", + (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_EXCHANGEID], + (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_CREATESESSION], + (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_DESTROYSESSION], + (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_FREESTATEID], + (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_GETDIRDELEG], + (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_GETDEVINFO]); + if (printtitle) + printf( + "%12.12s %12.12s %12.12s %12.12s %12.12s %12.12s\n", + "GetDevList", "LayoutCommit", "LayoutGet", + "LayoutReturn", "SecInfNoName", "Sequence"); + printf("%12ju %12ju %12ju %12ju %12ju %12ju\n", + (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_GETDEVLIST], + (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_LAYOUTCOMMIT], + (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_LAYOUTGET], + (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_LAYOUTRETURN], + (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_SECINFONONAME], + (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_SEQUENCE]); + if (printtitle) + printf( + "%12.12s %12.12s %12.12s %12.12s %12.12s\n", + "SetSSV", "TestStateID", "WantDeleg", + "DestroyClID", "ReclaimCompl"); + printf("%12ju %12ju %12ju %12ju %12ju\n", + (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_SETSSV], + (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_TESTSTATEID], + (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_WANTDELEG], + (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_DESTROYCLIENTID], + (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_RECLAIMCOMPL]); + if (printtitle) { + printf("Server:\n"); + printf("%12.12s %12.12s %12.12s\n", + "Retfailed", "Faults", "Clients"); + } + printf("%12ju %12ju %12ju\n", + (uintmax_t)ext_nfsstats.srv_errs, + (uintmax_t)ext_nfsstats.srvrpc_errs, + (uintmax_t)ext_nfsstats.srvclients); + if (printtitle) + printf("%12.12s %12.12s %12.12s %12.12s %12.12s\n", + "OpenOwner", "Opens", "LockOwner", + "Locks", "Delegs"); + printf("%12ju %12ju %12ju %12ju %12ju\n", + (uintmax_t)ext_nfsstats.srvopenowners, + (uintmax_t)ext_nfsstats.srvopens, + (uintmax_t)ext_nfsstats.srvlockowners, + (uintmax_t)ext_nfsstats.srvlocks, + (uintmax_t)ext_nfsstats.srvdelegates); + if (printtitle) { + printf("Server Cache Stats:\n"); + printf( + "%12.12s %12.12s %12.12s %12.12s %12.12s %12.12s\n", + "Inprog", "Idem", "Non-idem", "Misses", + "CacheSize", "TCPPeak"); + } + printf("%12ju %12ju %12ju %12ju %12ju %12ju\n", + (uintmax_t)ext_nfsstats.srvcache_inproghits, + (uintmax_t)ext_nfsstats.srvcache_idemdonehits, + (uintmax_t)ext_nfsstats.srvcache_nonidemdonehits, + (uintmax_t)ext_nfsstats.srvcache_misses, + (uintmax_t)ext_nfsstats.srvcache_size, + (uintmax_t)ext_nfsstats.srvcache_tcppeak); + } +} + static void compute_totals(struct nfsstatsv1 *total_stats, struct nfsstatsv1 *cur_stats) {