After some testing, I corrected an error and removed a
couple of redundancies. I have the following patch
applied and running on my system and it seems solid:
CLIENT
sar -n NFS
Linux 2.6.18 (dell566) 08/08/2007
12:00:02 AM call/s retrans/s read/s write/s
access/s getatt/s
<* snip *>
01:35:01 PM 9.70 0.00 0.00 0.00
3.47 0.45
01:45:01 PM 4.84 0.00 0.00 0.00
1.96 0.23
01:55:01 PM 0.00 0.00 0.00 0.00
0.00 0.00
02:05:01 PM 90.34 0.00 0.00 0.01
27.67 2.46
02:15:02 PM 216.38 0.00 0.00 0.01
69.51 6.07
Average: 35.49 0.00 0.00 0.00
11.25 1.03
SERVER
sar -n NFSD
Linux 2.6.18 (emach433) 08/08/2007
01:34:31 PM LINUX RESTART
01:35:01 PM scall/s badcall/s packet/s udp/s
tcp/s hit/s miss/s sread/s swrite/s
saccess/s sgetatt/s
01:45:01 PM 4.84 0.00 4.84 0.00
4.84 0.00 0.00 0.00 0.00
0.23 5.02
01:55:01 PM 0.00 0.00 0.00 0.00
0.00 0.00 0.00 0.00 0.00
0.00 0.00
02:05:01 PM 90.47 0.00 90.47 0.00
90.46 0.00 0.00 0.00 0.01
2.47 94.06
02:15:02 PM 216.48 0.00 216.48 0.00
216.48 0.00 0.00 0.00 0.01
6.06 231.47
Average: 77.95 0.00 77.95 0.00
77.95 0.00 0.00 0.00 0.01
2.19 82.64
--- sadc.old 2007-08-07 22:53:24.000000000 -0400
+++ sadc.c 2007-08-08 14:08:32.000000000 -0400
@@ -64,6 +64,8 @@
unsigned int u_tmp[NR_DISKS - 1];
char comment[MAX_COMMENT_LEN];
+/* NFS V4 support */
+char *v3zeroes = "0 0 0 0 0 0 0 0"; /* Version 3 zero counts */
/*
***************************************************************************
@@ -1270,6 +1272,12 @@
{
FILE *fp;
static char line[256];
+
+ /* NFS Version 4 client support */
+ static char *v4cfmt = "%*u %*u %u %u %*u %*u " /* Version 4 client format */
+ "%*u %*u %*u %*u %*u %*u "
+ "%*u %*u %*u %*u %*u %*u "
+ "%u %u";
if ((fp = fopen(NET_RPC_NFS, "r")) == NULL)
return;
@@ -1280,10 +1288,16 @@
sscanf(line + 3, "%u %u",
&(file_stats.nfs_rpccnt), &(file_stats.nfs_rpcretrans));
- else if (!strncmp(line, "proc3", 5))
+ else if (!strncmp(line, "proc3", 5) && !strncmp(line + 9, v3zeroes, strlen(v3zeroes)))
sscanf(line + 5, "%*u %*u %u %*u %*u %u %*u %u %u",
&(file_stats.nfs_getattcnt), &(file_stats.nfs_accesscnt),
&(file_stats.nfs_readcnt), &(file_stats.nfs_writecnt));
+
+ /* NFS Version 4 client support */
+ else if (!strncmp(line, "proc4", 5))
+ sscanf(line + 5, v4cfmt,
+ &(file_stats.nfs_readcnt), &(file_stats.nfs_writecnt),
+ &(file_stats.nfs_getattcnt), &(file_stats.nfs_accesscnt));
}
fclose(fp);
@@ -1299,7 +1313,16 @@
{
FILE *fp;
static char line[256];
-
+
+ /* NFS Version 4 server support */
+ static char *v4sfmt = "%*u %*u %*u %*u %u %*u " /* Version 4 server format */
+ "%*u %*u %*u %*u %u %*u "
+ "%*u %*u %*u %*u %*u %*u "
+ "%*u %*u %*u %*u %*u %*u "
+ "%*u %*u %u %*u %*u %*u "
+ "%*u %*u %*u %*u %*u %*u "
+ "%*u %*u %*u %u";
+
if ((fp = fopen(NET_RPC_NFSD, "r")) == NULL)
return;
@@ -1318,17 +1341,20 @@
sscanf(line + 3, "%u %u",
&(file_stats.nfsd_rpccnt), &(file_stats.nfsd_rpcbad));
- else if (!strncmp(line, "proc3", 5))
- sscanf(line + 5, "%*u %*u %u %*u %*u %u %*u %u %u",
+ else if (!strncmp(line, "proc3", 5) && !strncmp(line + 11, v3zeroes, strlen(v3zeroes)))
+ sscanf(line + 5, "%*u %*u %u %*u %*u %u %*u %u %u",
&(file_stats.nfsd_getattcnt), &(file_stats.nfsd_accesscnt),
&(file_stats.nfsd_readcnt), &(file_stats.nfsd_writecnt));
+ else if (!strncmp(line, "proc4ops", 8))
+ sscanf(line + 8, v4sfmt,
+ &(file_stats.nfsd_accesscnt), &(file_stats.nfsd_getattcnt),
+ &(file_stats.nfsd_readcnt), &(file_stats.nfsd_writecnt));
}
fclose(fp);
}
-
/*
***************************************************************************
* Read stats from /proc/diskstats