]> granicus.if.org Git - zfs/commitdiff
Replace sysctl summary with tunables summary.
authorKyle Blatter <kyleblatter@llnl.gov>
Mon, 12 Jan 2015 21:31:24 +0000 (13:31 -0800)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Wed, 28 Jan 2015 19:05:53 +0000 (11:05 -0800)
The original script displayed tunable parameters using sysctl calls.
This patch modifies this by displaying tunable parameters found in
/sys/modules/zfs/parameters/. modinfo calls are used to capture
descriptions.

Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
Signed-off-by: Kyle Blatter <kyleblatter@llnl.gov>
Signed-off-by: Ned Bass <bass6@llnl.gov>
cmd/arc_summary/arc_summary.py

index bf84ca446bc884e0b131f9b496983260ee86452d..15d844b52657e20ead3693f3aa7ef62ad20306db 100755 (executable)
@@ -46,14 +46,14 @@ import sys
 import time
 import getopt
 import re
-
+from os import listdir
 from subprocess import Popen, PIPE
 from decimal import Decimal as D
 
 
 usetunable = True
-show_sysctl_descriptions = False
-alternate_sysctl_layout = False
+show_tunable_descriptions = False
+alternate_tunable_layout = False
 kstat_pobj = re.compile("^([^:]+):\s+(.+)\s*$", flags=re.M)
 
 
@@ -1016,70 +1016,59 @@ def _vdev_summary(Kstat):
         ))
 
 
-def get_systl_summary(Kstat):
-    output = {}
-    return output
+def _tunable_summary(Kstat):
+    global show_tunable_descriptions
+    global alternate_tunable_layout
 
+    names = listdir("/sys/module/zfs/parameters/")
 
-def _sysctl_summary(Kstat):
-    global show_sysctl_descriptions
-    global alternate_sysctl_layout
+    values = {}
+    for name in names:
+        with open("/sys/module/zfs/parameters/" + name) as f: value = f.read()
+        values[name] = value.strip()
 
-    Tunable = [
-        "kern.maxusers",
-        "vm.kmem_size",
-        "vm.kmem_size_scale",
-        "vm.kmem_size_min",
-        "vm.kmem_size_max",
-        "vfs.zfs"
-    ]
+    descriptions = {}
 
-    if not usetunable:
-        return
-
-    sysctl_descriptions = {}
-    if show_sysctl_descriptions:
-        tunables = " ".join(str(x) for x in Tunable)
-        p = Popen("/sbin/sysctl -qde %s" % tunables, stdin=PIPE,
-            stdout=PIPE, stderr=PIPE, shell=True, close_fds=True)
-        p.wait()
-
-        descriptions = p.communicate()[0].split('\n')
-        if p.returncode != 0:
-            sys.exit(1)
-
-        for tunable in descriptions:
-            if not tunable:
-                continue
-            tunable = tunable.strip()
-            name, description = tunable.split('=')[:2]
-            name = name.strip()
-            description = description.strip()
-            if not description:
-                description = "Description unavailable"
-            sysctl_descriptions[name] = description
-
-    tunables = " ".join(str(x) for x in Tunable)
-    p = Popen("/sbin/sysctl -qe %s" % tunables, stdin=PIPE,
-        stdout=PIPE, stderr=PIPE, shell=True, close_fds=True)
-    p.wait()
-
-    zfs_tunables = p.communicate()[0].split('\n')
-    if p.returncode != 0:
-        sys.exit(1)
-
-    sys.stdout.write("ZFS Tunable (sysctl):\n")
-    for tunable in zfs_tunables:
-        if not tunable:
+    if show_tunable_descriptions:
+        try:
+            command = ["/sbin/modinfo", "zfs", "-0"]
+            p = Popen(command, stdin=PIPE, stdout=PIPE,
+                    stderr=PIPE, shell=False, close_fds=True)
+            p.wait()
+
+            description_list = p.communicate()[0].strip().split('\0')
+
+            if p.returncode == 0:
+                for tunable in description_list:
+                    if tunable[0:5] == 'parm:':
+                        tunable = tunable[5:].strip()
+                        name, description = tunable.split(':', 1)
+                        if not description:
+                            description = "Description unavailable"
+                        descriptions[name] = description
+            else:
+                sys.stderr.write("%s: '%s' exited with code %i\n" %
+                        (sys.argv[0], command[0], p.returncode))
+                sys.stderr.write("Tunable descriptions will be disabled.\n")
+        except OSError as e:
+            sys.stderr.write("%s: Cannot run '%s': %s\n" %
+                    (sys.argv[0], command[0], e.strerror))
+            sys.stderr.write("Tunable descriptions will be disabled.\n")
+
+    sys.stdout.write("ZFS Tunable:\n")
+    for name in names:
+        if not name:
             continue
-        tunable = tunable.strip()
-        name, value = tunable.split("=")[0:2]
-        name = name.strip()
-        value = D(value.strip())
-        format = "\t%s=%d\n" if alternate_sysctl_layout else "\t%-40s%d\n"
-        if show_sysctl_descriptions:
-            sys.stdout.write("\t\# %s\n" % sysctl_descriptions[name])
-        sys.stdout.write(format % (name, value))
+
+        format = "\t%-50s%s\n"
+        if alternate_tunable_layout:
+            format = "\t%s=%s\n"
+
+        if show_tunable_descriptions and descriptions.has_key(name):
+            sys.stdout.write("\t# %s\n" % descriptions[name])
+
+        sys.stdout.write(format % (name, values[name]))
+
 
 unSub = [
     _arc_summary,
@@ -1087,8 +1076,10 @@ unSub = [
     _l2arc_summary,
     _dmu_summary,
     _vdev_summary,
+    _tunable_summary
 ]
 
+
 def zfs_header():
     daydate = time.strftime("%a %b %d %H:%M:%S %Y")
 
@@ -1116,8 +1107,8 @@ def usage():
     sys.stdout.write("\tarc_summary.py --page=2\n")
 
 def main():
-    global show_sysctl_descriptions
-    global alternate_sysctl_layout
+    global show_tunable_descriptions
+    global alternate_tunable_layout
 
     opts, args = getopt.getopt(
         sys.argv[1:], "adp:h", ["alternate", "description", "page=", "help"]
@@ -1137,8 +1128,8 @@ def main():
 
     Kstat = get_Kstat()
 
-    alternate_sysctl_layout = 'a' in args
-    show_sysctl_descriptions = 'd' in args
+    alternate_tunable_layout = 'a' in args
+    show_tunable_descriptions = 'd' in args
 
     pages = []