sysstat/sysstat-8.0.4-nfs_ext.patch
2008-03-06 11:34:34 +00:00

203 lines
8.1 KiB
Diff

diff -up sysstat-8.0.4/man/iostat.1.pom sysstat-8.0.4/man/iostat.1
--- sysstat-8.0.4/man/iostat.1.pom 2007-11-10 14:41:02.000000000 +0100
+++ sysstat-8.0.4/man/iostat.1 2008-03-06 10:21:45.000000000 +0100
@@ -3,7 +3,7 @@
iostat \- Report Central Processing Unit (CPU) statistics and input/output
statistics for devices, partitions and network filesystems (NFS).
.SH SYNOPSIS
-.B iostat [ -c ] [ -d ] [ -N ] [ -n ] [ -k | -m ] [ -t ] [ -V ] [ -x ] [
+.B iostat [ -c ] [ -d ] [ -N ] [ -n ] [ -h ] [ -k | -m ] [ -t ] [ -V ] [ -x ] [
.I device
.B [ ... ] | ALL ] [ -p [
.I device
@@ -409,6 +409,19 @@ NFS READ request.
.RS
Indicate the number of megabytes written to the server by the NFS client via an
NFS WRITE request.
+
+.RE
+.B rops/s
+.RS
+Indicate the number of read operations that were issued to the mount point
+per second
+
+.RE
+.B wops/s
+.RS
+Indicate the number of write operations that were issued to the mount point
+per second
+
.RE
.RE
.SH OPTIONS
@@ -429,6 +442,8 @@ Useful for viewing LVM2 statistics.
.IP -n
Display the network filesystem (NFS) report. This option works only with kernel
2.6.17 and later.
+.IP -h
+Display the NFS report more human readable.
.IP "-p [ { device | ALL } ]"
The -p option is exclusive of the -x option and displays statistics for
block devices and all their partitions that are used by the system.
diff -up sysstat-8.0.4/iostat.c.pom sysstat-8.0.4/iostat.c
--- sysstat-8.0.4/iostat.c.pom 2008-01-01 10:26:31.000000000 +0100
+++ sysstat-8.0.4/iostat.c 2008-03-06 12:13:01.000000000 +0100
@@ -73,7 +73,7 @@ void usage(char *progname)
{
fprintf(stderr, _("Usage: %s [ options... ] [ <interval> [ <count> ] ]\n"
"Options are:\n"
- "[ -c ] [ -d ] [ -N ] [ -n ] [ -k | -m ] [ -t ] [ -V ] [ -x ]\n"
+ "[ -c ] [ -d ] [ -N ] [ -n ] [ -h ] [ -k | -m ] [ -t ] [ -V ] [ -x ]\n"
"[ <device> [ ... ] | ALL ] [ -p [ <device> | ALL ] ]\n"),
progname);
exit(1);
@@ -843,10 +843,11 @@ void read_ppartitions_stat(int curr, int
void read_nfs_stat(int curr, int flags)
{
FILE *fp;
- int i, sw = 0;
+ int sw = 0;
char line[8192];
+ char *xprt_line;
char nfs_name[MAX_NAME_LEN];
- char mount[10], on[10], bytes[10], aux[32];
+ char mount[10], on[10], prefix[10], aux[32];
struct io_nfs_stats snfs;
/* Every I/O NFS entry is potentially unregistered */
@@ -869,15 +870,45 @@ void read_nfs_stat(int curr, int flags)
}
}
- sscanf(line, "%10s", bytes);
- if (sw && (!strncmp(bytes, "bytes:", 6))) {
+ sscanf(line, "%10s", prefix);
+ if (sw && (!strncmp(prefix, "bytes:", 6))) {
/* Read the stats for the last NFS-mounted directory */
- i = sscanf(strstr(line, "bytes:") + 6, "%llu %llu %llu %llu %llu %llu",
+ sscanf(strstr(line, "bytes:") + 6, "%llu %llu %llu %llu %llu %llu",
&snfs.rd_normal_bytes, &snfs.wr_normal_bytes, &snfs.rd_direct_bytes,
&snfs.wr_direct_bytes, &snfs.rd_server_bytes, &snfs.wr_server_bytes);
- save_stats(nfs_name, curr, &snfs, ionfs_nr, st_hdr_ionfs);
- sw = 0;
+ sw = 2;
+ }
+
+ if ((sw==2) && (!strncmp(prefix,"xprt:", 5))) {
+ /* Read extended statistic for the last NFS-mounted directory
+ - number of sent rpc requests*/
+ xprt_line=(strstr(line,"xprt:")+6);
+ /* upc, tcp or rdma data */
+
+ if (!strncmp(xprt_line,"udp",3)) {
+ /* port, bind_count, sends, recvs, bad_xids, req_u, bklog_u */
+ sscanf(strstr(xprt_line,"udp")+4, "%*u %*u %lu %lu %*u %*u %*u",
+ &snfs.rpc_sends, &snfs.rpc_recvs);
+ }
+
+ if (!strncmp(xprt_line,"tcp",3)) {
+ /* port, bind_counter, connect_count, connect_time, idle_time,
+ sends, recvs, bad_xids, req_u, bklog_u*/
+ sscanf(strstr(xprt_line,"tcp")+4, "%*u %*u %*u %*u %*d %lu %lu %*u %*u %*u",
+ &snfs.rpc_sends, &snfs.rpc_recvs);
+ }
+
+ if (!strncmp(xprt_line,"rdma",4)) {
+ /* 0(port), bind_count, connect_count, connect_time, idle_time
+ sends, recvs, bad_xids, req_u, bklog_u
+ ... */
+ sscanf(strstr(xprt_line,"rdma")+5,"%*u %*u %*u %*u %*d %lu %lu %*u %*u %*u "
+ "%*u %*u %*u %*u %*u %*u %*u %*u %*u %*u\n",
+ &snfs.rpc_sends, &snfs.rpc_recvs);
+ }
+ save_stats(nfs_name, curr, &snfs, ionfs_nr, st_hdr_ionfs);
+ sw = 0;
}
}
@@ -957,15 +988,15 @@ void write_nfs_stat_header(int flags, in
{
printf("Filesystem: ");
if (DISPLAY_KILOBYTES(flags)) {
- printf(" rkB_nor/s wkB_nor/s rkB_dir/s wkB_dir/s rkB_svr/s wkB_svr/s\n");
+ printf(" rkB_nor/s wkB_nor/s rkB_dir/s wkB_dir/s rkB_svr/s wkB_svr/s rops/s wops/s\n");
*fctr = 1024;
}
else if (DISPLAY_MEGABYTES(flags)) {
- printf(" rMB_nor/s wMB_nor/s rMB_dir/s wMB_dir/s rMB_svr/s wMB_svr/s\n");
+ printf(" rMB_nor/s wMB_nor/s rMB_dir/s wMB_dir/s rMB_svr/s wMB_svr/s rops/s wops/s\n");
*fctr = 1024 * 1024;
}
else {
- printf(" rBlk_nor/s wBlk_nor/s rBlk_dir/s wBlk_dir/s rBlk_svr/s wBlk_svr/s\n");
+ printf(" rBlk_nor/s wBlk_nor/s rBlk_dir/s wBlk_dir/s rBlk_svr/s wBlk_svr/s rops/s wops/s\n");
*fctr = 512;
}
}
@@ -1084,14 +1115,19 @@ void write_nfs_stat(int curr, unsigned l
struct io_hdr_stats *shi, struct io_nfs_stats *ioni,
struct io_nfs_stats *ionj)
{
- printf("%-22s %12.2f %12.2f %12.2f %12.2f %12.2f %12.2f\n",
- shi->name,
- S_VALUE(ionj->rd_normal_bytes, ioni->rd_normal_bytes, itv) / fctr,
+ if (DISPLAY_HUMAN_READABLE(flags))
+ printf("%-22s \n%23s", shi-> name,"");
+ else
+ printf("%-22s ", shi->name);
+ printf("%12.2f %12.2f %12.2f %12.2f %12.2f %12.2f %9.2f %9.2f \n",
+ S_VALUE(ionj->rd_normal_bytes, ioni->rd_normal_bytes, itv) / fctr,
S_VALUE(ionj->wr_normal_bytes, ioni->wr_normal_bytes, itv) / fctr,
S_VALUE(ionj->rd_direct_bytes, ioni->rd_direct_bytes, itv) / fctr,
S_VALUE(ionj->wr_direct_bytes, ioni->wr_direct_bytes, itv) / fctr,
S_VALUE(ionj->rd_server_bytes, ioni->rd_server_bytes, itv) / fctr,
- S_VALUE(ionj->wr_server_bytes, ioni->wr_server_bytes, itv) / fctr);
+ S_VALUE(ionj->wr_server_bytes, ioni->wr_server_bytes, itv) / fctr,
+ S_VALUE(ionj->rpc_sends, ioni->rpc_sends, itv),
+ S_VALUE(ionj->rpc_recvs, ioni->rpc_recvs, itv));
}
@@ -1353,6 +1389,11 @@ int main(int argc, char **argv)
flags |= I_D_DISK; /* Display disk utilization */
break;
+ case 'h':
+ /* Display NFS stats human readable*/
+ flags |= I_D_HUMAN_READABLE;
+ break;
+
case 'k':
if (DISPLAY_MEGABYTES(flags))
usage(argv[0]);
diff -up sysstat-8.0.4/iostat.h.pom sysstat-8.0.4/iostat.h
--- sysstat-8.0.4/iostat.h.pom 2008-01-01 10:26:31.000000000 +0100
+++ sysstat-8.0.4/iostat.h 2008-03-06 11:04:05.000000000 +0100
@@ -27,6 +27,7 @@
#define I_F_HAS_NFS 0x08000
#define I_D_DEVMAP_NAME 0x10000
#define I_D_ISO 0x20000
+#define I_D_HUMAN_READABLE 0x40000
#define DISPLAY_CPU(m) (((m) & I_D_CPU) == I_D_CPU)
#define DISPLAY_DISK(m) (((m) & I_D_DISK) == I_D_DISK)
@@ -46,6 +47,7 @@
#define HAS_NFS(m) (((m) & I_F_HAS_NFS) == I_F_HAS_NFS)
#define DISPLAY_DEVMAP_NAME(m) (((m) & I_D_DEVMAP_NAME) == I_D_DEVMAP_NAME)
#define DISPLAY_ISO(m) (((m) & I_D_ISO) == I_D_ISO)
+#define DISPLAY_HUMAN_READABLE(m) (((m) & I_D_HUMAN_READABLE) == I_D_HUMAN_READABLE)
#define DT_DEVICE 0
#define DT_PARTITION 1
@@ -120,6 +122,9 @@ struct io_nfs_stats {
unsigned long long wr_direct_bytes __attribute__ ((packed));
unsigned long long rd_server_bytes __attribute__ ((packed));
unsigned long long wr_server_bytes __attribute__ ((packed));
+ unsigned long rpc_sends __attribute__ ((packed));
+ unsigned long rpc_recvs __attribute__ ((packed));
+
};
#define IO_NFS_STATS_SIZE (sizeof(struct io_nfs_stats))