public inbox for linux-nfs@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH 4/4] nfs-utils: nfs-iostat.py autofs cleanup and option to sort by ops/s
@ 2009-08-26  4:59 Lans Carstensen
  2009-08-26 14:37 ` Chuck Lever
  0 siblings, 1 reply; 7+ messages in thread
From: Lans Carstensen @ 2009-08-26  4:59 UTC (permalink / raw)
  To: NFS list

commit 062577877bd3f1d8da1edeb889a09d380da83364
Author: Lans Carstensen <Lans.Carstensen@dreamworks.com>
Date:   Tue Aug 25 21:53:54 2009 -0700

     Adds --sort option to display mount point stats sorted by ops/s
     Adds -<n> option to only display stats for first <n> mount points
     E.g. the use of "--sort -1" should be useful in seeing stats for
     only the mountpoint with the highest ops/s.

diff --git a/tools/nfs-iostat/nfs-iostat.py b/tools/nfs-iostat/nfs-iostat.py
index 9f3b3eb..5df9bfb 100644
--- a/tools/nfs-iostat/nfs-iostat.py
+++ b/tools/nfs-iostat/nfs-iostat.py
@@ -20,7 +20,7 @@ along with this program; if not, write to the Free 
Software
  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
  """

-import sys, os, time
+import sys, os, time, re

  Iostats_version = '0.3'

@@ -353,6 +353,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
          """
@@ -421,6 +427,11 @@ def print_iostat_help(name):
      print ' If one or more <mount point> names are specified, 
statistics for only these'
      print ' mount points will be displayed.  Otherwise, all NFS mount 
points on the'
      print ' client are listed.'
+    print
+    print ' You can also specify "--sort" to sort the NFS mount points 
by ops/second,'
+    print ' and specify a number of mount points to return with -<num>, 
e.g. -1.'
+    print ' For example, use of "--sort -1" will iterate only showing 
you the stats'
+    print ' for the mount point with the highest ops/second.'

  def parse_stats_file(filename):
      """pop the contents of a mountstats file into a dictionary,
@@ -446,7 +457,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, ac, sortbyops, 
entrycount):
+    diff_stats = {}
+    count = 1
+
      if old:
          # Trim device list to only include intersection of old and new 
data,
          # this addresses umounts due to autofs mountpoints
@@ -455,15 +469,34 @@ def print_iostat_summary(old, new, devices, time, ac):
          devicelist = devices

      for device in devicelist:
+        count += 1
          stats = DeviceData()
          stats.parse_stats(new[device])
          if not old:
              stats.display_iostats(time, ac)
+            if (count>entrycount):
+                return
          else:
              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.compare_iostats(old_stats)
+            if not sortbyops:
+                diff_stats[device].display_iostats(time, ac)
+                if (count>entrycount):
+                    return
+
+    if old and sortbyops:
+        # We now have compared data and can print a comparison
+        # ordered by mountpoint ops per second
+        count = 1
+
+        devicelist.sort(key=lambda x: diff_stats[x].ops(time), 
reverse=True)
+
+        for device in devicelist:
+            count += 1
+            diff_stats[device].display_iostats(time, ac)
+            if (count>entrycount):
+                return

  def list_nfs_mounts(givenlist, mountstats):
      """return a list of NFS mounts given a list to validate or
@@ -497,6 +530,8 @@ def iostat_command(name):
      which = 0
      interval_seen = False
      count_seen = False
+    sortbyops = False
+    entrycount = sys.maxint

      for arg in sys.argv:
          if arg in ['-h', '--help', 'help', 'usage']:
@@ -507,6 +542,19 @@ def iostat_command(name):
              print '%s version %s' % (name, Iostats_version)
              return

+        if arg in ['-s', '--sort', 'sort']:
+            sortbyops = True
+            # sorted display infers a loop, default to 1 second
+            if not interval_seen:
+                interval = 1
+                interval_seen = True
+            continue
+
+        stop_re = re.compile('-[0-9]+')
+        if stop_re.match(arg):
+            entrycount = int(arg.lstrip('-'))
+            continue
+
          if arg in ['-a', '--attr']:
              which = 1
              continue
@@ -546,12 +594,12 @@ def iostat_command(name):
      sample_time = 0.0

      if not interval_seen:
-        print_iostat_summary(old_mountstats, mountstats, devices, 
sample_time, which)
+        print_iostat_summary(old_mountstats, mountstats, devices, 
sample_time, which, sortbyops, entrycount)
          return

      if count_seen:
          while count != 0:
-            print_iostat_summary(old_mountstats, mountstats, devices, 
sample_time, which)
+            print_iostat_summary(old_mountstats, mountstats, devices, 
sample_time, which, sortbyops, entrycount)
              old_mountstats = mountstats
              time.sleep(interval)
              sample_time = interval
@@ -562,7 +610,7 @@ def iostat_command(name):
              count -= 1
      else:
          while True:
-            print_iostat_summary(old_mountstats, mountstats, devices, 
sample_time, which)
+            print_iostat_summary(old_mountstats, mountstats, devices, 
sample_time, which, sortbyops, entrycount)
              old_mountstats = mountstats
              time.sleep(interval)
              sample_time = interval




^ permalink raw reply related	[flat|nested] 7+ messages in thread
* [PATCH 4/4] nfs-utils: nfs-iostat.py autofs cleanup and option to sort by ops/s
@ 2009-09-15  4:57 Lans Carstensen
  0 siblings, 0 replies; 7+ messages in thread
From: Lans Carstensen @ 2009-09-15  4:57 UTC (permalink / raw)
  To: linux-nfs

  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




^ permalink raw reply related	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2009-09-15  5:00 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
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
  -- strict thread matches above, loose matches on Subject: below --
2009-09-15  4:57 Lans Carstensen

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox