Add a -E flag to nfsstat.c so that it prints out the NFSv4.1

procedure/operation counts.
It also avoids clipping the counts at 9 digits.

Reviewed by:	bcr (doc parts)
MFC after:	2 weeks
Differential Revision:	https://reviews.freebsd.org/D8626
This commit is contained in:
Rick Macklem 2016-11-26 20:47:11 +00:00
parent babfcab670
commit 0744a2b00e
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=309197

View File

@ -113,6 +113,7 @@ static void usage(void);
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 @@ main(int argc, char **argv)
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 @@ main(int argc, char **argv)
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 @@ main(int argc, char **argv)
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 @@ exp_intpr(int clientOnly, int serverOnly)
}
}
/*
* 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)
{