* Copyright (c) 1983, 1989 Regents of the University of California.
* This code is derived from software contributed to Berkeley by
* Rick Macklem at The University of Guelph.
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by the University of
* California, Berkeley and its contributors.
* 4. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
"@(#) Copyright (c) 1983, 1989 Regents of the University of California.\n\
static char sccsid
[] = "@(#)nfsstat.c 5.9 (Berkeley) 7/1/91";
char *kernel
= _PATH_UNIX
;
char *kmemf
= _PATH_KMEM
;
void intpr(), printhdr(), sidewaysintpr(), usage();
while ((ch
= getopt(argc
, argv
, "M:N:w:")) != EOF
)
#define BACKWARD_COMPATIBILITY
#ifdef BACKWARD_COMPATIBILITY
if (nlist(kernel
, nl
) < 0 || nl
[0].n_type
== 0) {
(void)fprintf(stderr
, "nfsstate: %s: no namelist\n", kernel
);
kmem
= open(kmemf
, O_RDONLY
);
"nfsstat: %s: %s\n", kmemf
, strerror(errno
));
(void)fprintf(stderr
, "nfsstat: can't do core files yet\n");
malloc((u_int
)(nl
[N_SYSSIZE
].n_value
* sizeof(struct pte
)));
(void)fprintf(stderr
, "nfsstat: %s\n", strerror(errno
));
off
= nl
[N_SYSMAP
].n_value
& ~KERNBASE
;
(void)lseek(kmem
, off
, L_SET
);
(void)read(kmem
, (char *)Sysmap
,
(int)(nl
[N_SYSSIZE
].n_value
* sizeof(struct pte
)));
if (!nl
[N_NFSSTAT
].n_value
) {
(void)fprintf(stderr
, "nfsstat: nfsstats symbol not defined\n");
sidewaysintpr(interval
, nl
[N_NFSSTAT
].n_value
);
intpr(nl
[N_NFSSTAT
].n_value
);
* Print a description of the network interfaces.
struct nfsstats nfsstats
;
klseek(kmem
, nfsstataddr
, 0L);
read(kmem
, (char *)&nfsstats
, sizeof(struct nfsstats
));
printf("Client Info:\n");
printf("%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n",
"Getattr", "Setattr", "Lookup", "Readlink", "Read",
"Write", "Create", "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\n",
"Rename", "Link", "Symlink", "Mkdir", "Rmdir",
printf("%9d %9d %9d %9d %9d %9d %9d\n",
printf("%9.9s %9.9s %9.9s %9.9s %9.9s\n",
"TimedOut", "Invalid", "X Replies", "Retries", "Requests");
printf("%9d %9d %9d %9d %9d\n",
printf("%9.9s %9.9s %9.9s %9.9s",
"Attr Hits", "Misses", "Lkup Hits", "Misses");
printf(" %9.9s %9.9s %9.9s %9.9s\n",
"BioR Hits", "Misses", "BioW Hits", "Misses");
printf("%9d %9d %9d %9d",
nfsstats
.attrcache_hits
, nfsstats
.attrcache_misses
,
nfsstats
.lookupcache_hits
, nfsstats
.lookupcache_misses
);
printf(" %9d %9d %9d %9d\n",
nfsstats
.biocache_reads
-nfsstats
.read_bios
,
nfsstats
.biocache_writes
-nfsstats
.write_bios
,
printf("%9.9s %9.9s %9.9s %9.9s",
"BioRLHits", "Misses", "BioD Hits", "Misses");
printf(" %9.9s %9.9s\n", "DirE Hits", "Misses");
printf("%9d %9d %9d %9d",
nfsstats
.biocache_readlinks
-nfsstats
.readlink_bios
,
nfsstats
.biocache_readdirs
-nfsstats
.readdir_bios
,
nfsstats
.direofcache_hits
, nfsstats
.direofcache_misses
);
printf("\nServer Info:\n");
printf("%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n",
"Getattr", "Setattr", "Lookup", "Readlink", "Read",
"Write", "Create", "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\n",
"Rename", "Link", "Symlink", "Mkdir", "Rmdir",
printf("%9d %9d %9d %9d %9d %9d %9d\n",
printf("Server Ret-Failed\n");
printf("%17d\n", nfsstats
.srvrpc_errs
);
printf("Server Faults\n");
printf("%13d\n", nfsstats
.srv_errs
);
printf("Server Cache Stats:\n");
printf("%9.9s %9.9s %9.9s %9.9s\n",
"Inprog", "Idem", "Non-idem", "Misses");
printf("%9d %9d %9d %9d\n",
nfsstats
.srvcache_inproghits
,
nfsstats
.srvcache_idemdonehits
,
nfsstats
.srvcache_nonidemdonehits
,
nfsstats
.srvcache_misses
);
u_char signalled
; /* set if alarm goes off "early" */
* Print a running summary of nfs statistics.
* Repeat display every interval seconds, showing statistics
* collected over that interval. Assumes that interval is non-zero.
* First line printed at top of screen is always cumulative.
sidewaysintpr(interval
, off
)
struct nfsstats nfsstats
, lastst
;
(void)signal(SIGALRM
, catchalarm
);
bzero((caddr_t
)&lastst
, sizeof(lastst
));
read(kmem
, (char *)&nfsstats
, sizeof nfsstats
);
printf("Client: %8d %8d %8d %8d %8d %8d %8d %8d\n",
nfsstats
.rpccnt
[1]-lastst
.rpccnt
[1],
nfsstats
.rpccnt
[4]-lastst
.rpccnt
[4],
nfsstats
.rpccnt
[5]-lastst
.rpccnt
[5],
nfsstats
.rpccnt
[6]-lastst
.rpccnt
[6],
nfsstats
.rpccnt
[8]-lastst
.rpccnt
[8],
nfsstats
.rpccnt
[11]-lastst
.rpccnt
[11],
nfsstats
.rpccnt
[12]-lastst
.rpccnt
[12],
nfsstats
.rpccnt
[16]-lastst
.rpccnt
[16]);
printf("Server: %8d %8d %8d %8d %8d %8d %8d %8d\n",
nfsstats
.srvrpccnt
[1]-lastst
.srvrpccnt
[1],
nfsstats
.srvrpccnt
[4]-lastst
.srvrpccnt
[4],
nfsstats
.srvrpccnt
[5]-lastst
.srvrpccnt
[5],
nfsstats
.srvrpccnt
[6]-lastst
.srvrpccnt
[6],
nfsstats
.srvrpccnt
[8]-lastst
.srvrpccnt
[8],
nfsstats
.srvrpccnt
[11]-lastst
.srvrpccnt
[11],
nfsstats
.srvrpccnt
[12]-lastst
.srvrpccnt
[12],
nfsstats
.srvrpccnt
[16]-lastst
.srvrpccnt
[16]);
oldmask
= sigblock(sigmask(SIGALRM
));
printf(" %8.8s %8.8s %8.8s %8.8s %8.8s %8.8s %8.8s %8.8s\n",
"Getattr", "Lookup", "Readlink", "Read", "Write", "Rename",
* Called if an interval expires before sidewaysintpr has completed a loop.
* Sets a flag to not wait for the alarm.
* Seek into the kernel for a value.
base
= ctob(Sysmap
[btop(base
)].pg_pfnum
) + (base
& PGOFSET
);
return (lseek(fd
, base
, off
));
"usage: nfsstat [-M core] [-N system] [-w interval]\n");