version 1.3, 1996/08/06 18:36:59 |
version 1.4, 1996/12/15 18:52:19 |
|
|
#include <paths.h> |
#include <paths.h> |
#include <err.h> |
#include <err.h> |
|
|
|
#define SHOW_SERVER 0x01 |
|
#define SHOW_CLIENT 0x02 |
|
#define SHOW_ALL (SHOW_SERVER | SHOW_CLIENT) |
|
|
struct nlist nl[] = { |
struct nlist nl[] = { |
#define N_NFSSTAT 0 |
#define N_NFSSTAT 0 |
{ "_nfsstats" }, |
{ "_nfsstats" }, |
|
|
extern int optind; |
extern int optind; |
extern char *optarg; |
extern char *optarg; |
u_int interval; |
u_int interval; |
|
u_int display = SHOW_ALL; |
int ch; |
int ch; |
char *memf, *nlistf; |
char *memf, *nlistf; |
char errbuf[_POSIX2_LINE_MAX]; |
char errbuf[_POSIX2_LINE_MAX]; |
|
|
interval = 0; |
interval = 0; |
memf = nlistf = NULL; |
memf = nlistf = NULL; |
while ((ch = getopt(argc, argv, "M:N:w:")) != EOF) |
while ((ch = getopt(argc, argv, "M:N:w:sc")) != EOF) |
switch(ch) { |
switch(ch) { |
case 'M': |
case 'M': |
memf = optarg; |
memf = optarg; |
|
|
case 'w': |
case 'w': |
interval = atoi(optarg); |
interval = atoi(optarg); |
break; |
break; |
|
case 's': |
|
display = SHOW_SERVER; |
|
break; |
|
case 'c': |
|
display = SHOW_CLIENT; |
|
break; |
case '?': |
case '?': |
default: |
default: |
usage(); |
usage(); |
|
|
} |
} |
|
|
if (interval) |
if (interval) |
sidewaysintpr(interval, nl[N_NFSSTAT].n_value); |
sidewaysintpr(interval, nl[N_NFSSTAT].n_value, display); |
else |
else |
intpr(nl[N_NFSSTAT].n_value); |
intpr(nl[N_NFSSTAT].n_value, display); |
exit(0); |
exit(0); |
} |
} |
|
|
|
|
* Print a description of the nfs stats. |
* Print a description of the nfs stats. |
*/ |
*/ |
void |
void |
intpr(nfsstataddr) |
intpr(nfsstataddr, display) |
u_long nfsstataddr; |
u_long nfsstataddr; |
|
u_int display; |
{ |
{ |
struct nfsstats nfsstats; |
struct nfsstats nfsstats; |
|
|
|
|
fprintf(stderr, "nfsstat: kvm_read failed\n"); |
fprintf(stderr, "nfsstat: kvm_read failed\n"); |
exit(1); |
exit(1); |
} |
} |
printf("Client Info:\n"); |
if (display & SHOW_CLIENT) { |
printf("Rpc Counts:\n"); |
printf("Client Info:\n"); |
printf("%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n", |
printf("Rpc Counts:\n"); |
"Getattr", "Setattr", "Lookup", "Readlink", "Read", |
printf("%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n", |
"Write", "Create", "Remove"); |
"Getattr", "Setattr", "Lookup", "Readlink", "Read", |
printf("%9d %9d %9d %9d %9d %9d %9d %9d\n", |
"Write", "Create", "Remove"); |
nfsstats.rpccnt[NFSPROC_GETATTR], |
printf("%9d %9d %9d %9d %9d %9d %9d %9d\n", |
nfsstats.rpccnt[NFSPROC_SETATTR], |
nfsstats.rpccnt[NFSPROC_GETATTR], |
nfsstats.rpccnt[NFSPROC_LOOKUP], |
nfsstats.rpccnt[NFSPROC_SETATTR], |
nfsstats.rpccnt[NFSPROC_READLINK], |
nfsstats.rpccnt[NFSPROC_LOOKUP], |
nfsstats.rpccnt[NFSPROC_READ], |
nfsstats.rpccnt[NFSPROC_READLINK], |
nfsstats.rpccnt[NFSPROC_WRITE], |
nfsstats.rpccnt[NFSPROC_READ], |
nfsstats.rpccnt[NFSPROC_CREATE], |
nfsstats.rpccnt[NFSPROC_WRITE], |
nfsstats.rpccnt[NFSPROC_REMOVE]); |
nfsstats.rpccnt[NFSPROC_CREATE], |
printf("%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n", |
nfsstats.rpccnt[NFSPROC_REMOVE]); |
"Rename", "Link", "Symlink", "Mkdir", "Rmdir", |
printf("%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n", |
"Readdir", "RdirPlus", "Access"); |
"Rename", "Link", "Symlink", "Mkdir", "Rmdir", |
printf("%9d %9d %9d %9d %9d %9d %9d %9d\n", |
"Readdir", "RdirPlus", "Access"); |
nfsstats.rpccnt[NFSPROC_RENAME], |
printf("%9d %9d %9d %9d %9d %9d %9d %9d\n", |
nfsstats.rpccnt[NFSPROC_LINK], |
nfsstats.rpccnt[NFSPROC_RENAME], |
nfsstats.rpccnt[NFSPROC_SYMLINK], |
nfsstats.rpccnt[NFSPROC_LINK], |
nfsstats.rpccnt[NFSPROC_MKDIR], |
nfsstats.rpccnt[NFSPROC_SYMLINK], |
nfsstats.rpccnt[NFSPROC_RMDIR], |
nfsstats.rpccnt[NFSPROC_MKDIR], |
nfsstats.rpccnt[NFSPROC_READDIR], |
nfsstats.rpccnt[NFSPROC_RMDIR], |
nfsstats.rpccnt[NFSPROC_READDIRPLUS], |
nfsstats.rpccnt[NFSPROC_READDIR], |
nfsstats.rpccnt[NFSPROC_ACCESS]); |
nfsstats.rpccnt[NFSPROC_READDIRPLUS], |
printf("%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n", |
nfsstats.rpccnt[NFSPROC_ACCESS]); |
"Mknod", "Fsstat", "Fsinfo", "PathConf", "Commit", |
printf("%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n", |
"GLease", "Vacate", "Evict"); |
"Mknod", "Fsstat", "Fsinfo", "PathConf", "Commit", |
printf("%9d %9d %9d %9d %9d %9d %9d %9d\n", |
"GLease", "Vacate", "Evict"); |
nfsstats.rpccnt[NFSPROC_MKNOD], |
printf("%9d %9d %9d %9d %9d %9d %9d %9d\n", |
nfsstats.rpccnt[NFSPROC_FSSTAT], |
nfsstats.rpccnt[NFSPROC_MKNOD], |
nfsstats.rpccnt[NFSPROC_FSINFO], |
nfsstats.rpccnt[NFSPROC_FSSTAT], |
nfsstats.rpccnt[NFSPROC_PATHCONF], |
nfsstats.rpccnt[NFSPROC_FSINFO], |
nfsstats.rpccnt[NFSPROC_COMMIT], |
nfsstats.rpccnt[NFSPROC_PATHCONF], |
nfsstats.rpccnt[NQNFSPROC_GETLEASE], |
nfsstats.rpccnt[NFSPROC_COMMIT], |
nfsstats.rpccnt[NQNFSPROC_VACATED], |
nfsstats.rpccnt[NQNFSPROC_GETLEASE], |
nfsstats.rpccnt[NQNFSPROC_EVICTED]); |
nfsstats.rpccnt[NQNFSPROC_VACATED], |
printf("Rpc Info:\n"); |
nfsstats.rpccnt[NQNFSPROC_EVICTED]); |
printf("%9.9s %9.9s %9.9s %9.9s %9.9s\n", |
printf("Rpc Info:\n"); |
"TimedOut", "Invalid", "X Replies", "Retries", "Requests"); |
printf("%9.9s %9.9s %9.9s %9.9s %9.9s\n", |
printf("%9d %9d %9d %9d %9d\n", |
"TimedOut", "Invalid", "X Replies", "Retries", "Requests"); |
nfsstats.rpctimeouts, |
printf("%9d %9d %9d %9d %9d\n", |
nfsstats.rpcinvalid, |
nfsstats.rpctimeouts, |
nfsstats.rpcunexpected, |
nfsstats.rpcinvalid, |
nfsstats.rpcretries, |
nfsstats.rpcunexpected, |
nfsstats.rpcrequests); |
nfsstats.rpcretries, |
printf("Cache Info:\n"); |
nfsstats.rpcrequests); |
printf("%9.9s %9.9s %9.9s %9.9s", |
printf("Cache Info:\n"); |
"Attr Hits", "Misses", "Lkup Hits", "Misses"); |
printf("%9.9s %9.9s %9.9s %9.9s", |
printf(" %9.9s %9.9s %9.9s %9.9s\n", |
"Attr Hits", "Misses", "Lkup Hits", "Misses"); |
"BioR Hits", "Misses", "BioW Hits", "Misses"); |
printf(" %9.9s %9.9s %9.9s %9.9s\n", |
printf("%9d %9d %9d %9d", |
"BioR Hits", "Misses", "BioW Hits", "Misses"); |
nfsstats.attrcache_hits, nfsstats.attrcache_misses, |
printf("%9d %9d %9d %9d", |
nfsstats.lookupcache_hits, nfsstats.lookupcache_misses); |
nfsstats.attrcache_hits, nfsstats.attrcache_misses, |
printf(" %9d %9d %9d %9d\n", |
nfsstats.lookupcache_hits, nfsstats.lookupcache_misses); |
nfsstats.biocache_reads-nfsstats.read_bios, |
printf(" %9d %9d %9d %9d\n", |
nfsstats.read_bios, |
nfsstats.biocache_reads-nfsstats.read_bios, |
nfsstats.biocache_writes-nfsstats.write_bios, |
nfsstats.read_bios, |
nfsstats.write_bios); |
nfsstats.biocache_writes-nfsstats.write_bios, |
printf("%9.9s %9.9s %9.9s %9.9s", |
nfsstats.write_bios); |
"BioRLHits", "Misses", "BioD Hits", "Misses"); |
printf("%9.9s %9.9s %9.9s %9.9s", |
printf(" %9.9s %9.9s\n", "DirE Hits", "Misses"); |
"BioRLHits", "Misses", "BioD Hits", "Misses"); |
printf("%9d %9d %9d %9d", |
printf(" %9.9s %9.9s\n", "DirE Hits", "Misses"); |
nfsstats.biocache_readlinks-nfsstats.readlink_bios, |
printf("%9d %9d %9d %9d", |
nfsstats.readlink_bios, |
nfsstats.biocache_readlinks-nfsstats.readlink_bios, |
nfsstats.biocache_readdirs-nfsstats.readdir_bios, |
nfsstats.readlink_bios, |
nfsstats.readdir_bios); |
nfsstats.biocache_readdirs-nfsstats.readdir_bios, |
printf(" %9d %9d\n", |
nfsstats.readdir_bios); |
nfsstats.direofcache_hits, nfsstats.direofcache_misses); |
printf(" %9d %9d\n", |
printf("\nServer Info:\n"); |
nfsstats.direofcache_hits, nfsstats.direofcache_misses); |
printf("%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n", |
} |
"Getattr", "Setattr", "Lookup", "Readlink", "Read", |
if (display & SHOW_SERVER) { |
"Write", "Create", "Remove"); |
printf("\nServer Info:\n"); |
printf("%9d %9d %9d %9d %9d %9d %9d %9d\n", |
printf("%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n", |
nfsstats.srvrpccnt[NFSPROC_GETATTR], |
"Getattr", "Setattr", "Lookup", "Readlink", "Read", |
nfsstats.srvrpccnt[NFSPROC_SETATTR], |
"Write", "Create", "Remove"); |
nfsstats.srvrpccnt[NFSPROC_LOOKUP], |
printf("%9d %9d %9d %9d %9d %9d %9d %9d\n", |
nfsstats.srvrpccnt[NFSPROC_READLINK], |
nfsstats.srvrpccnt[NFSPROC_GETATTR], |
nfsstats.srvrpccnt[NFSPROC_READ], |
nfsstats.srvrpccnt[NFSPROC_SETATTR], |
nfsstats.srvrpccnt[NFSPROC_WRITE], |
nfsstats.srvrpccnt[NFSPROC_LOOKUP], |
nfsstats.srvrpccnt[NFSPROC_CREATE], |
nfsstats.srvrpccnt[NFSPROC_READLINK], |
nfsstats.srvrpccnt[NFSPROC_REMOVE]); |
nfsstats.srvrpccnt[NFSPROC_READ], |
printf("%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n", |
nfsstats.srvrpccnt[NFSPROC_WRITE], |
"Rename", "Link", "Symlink", "Mkdir", "Rmdir", |
nfsstats.srvrpccnt[NFSPROC_CREATE], |
"Readdir", "RdirPlus", "Access"); |
nfsstats.srvrpccnt[NFSPROC_REMOVE]); |
printf("%9d %9d %9d %9d %9d %9d %9d %9d\n", |
printf("%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n", |
nfsstats.srvrpccnt[NFSPROC_RENAME], |
"Rename", "Link", "Symlink", "Mkdir", "Rmdir", |
nfsstats.srvrpccnt[NFSPROC_LINK], |
"Readdir", "RdirPlus", "Access"); |
nfsstats.srvrpccnt[NFSPROC_SYMLINK], |
printf("%9d %9d %9d %9d %9d %9d %9d %9d\n", |
nfsstats.srvrpccnt[NFSPROC_MKDIR], |
nfsstats.srvrpccnt[NFSPROC_RENAME], |
nfsstats.srvrpccnt[NFSPROC_RMDIR], |
nfsstats.srvrpccnt[NFSPROC_LINK], |
nfsstats.srvrpccnt[NFSPROC_READDIR], |
nfsstats.srvrpccnt[NFSPROC_SYMLINK], |
nfsstats.srvrpccnt[NFSPROC_READDIRPLUS], |
nfsstats.srvrpccnt[NFSPROC_MKDIR], |
nfsstats.srvrpccnt[NFSPROC_ACCESS]); |
nfsstats.srvrpccnt[NFSPROC_RMDIR], |
printf("%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n", |
nfsstats.srvrpccnt[NFSPROC_READDIR], |
"Mknod", "Fsstat", "Fsinfo", "PathConf", "Commit", |
nfsstats.srvrpccnt[NFSPROC_READDIRPLUS], |
"GLease", "Vacate", "Evict"); |
nfsstats.srvrpccnt[NFSPROC_ACCESS]); |
printf("%9d %9d %9d %9d %9d %9d %9d %9d\n", |
printf("%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n", |
nfsstats.srvrpccnt[NFSPROC_MKNOD], |
"Mknod", "Fsstat", "Fsinfo", "PathConf", "Commit", |
nfsstats.srvrpccnt[NFSPROC_FSSTAT], |
"GLease", "Vacate", "Evict"); |
nfsstats.srvrpccnt[NFSPROC_FSINFO], |
printf("%9d %9d %9d %9d %9d %9d %9d %9d\n", |
nfsstats.srvrpccnt[NFSPROC_PATHCONF], |
nfsstats.srvrpccnt[NFSPROC_MKNOD], |
nfsstats.srvrpccnt[NFSPROC_COMMIT], |
nfsstats.srvrpccnt[NFSPROC_FSSTAT], |
nfsstats.srvrpccnt[NQNFSPROC_GETLEASE], |
nfsstats.srvrpccnt[NFSPROC_FSINFO], |
nfsstats.srvrpccnt[NQNFSPROC_VACATED], |
nfsstats.srvrpccnt[NFSPROC_PATHCONF], |
nfsstats.srvrpccnt[NQNFSPROC_EVICTED]); |
nfsstats.srvrpccnt[NFSPROC_COMMIT], |
printf("Server Ret-Failed\n"); |
nfsstats.srvrpccnt[NQNFSPROC_GETLEASE], |
printf("%17d\n", nfsstats.srvrpc_errs); |
nfsstats.srvrpccnt[NQNFSPROC_VACATED], |
printf("Server Faults\n"); |
nfsstats.srvrpccnt[NQNFSPROC_EVICTED]); |
printf("%13d\n", nfsstats.srv_errs); |
printf("Server Ret-Failed\n"); |
printf("Server Cache Stats:\n"); |
printf("%17d\n", nfsstats.srvrpc_errs); |
printf("%9.9s %9.9s %9.9s %9.9s\n", |
printf("Server Faults\n"); |
"Inprog", "Idem", "Non-idem", "Misses"); |
printf("%13d\n", nfsstats.srv_errs); |
printf("%9d %9d %9d %9d\n", |
printf("Server Cache Stats:\n"); |
nfsstats.srvcache_inproghits, |
printf("%9.9s %9.9s %9.9s %9.9s\n", |
nfsstats.srvcache_idemdonehits, |
"Inprog", "Idem", "Non-idem", "Misses"); |
nfsstats.srvcache_nonidemdonehits, |
printf("%9d %9d %9d %9d\n", |
nfsstats.srvcache_misses); |
nfsstats.srvcache_inproghits, |
printf("Server Lease Stats:\n"); |
nfsstats.srvcache_idemdonehits, |
printf("%9.9s %9.9s %9.9s\n", |
nfsstats.srvcache_nonidemdonehits, |
"Leases", "PeakL", "GLeases"); |
nfsstats.srvcache_misses); |
printf("%9d %9d %9d\n", |
printf("Server Lease Stats:\n"); |
nfsstats.srvnqnfs_leases, |
printf("%9.9s %9.9s %9.9s\n", |
nfsstats.srvnqnfs_maxleases, |
"Leases", "PeakL", "GLeases"); |
nfsstats.srvnqnfs_getleases); |
printf("%9d %9d %9d\n", |
printf("Server Write Gathering:\n"); |
nfsstats.srvnqnfs_leases, |
printf("%9.9s %9.9s %9.9s\n", |
nfsstats.srvnqnfs_maxleases, |
"WriteOps", "WriteRPC", "Opsaved"); |
nfsstats.srvnqnfs_getleases); |
printf("%9d %9d %9d\n", |
printf("Server Write Gathering:\n"); |
nfsstats.srvvop_writes, |
printf("%9.9s %9.9s %9.9s\n", |
nfsstats.srvrpccnt[NFSPROC_WRITE], |
"WriteOps", "WriteRPC", "Opsaved"); |
nfsstats.srvrpccnt[NFSPROC_WRITE] - nfsstats.srvvop_writes); |
printf("%9d %9d %9d\n", |
|
nfsstats.srvvop_writes, |
|
nfsstats.srvrpccnt[NFSPROC_WRITE], |
|
nfsstats.srvrpccnt[NFSPROC_WRITE] - nfsstats.srvvop_writes); |
|
} |
} |
} |
|
|
u_char signalled; /* set if alarm goes off "early" */ |
u_char signalled; /* set if alarm goes off "early" */ |
|
|
* First line printed at top of screen is always cumulative. |
* First line printed at top of screen is always cumulative. |
*/ |
*/ |
void |
void |
sidewaysintpr(interval, off) |
sidewaysintpr(interval, off, display) |
u_int interval; |
u_int interval; |
u_long off; |
u_long off; |
|
u_int display; |
{ |
{ |
struct nfsstats nfsstats, lastst; |
struct nfsstats nfsstats, lastst; |
int hdrcnt, oldmask; |
int hdrcnt, oldmask; |
|
|
fprintf(stderr, "nfsstat: kvm_read failed\n"); |
fprintf(stderr, "nfsstat: kvm_read failed\n"); |
exit(1); |
exit(1); |
} |
} |
printf("Client: %8d %8d %8d %8d %8d %8d %8d %8d\n", |
if (display & SHOW_CLIENT) |
|
printf("Client: %8d %8d %8d %8d %8d %8d %8d %8d\n", |
nfsstats.rpccnt[NFSPROC_GETATTR]-lastst.rpccnt[NFSPROC_GETATTR], |
nfsstats.rpccnt[NFSPROC_GETATTR]-lastst.rpccnt[NFSPROC_GETATTR], |
nfsstats.rpccnt[NFSPROC_LOOKUP]-lastst.rpccnt[NFSPROC_LOOKUP], |
nfsstats.rpccnt[NFSPROC_LOOKUP]-lastst.rpccnt[NFSPROC_LOOKUP], |
nfsstats.rpccnt[NFSPROC_READLINK]-lastst.rpccnt[NFSPROC_READLINK], |
nfsstats.rpccnt[NFSPROC_READLINK]-lastst.rpccnt[NFSPROC_READLINK], |
|
|
nfsstats.rpccnt[NFSPROC_ACCESS]-lastst.rpccnt[NFSPROC_ACCESS], |
nfsstats.rpccnt[NFSPROC_ACCESS]-lastst.rpccnt[NFSPROC_ACCESS], |
(nfsstats.rpccnt[NFSPROC_READDIR]-lastst.rpccnt[NFSPROC_READDIR]) |
(nfsstats.rpccnt[NFSPROC_READDIR]-lastst.rpccnt[NFSPROC_READDIR]) |
+(nfsstats.rpccnt[NFSPROC_READDIRPLUS]-lastst.rpccnt[NFSPROC_READDIRPLUS])); |
+(nfsstats.rpccnt[NFSPROC_READDIRPLUS]-lastst.rpccnt[NFSPROC_READDIRPLUS])); |
printf("Server: %8d %8d %8d %8d %8d %8d %8d %8d\n", |
if (display & SHOW_SERVER) |
|
printf("Server: %8d %8d %8d %8d %8d %8d %8d %8d\n", |
nfsstats.srvrpccnt[NFSPROC_GETATTR]-lastst.srvrpccnt[NFSPROC_GETATTR], |
nfsstats.srvrpccnt[NFSPROC_GETATTR]-lastst.srvrpccnt[NFSPROC_GETATTR], |
nfsstats.srvrpccnt[NFSPROC_LOOKUP]-lastst.srvrpccnt[NFSPROC_LOOKUP], |
nfsstats.srvrpccnt[NFSPROC_LOOKUP]-lastst.srvrpccnt[NFSPROC_LOOKUP], |
nfsstats.srvrpccnt[NFSPROC_READLINK]-lastst.srvrpccnt[NFSPROC_READLINK], |
nfsstats.srvrpccnt[NFSPROC_READLINK]-lastst.srvrpccnt[NFSPROC_READLINK], |