From 5f06c2b5e18990a2d62987ea06bdf5afb8306a2d Mon Sep 17 00:00:00 2001 From: Lans Carstensen Date: Tue, 15 Sep 2009 14:42:47 -0400 Subject: [PATCH] nfs-utils: nfs-iostat.py autofs cleanup and option to sort by ops/s Adds --sort option to display mount point stats sorted by ops/s Adds --list= option to only display stats for first 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 Signed-off-by: Steve Dickson --- tools/nfs-iostat/nfs-iostat.py | 65 +++++++++++++++++++++++++++------- 1 file changed, 52 insertions(+), 13 deletions(-) diff --git a/tools/nfs-iostat/nfs-iostat.py b/tools/nfs-iostat/nfs-iostat.py index 5c46f92..2d0b143 100644 --- 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 [ [ ] ] [ ] [ ]", 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 -- 2.39.5