From: Lans Carstensen <Lans.Carstensen-hCDZnVt6e3JSwrhanM7KvQ@public.gmane.org>
To: linux-nfs@vger.kernel.org
Subject: [PATCH 4/4] nfs-utils: nfs-iostat.py autofs cleanup and option to sort by ops/s
Date: Mon, 14 Sep 2009 21:57:51 -0700 [thread overview]
Message-ID: <4AAF1ECF.3090209@dreamworks.com> (raw)
Adds --sort option to display mount point stats sorted by ops/s
Adds --list=<n> option to only display stats for first <n> mount points
E.g. the use of "--sort --list=1" should be useful in seeing stats for
only the mountpoint with the highest ops/s.
Signed-off-by: Lans Carstensen <Lans.Carstensen-hCDZnVt6e3JSwrhanM7KvQ@public.gmane.org>
---
tools/nfs-iostat/nfs-iostat.py | 65
++++++++++++++++++++++++++++++++--------
1 files changed, 52 insertions(+), 13 deletions(-)
diff --git a/tools/nfs-iostat/nfs-iostat.py b/tools/nfs-iostat/nfs-iostat.py
index fc2cac8..665b26a 100755
--- a/tools/nfs-iostat/nfs-iostat.py
+++ b/tools/nfs-iostat/nfs-iostat.py
@@ -354,6 +354,12 @@ class DeviceData:
print '\t%7.3f' % rtt_per_op,
print '\t%7.3f' % exe_per_op
+ def ops(self, sample_time):
+ sends = float(self.__rpc_data['rpcsends'])
+ if sample_time == 0:
+ sample_time = float(self.__nfs_data['age'])
+ return (sends / sample_time)
+
def display_iostats(self, sample_time, which):
"""Display NFS and RPC stats in an iostat-like way
"""
@@ -420,7 +426,10 @@ def parse_stats_file(filename):
return ms_dict
-def print_iostat_summary(old, new, devices, time, ac):
+def print_iostat_summary(old, new, devices, time, options):
+ stats = {}
+ diff_stats = {}
+
if old:
# Trim device list to only include intersection of old and new
data,
# this addresses umounts due to autofs mountpoints
@@ -429,15 +438,33 @@ def print_iostat_summary(old, new, devices, time, ac):
devicelist = devices
for device in devicelist:
- stats = DeviceData()
- stats.parse_stats(new[device])
- if not old:
- stats.display_iostats(time, ac)
- else:
+ stats[device] = DeviceData()
+ stats[device].parse_stats(new[device])
+ if old:
old_stats = DeviceData()
old_stats.parse_stats(old[device])
- diff_stats = stats.compare_iostats(old_stats)
- diff_stats.display_iostats(time, ac)
+ diff_stats[device] = stats[device].compare_iostats(old_stats)
+
+ if options.sort:
+ if old:
+ # We now have compared data and can print a comparison
+ # ordered by mountpoint ops per second
+ devicelist.sort(key=lambda x: diff_stats[x].ops(time),
reverse=True)
+ else:
+ # First iteration, just sort by newly parsed ops/s
+ devicelist.sort(key=lambda x: stats[x].ops(time), reverse=True)
+
+ count = 1
+ for device in devicelist:
+ if old:
+ diff_stats[device].display_iostats(time, options.which)
+ else:
+ stats[device].display_iostats(time, options.which)
+
+ count += 1
+ if (count > options.list):
+ return
+
def list_nfs_mounts(givenlist, mountstats):
"""return a list of NFS mounts given a list to validate or
@@ -485,10 +512,10 @@ client are listed.
usage="usage: %prog [ <interval> [ <count> ] ] [ <options> ] [
<mount point> ]",
description=mydescription,
version='version %s' % Iostats_version)
- parser.set_defaults(which=0)
+ parser.set_defaults(which=0, sort=False, list=sys.maxint)
statgroup = OptionGroup(parser, "Statistics Options",
- 'File I/O is displayed unless one of the
following is specified:')
+ 'File I/O is displayed unless one of the
following is specified:')
statgroup.add_option('-a', '--attr',
action="store_const",
dest="which",
@@ -505,6 +532,18 @@ client are listed.
const=3,
help='displays statistics related to the
page cache')
parser.add_option_group(statgroup)
+ displaygroup = OptionGroup(parser, "Display Options",
+ 'Options affecting display format:')
+ displaygroup.add_option('-s', '--sort',
+ action="store_true",
+ dest="sort",
+ help="Sort NFS mount points by ops/second")
+ displaygroup.add_option('-l','--list',
+ action="store",
+ type="int",
+ dest="list",
+ help="only print stats for first LIST mount
points")
+ parser.add_option_group(displaygroup)
(options, args) = parser.parse_args(sys.argv)
@@ -549,12 +588,12 @@ client are listed.
sample_time = 0.0
if not interval_seen:
- print_iostat_summary(old_mountstats, mountstats, devices,
sample_time, options.which)
+ print_iostat_summary(old_mountstats, mountstats, devices,
sample_time, options)
return
if count_seen:
while count != 0:
- print_iostat_summary(old_mountstats, mountstats, devices,
sample_time, options.which)
+ print_iostat_summary(old_mountstats, mountstats, devices,
sample_time, options)
old_mountstats = mountstats
time.sleep(interval)
sample_time = interval
@@ -568,7 +607,7 @@ client are listed.
count -= 1
else:
while True:
- print_iostat_summary(old_mountstats, mountstats, devices,
sample_time, options.which)
+ print_iostat_summary(old_mountstats, mountstats, devices,
sample_time, options)
old_mountstats = mountstats
time.sleep(interval)
sample_time = interval
--
1.5.5.6
next reply other threads:[~2009-09-15 5:00 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-09-15 4:57 Lans Carstensen [this message]
-- strict thread matches above, loose matches on Subject: below --
2009-08-26 4:59 [PATCH 4/4] nfs-utils: nfs-iostat.py autofs cleanup and option to sort by ops/s Lans Carstensen
2009-08-26 14:37 ` Chuck Lever
2009-08-26 14:53 ` Lans Carstensen
2009-08-26 15:47 ` Chuck Lever
2009-08-26 16:57 ` Trond Myklebust
2009-08-26 17:24 ` Chuck Lever
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4AAF1ECF.3090209@dreamworks.com \
--to=lans.carstensen-hcdznvt6e3jswrhanm7kvq@public.gmane.org \
--cc=linux-nfs@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox