203 lines
8.1 KiB
Diff
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))
|