X-Git-Url: https://git.decadent.org.uk/gitweb/?p=nfs-utils.git;a=blobdiff_plain;f=utils%2Fnfsstat%2Fnfsstat.c;h=70f8d103fa022ec893ddc21c5d87c524490f4b6e;hp=5adb571a7c6858b9e36f20a7e39ffd73def4c9f1;hb=014e00dfaea0efc92150e2aedc5ca43aa337545e;hpb=500fab45f73c0ba1bc442157ef3d7744f20e6b2a diff --git a/utils/nfsstat/nfsstat.c b/utils/nfsstat/nfsstat.c index 5adb571..70f8d10 100644 --- a/utils/nfsstat/nfsstat.c +++ b/utils/nfsstat/nfsstat.c @@ -25,13 +25,30 @@ #define MAXNRVALS 32 -static unsigned int srvproc2info[20], srvproc2info_old[20]; /* NFSv2 call counts ([0] == 18) */ -static unsigned int cltproc2info[20], cltproc2info_old[20]; /* NFSv2 call counts ([0] == 18) */ -static unsigned int srvproc3info[24], srvproc3info_old[24]; /* NFSv3 call counts ([0] == 22) */ -static unsigned int cltproc3info[24], cltproc3info_old[24]; /* NFSv3 call counts ([0] == 22) */ -static unsigned int srvproc4info[4], srvproc4info_old[4]; /* NFSv4 call counts ([0] == 2) */ -static unsigned int cltproc4info[37], cltproc4info_old[37]; /* NFSv4 call counts ([0] == 35) */ -static unsigned int srvproc4opsinfo[42], srvproc4opsinfo_old[42]; /* NFSv4 call counts ([0] == 40) */ +enum { + SRVPROC2_SZ = 18, + CLTPROC2_SZ = 18, + SRVPROC3_SZ = 22, + CLTPROC3_SZ = 22, + SRVPROC4_SZ = 2, + CLTPROC4_SZ = 49, + SRVPROC4OPS_SZ = 59, +}; + +static unsigned int srvproc2info[SRVPROC2_SZ+2], + srvproc2info_old[SRVPROC2_SZ+2]; /* NFSv2 call counts ([0] == 18) */ +static unsigned int cltproc2info[CLTPROC2_SZ+2], + cltproc2info_old[CLTPROC2_SZ+2]; /* NFSv2 call counts ([0] == 18) */ +static unsigned int srvproc3info[SRVPROC3_SZ+2], + srvproc3info_old[SRVPROC3_SZ+2]; /* NFSv3 call counts ([0] == 22) */ +static unsigned int cltproc3info[CLTPROC3_SZ+2], + cltproc3info_old[CLTPROC3_SZ+2]; /* NFSv3 call counts ([0] == 22) */ +static unsigned int srvproc4info[SRVPROC4_SZ+2], + srvproc4info_old[SRVPROC4_SZ+2]; /* NFSv4 call counts ([0] == 2) */ +static unsigned int cltproc4info[CLTPROC4_SZ+2], + cltproc4info_old[CLTPROC4_SZ+2]; /* NFSv4 call counts ([0] == 49) */ +static unsigned int srvproc4opsinfo[SRVPROC4OPS_SZ+2], + srvproc4opsinfo_old[SRVPROC4OPS_SZ+2]; /* NFSv4 call counts ([0] == 59) */ static unsigned int srvnetinfo[5], srvnetinfo_old[5]; /* 0 # of received packets * 1 UDP packets * 2 TCP packets @@ -75,42 +92,75 @@ static unsigned int srvfhinfo[7], srvfhinfo_old[7]; /* (for kernels >= 2.4.0) * compatability. */ -static const char * nfsv2name[18] = { +static const char * nfsv2name[SRVPROC2_SZ] = { "null", "getattr", "setattr", "root", "lookup", "readlink", "read", "wrcache", "write", "create", "remove", "rename", "link", "symlink", "mkdir", "rmdir", "readdir", "fsstat" }; -static const char * nfsv3name[22] = { +static const char * nfsv3name[SRVPROC3_SZ] = { "null", "getattr", "setattr", "lookup", "access", "readlink", "read", "write", "create", "mkdir", "symlink", "mknod", "remove", "rmdir", "rename", "link", "readdir", "readdirplus", "fsstat", "fsinfo", "pathconf", "commit" }; -static const char * nfssrvproc4name[2] = { +static const char * nfssrvproc4name[SRVPROC4_SZ] = { "null", "compound", }; -static const char * nfscltproc4name[35] = { +static const char * nfscltproc4name[CLTPROC4_SZ] = { "null", "read", "write", "commit", "open", "open_conf", "open_noat", "open_dgrd", "close", "setattr", "fsinfo", "renew", "setclntid", "confirm", "lock", "lockt", "locku", "access", "getattr", "lookup", "lookup_root", "remove", "rename", "link", "symlink", "create", "pathconf", "statfs", "readlink", "readdir", "server_caps", "delegreturn", "getacl", - "setacl", "fs_locations" + "setacl", "fs_locations", + "rel_lkowner", "secinfo", + /* nfsv4.1 client ops */ + "exchange_id", + "create_ses", + "destroy_ses", + "sequence", + "get_lease_t", + "reclaim_comp", + "layoutget", + "getdevinfo", + "layoutcommit", + "layoutreturn", + "getdevlist", }; -static const char * nfssrvproc4opname[40] = { +static const char * nfssrvproc4opname[SRVPROC4OPS_SZ] = { "op0-unused", "op1-unused", "op2-future", "access", "close", "commit", "create", "delegpurge", "delegreturn", "getattr", "getfh", "link", "lock", "lockt", "locku", "lookup", "lookup_root", "nverify", "open", "openattr", "open_conf", "open_dgrd", "putfh", "putpubfh", "putrootfh", "read", "readdir", "readlink", "remove", "rename", "renew", "restorefh", "savefh", "secinfo", "setattr", "setcltid", - "setcltidconf", "verify", "write", "rellockowner" + "setcltidconf", "verify", "write", "rellockowner", + /* nfsv4.1 server ops */ + "bc_ctl", + "bind_conn", + "exchange_id", + "create_ses", + "destroy_ses", + "free_stateid", + "getdirdeleg", + "getdevinfo", + "getdevlist", + "layoutcommit", + "layoutget", + "layoutreturn", + "secinfononam", + "sequence", + "set_ssv", + "test_stateid", + "want_deleg", + "destroy_clid", + "reclaim_comp", }; #define LABEL_srvnet "Server packet stats:\n" @@ -168,9 +218,9 @@ DECLARE_CLT(cltinfo); DECLARE_CLT(cltinfo, _old); static void print_all_stats(int, int, int); -static void print_server_stats(int, int); -static void print_client_stats(int, int); -static void print_stats_list(int); +static void print_server_stats(int); +static void print_client_stats(int); +static void print_stats_list(int, int, int); static void print_numbers(const char *, unsigned int *, unsigned int); static void print_callstats(const char *, const char **, @@ -186,7 +236,7 @@ static int mounts(const char *); static void get_stats(const char *, struct statinfo *, int *, int, int); -static int has_stats(const unsigned int *); +static int has_stats(const unsigned int *, int); static int has_rpcstats(const unsigned int *, int); static void diff_stats(struct statinfo *, struct statinfo *, int); static void unpause(int); @@ -415,7 +465,7 @@ main(int argc, char **argv) pause(); } - if (opt_since || opt_sleep) { + if (opt_since || (opt_sleep && !sleep_time)) { if (opt_srv) { get_stats(NFSSRVSTAT, serverinfo_tmp, &opt_srv, opt_clt, 1); diff_stats(serverinfo_tmp, serverinfo, 1); @@ -436,7 +486,7 @@ main(int argc, char **argv) diff_stats(clientinfo_tmp, clientinfo, 0); } if (opt_list) { - print_stats_list(opt_prt); + print_stats_list(opt_srv, opt_clt, opt_prt); } else { print_all_stats(opt_srv, opt_clt, opt_prt); } @@ -451,7 +501,7 @@ main(int argc, char **argv) } } else { if (opt_list) { - print_stats_list(opt_prt); + print_stats_list(opt_srv, opt_clt, opt_prt); } else { print_all_stats(opt_srv, opt_clt, opt_prt); } @@ -463,16 +513,16 @@ main(int argc, char **argv) static void print_all_stats (int opt_srv, int opt_clt, int opt_prt) { - print_server_stats(opt_srv, opt_prt); - print_client_stats(opt_clt, opt_prt); + if (opt_srv) + print_server_stats(opt_prt); + + if (opt_clt) + print_client_stats(opt_prt); } static void -print_server_stats(int opt_srv, int opt_prt) +print_server_stats(int opt_prt) { - if (!opt_srv) - return; - if (opt_prt & PRNT_NET) { if (opt_sleep && !has_rpcstats(srvnetinfo, 4)) { } else { @@ -487,7 +537,7 @@ print_server_stats(int opt_srv, int opt_prt) ; } else { print_numbers(LABEL_srvrpc - "calls badcalls badauth badclnt xdrcall\n", + "calls badcalls badclnt badauth xdrcall\n", srvrpcinfo, 5); printf("\n"); } @@ -529,31 +579,29 @@ print_server_stats(int opt_srv, int opt_prt) printf("\n"); } if (opt_prt & PRNT_CALLS) { + int has_v2_stats = has_stats(srvproc2info, SRVPROC2_SZ+2); + int has_v3_stats = has_stats(srvproc3info, SRVPROC3_SZ+2); + int has_v4_stats = has_stats(srvproc4info, SRVPROC4_SZ+2); + if ((opt_prt & PRNT_V2) || - ((opt_prt & PRNT_AUTO) && has_stats(srvproc2info))) { - if (opt_sleep && !has_stats(srvproc2info)) { - ; - } else { + ((opt_prt & PRNT_AUTO) && has_v2_stats)) { + if (!opt_sleep || has_v2_stats) { print_callstats(LABEL_srvproc2, nfsv2name, srvproc2info + 1, sizeof(nfsv2name)/sizeof(char *)); } } if ((opt_prt & PRNT_V3) || - ((opt_prt & PRNT_AUTO) && has_stats(srvproc3info))) { - if (opt_sleep && !has_stats(srvproc3info)) { - ; - } else { + ((opt_prt & PRNT_AUTO) && has_v3_stats)) { + if (!opt_sleep || has_v3_stats) { print_callstats(LABEL_srvproc3, nfsv3name, srvproc3info + 1, sizeof(nfsv3name)/sizeof(char *)); } } if ((opt_prt & PRNT_V4) || - ((opt_prt & PRNT_AUTO) && has_stats(srvproc4info))) { - if (opt_sleep && !has_stats(srvproc4info)) { - ; - } else { + ((opt_prt & PRNT_AUTO) && has_v4_stats)) { + if (!opt_sleep || has_v4_stats) { print_callstats( LABEL_srvproc4, nfssrvproc4name, srvproc4info + 1, sizeof(nfssrvproc4name)/sizeof(char *)); @@ -565,11 +613,8 @@ print_server_stats(int opt_srv, int opt_prt) } } static void -print_client_stats(int opt_clt, int opt_prt) +print_client_stats(int opt_prt) { - if (!opt_clt) - return; - if (opt_prt & PRNT_NET) { if (opt_sleep && !has_rpcstats(cltnetinfo, 4)) { ; @@ -591,31 +636,28 @@ print_client_stats(int opt_clt, int opt_prt) } } if (opt_prt & PRNT_CALLS) { + int has_v2_stats = has_stats(cltproc2info, CLTPROC2_SZ+2); + int has_v3_stats = has_stats(cltproc3info, CLTPROC3_SZ+2); + int has_v4_stats = has_stats(cltproc4info, CLTPROC4_SZ+2); if ((opt_prt & PRNT_V2) || - ((opt_prt & PRNT_AUTO) && has_stats(cltproc2info))) { - if (opt_sleep && !has_stats(cltproc2info)) { - ; - } else { + ((opt_prt & PRNT_AUTO) && has_v2_stats)) { + if (!opt_sleep || has_v2_stats) { print_callstats(LABEL_cltproc2, nfsv2name, cltproc2info + 1, sizeof(nfsv2name)/sizeof(char *)); } } if ((opt_prt & PRNT_V3) || - ((opt_prt & PRNT_AUTO) && has_stats(cltproc3info))) { - if (opt_sleep && !has_stats(cltproc3info)) { - ; - } else { - print_callstats( LABEL_cltproc3, + ((opt_prt & PRNT_AUTO) && has_v3_stats)) { + if (!opt_sleep || has_v3_stats) { + print_callstats(LABEL_cltproc3, nfsv3name, cltproc3info + 1, sizeof(nfsv3name)/sizeof(char *)); } } if ((opt_prt & PRNT_V4) || - ((opt_prt & PRNT_AUTO) && has_stats(cltproc4info))) { - if (opt_sleep && !has_stats(cltproc4info)) { - ; - } else { + ((opt_prt & PRNT_AUTO) && has_v4_stats)) { + if (!opt_sleep || has_v4_stats) { print_callstats(LABEL_cltproc4, nfscltproc4name, cltproc4info + 1, sizeof(nfscltproc4name)/sizeof(char *)); @@ -625,38 +667,83 @@ print_client_stats(int opt_clt, int opt_prt) } static void -print_stats_list(int opt_prt) +print_clnt_list(int opt_prt) { if (opt_prt & PRNT_CALLS) { - if ((opt_prt & PRNT_V2) || ((opt_prt & PRNT_AUTO) && has_stats(cltproc2info))) { - print_callstats_list( - "nfs v2 server", - nfsv2name, srvproc2info + 1, sizeof(nfsv2name)/sizeof(char *)); - print_callstats_list( - "nfs v2 client", - nfsv2name, cltproc2info + 1, sizeof(nfsv2name)/sizeof(char *)); + int has_v2_stats = has_stats(cltproc2info, CLTPROC2_SZ+2); + int has_v3_stats = has_stats(cltproc3info, CLTPROC3_SZ+2); + int has_v4_stats = has_stats(cltproc4info, CLTPROC4_SZ+2); + if ((opt_prt & PRNT_V2) || + ((opt_prt & PRNT_AUTO) && has_v2_stats)) { + if (!opt_sleep || has_v2_stats) { + print_callstats_list("nfs v2 client", + nfsv2name, cltproc2info + 1, + sizeof(nfsv2name)/sizeof(char *)); + } } - if ((opt_prt & PRNT_V3) || ((opt_prt & PRNT_AUTO) && has_stats(cltproc3info))) { - print_callstats_list( - "nfs v3 server", - nfsv3name, srvproc3info + 1, sizeof(nfsv3name)/sizeof(char *)); - print_callstats_list( - "nfs v3 client", - nfsv3name, cltproc3info + 1, sizeof(nfsv3name)/sizeof(char *)); + if ((opt_prt & PRNT_V3) || + ((opt_prt & PRNT_AUTO) && has_v3_stats)) { + if (!opt_sleep || has_v3_stats) { + print_callstats_list("nfs v3 client", + nfsv3name, cltproc3info + 1, + sizeof(nfsv3name)/sizeof(char *)); + } } - if ((opt_prt & PRNT_V4) || ((opt_prt & PRNT_AUTO) && has_stats(cltproc4info))) { - print_callstats_list( - "nfs v4 server", - nfssrvproc4name, srvproc4info + 1, sizeof(nfssrvproc4name)/sizeof(char *)); - print_callstats_list( - "nfs v4 ops", - nfssrvproc4opname, srvproc4opsinfo + 1, sizeof(nfssrvproc4opname)/sizeof(char *)); - print_callstats_list( - "nfs v4 client", - nfscltproc4name, cltproc4info + 1, sizeof(nfscltproc4name)/sizeof(char *)); + if ((opt_prt & PRNT_V4) || + ((opt_prt & PRNT_AUTO) && has_v4_stats)) { + if (!opt_sleep || has_v4_stats) { + print_callstats_list("nfs v4 client", + nfscltproc4name, cltproc4info + 1, + sizeof(nfscltproc4name)/sizeof(char *)); + } } } } +static void +print_serv_list(int opt_prt) +{ + if (opt_prt & PRNT_CALLS) { + int has_v2_stats = has_stats(srvproc2info, SRVPROC2_SZ+2); + int has_v3_stats = has_stats(srvproc3info, SRVPROC3_SZ+2); + int has_v4_stats = has_stats(srvproc4info, SRVPROC4_SZ+2); + if ((opt_prt & PRNT_V2) || + ((opt_prt & PRNT_AUTO) && has_v2_stats)) { + if (!opt_sleep || has_v2_stats) { + print_callstats_list("nfs v2 server", + nfsv2name, srvproc2info + 1, + sizeof(nfsv2name)/sizeof(char *)); + } + } + if ((opt_prt & PRNT_V3) || + ((opt_prt & PRNT_AUTO) && has_v3_stats)) { + if (!opt_sleep || has_v3_stats) { + print_callstats_list("nfs v3 server", + nfsv3name, srvproc3info + 1, + sizeof(nfsv3name)/sizeof(char *)); + } + } + if ((opt_prt & PRNT_V4) || + ((opt_prt & PRNT_AUTO) && has_v4_stats)) { + if (!opt_sleep || has_v4_stats) { + print_callstats_list("nfs v4 server", + nfssrvproc4name, srvproc4info + 1, + sizeof(nfssrvproc4name)/sizeof(char *)); + print_callstats_list("nfs v4 servop", + nfssrvproc4opname, srvproc4opsinfo + 1, + sizeof(nfssrvproc4opname)/sizeof(char *)); + } + } + } +} +static void +print_stats_list(int opt_srv, int opt_clt, int opt_prt) +{ + if (opt_srv) + print_serv_list(opt_prt); + + if (opt_clt) + print_clnt_list(opt_prt); +} static statinfo * get_stat_info(const char *sp, struct statinfo *statp) @@ -688,7 +775,7 @@ print_callstats(const char *hdr, const char **names, { unsigned long long total; unsigned long long pct; - int i, j; + unsigned int i, j; fputs(hdr, stdout); for (i = 0, total = 0; i < nr; i++) @@ -713,7 +800,7 @@ print_callstats_list(const char *hdr, const char **names, unsigned int *callinfo, unsigned int nr) { unsigned long long calltotal; - int i; + unsigned int i; for (i = 0, calltotal = 0; i < nr; i++) { calltotal += callinfo[i]; @@ -950,9 +1037,9 @@ out: * there are stats if the sum's greater than the entry-count. */ static int -has_stats(const unsigned int *info) +has_stats(const unsigned int *info, int nr) { - return (info[0] && info[info[0] + 1] > info[0]); + return (info[0] && info[nr-1] > info[0]); } static int has_rpcstats(const unsigned int *info, int size) @@ -1015,7 +1102,7 @@ unpause(int sig) time_diff = difftime(endtime, starttime); minutes = time_diff / 60; seconds = (int)time_diff % 60; - printf("Signal received; displaying (only) statistics gathered over the last %d minutes, %d seconds:\n\n", minutes, seconds); + printf("Signal %d received; displaying (only) statistics gathered over the last %d minutes, %d seconds:\n\n", sig, minutes, seconds); } static void