Przeglądaj źródła

kvm_stat: allow choosing between tracepoints and old stats

The old stats contain information not available in the tracepoints.
By default, keep the old behavior, but allow choosing which set of stats
to present, or even both.

Inspired by a patch from Marcelo Tosatti.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Paolo Bonzini 11 lat temu
rodzic
commit
b763adf1a6
1 zmienionych plików z 41 dodań i 19 usunięć
  1. 41 19
      scripts/kvm/kvm_stat

+ 41 - 19
scripts/kvm/kvm_stat

@@ -352,8 +352,8 @@ class TracepointProvider(object):
         return ret
         return ret
 
 
 class Stats:
 class Stats:
-    def __init__(self, provider, fields = None):
-        self.provider = provider
+    def __init__(self, providers, fields = None):
+        self.providers = providers
         self.fields_filter = fields
         self.fields_filter = fields
         self._update()
         self._update()
     def _update(self):
     def _update(self):
@@ -362,22 +362,25 @@ class Stats:
             if not self.fields_filter:
             if not self.fields_filter:
                 return True
                 return True
             return re.match(self.fields_filter, key) is not None
             return re.match(self.fields_filter, key) is not None
-        self.values = dict([(key, None)
-                            for key in provider.fields()
-                            if wanted(key)])
-        self.provider.select(self.values.keys())
+        self.values = dict()
+        for d in providers:
+            provider_fields = [key for key in d.fields() if wanted(key)]
+            for key in provider_fields:
+                self.values[key] = None
+            d.select(provider_fields)
     def set_fields_filter(self, fields_filter):
     def set_fields_filter(self, fields_filter):
         self.fields_filter = fields_filter
         self.fields_filter = fields_filter
         self._update()
         self._update()
     def get(self):
     def get(self):
-        new = self.provider.read()
-        for key in self.provider.fields():
-            oldval = self.values.get(key, (0, 0))
-            newval = new[key]
-            newdelta = None
-            if oldval is not None:
-                newdelta = newval - oldval[0]
-            self.values[key] = (newval, newdelta)
+        for d in providers:
+            new = d.read()
+            for key in d.fields():
+                oldval = self.values.get(key, (0, 0))
+                newval = new[key]
+                newdelta = None
+                if oldval is not None:
+                    newdelta = newval - oldval[0]
+                self.values[key] = (newval, newdelta)
         return self.values
         return self.values
 
 
 if not os.access('/sys/kernel/debug', os.F_OK):
 if not os.access('/sys/kernel/debug', os.F_OK):
@@ -487,6 +490,18 @@ options.add_option('-l', '--log',
                    dest = 'log',
                    dest = 'log',
                    help = 'run in logging mode (like vmstat)',
                    help = 'run in logging mode (like vmstat)',
                    )
                    )
+options.add_option('-t', '--tracepoints',
+                   action = 'store_true',
+                   default = False,
+                   dest = 'tracepoints',
+                   help = 'retrieve statistics from tracepoints',
+                   )
+options.add_option('-d', '--debugfs',
+                   action = 'store_true',
+                   default = False,
+                   dest = 'debugfs',
+                   help = 'retrieve statistics from debugfs',
+                   )
 options.add_option('-f', '--fields',
 options.add_option('-f', '--fields',
                    action = 'store',
                    action = 'store',
                    default = None,
                    default = None,
@@ -495,12 +510,19 @@ options.add_option('-f', '--fields',
                    )
                    )
 (options, args) = options.parse_args(sys.argv)
 (options, args) = options.parse_args(sys.argv)
 
 
-try:
-    provider = TracepointProvider()
-except:
-    provider = DebugfsProvider()
+providers = []
+if options.tracepoints:
+    providers.append(TracepointProvider())
+if options.debugfs:
+    providers.append(DebugfsProvider())
+
+if len(providers) == 0:
+    try:
+        providers = [TracepointProvider()]
+    except:
+        providers = [DebugfsProvider()]
 
 
-stats = Stats(provider, fields = options.fields)
+stats = Stats(providers, fields = options.fields)
 
 
 if options.log:
 if options.log:
     log(stats)
     log(stats)