All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Radim Krčmář" <rkrcmar@redhat.com>
To: Stefan Raspl <raspl@linux.vnet.ibm.com>
Cc: kvm@vger.kernel.org, pbonzini@redhat.com, frankja@linux.vnet.ibm.com
Subject: Re: [PATCH v2 16/17] tools/kvm_stat: add interactive command 'r'
Date: Wed, 15 Mar 2017 22:53:27 +0100	[thread overview]
Message-ID: <20170315215327.GI14081@potion> (raw)
In-Reply-To: <20170310124016.96319-17-raspl@linux.vnet.ibm.com>

2017-03-10 13:40+0100, Stefan Raspl:
> Provide an interactive command to reset the tracepoint statistics.
> Requires some extra work for debugfs, as the counters cannot be reset.
> 
> On the up side, this offers us the opportunity to have debugfs values
> reset on startup and whenever a filter is modified, becoming consistent
> with the tracepoint provider. As a bonus, 'kvmstat -dt' will now provide
> useful output, instead of mixing values in totally different orders of
> magnitude.
> Furthermore, we avoid unnecessary resets when any of the filters is
> "changed" interactively to the previous value.
> 
> Signed-off-by: Stefan Raspl <raspl@linux.vnet.ibm.com>
> Acked-by: Janosch Frank <frankja@linux.vnet.ibm.com>
> ---
>  tools/kvm/kvm_stat/kvm_stat     | 65 ++++++++++++++++++++++++++++++++---------
>  tools/kvm/kvm_stat/kvm_stat.txt |  2 ++
>  2 files changed, 53 insertions(+), 14 deletions(-)
> 
> diff --git a/tools/kvm/kvm_stat/kvm_stat b/tools/kvm/kvm_stat/kvm_stat
> index 676a92a..f8c48f8 100755
> --- a/tools/kvm/kvm_stat/kvm_stat
> +++ b/tools/kvm/kvm_stat/kvm_stat
> @@ -716,15 +716,23 @@ class TracepointProvider(object):
>                      ret[name] += val
>          return ret
>  
> +    def reset(self):
> +        """Reset all field counters"""
> +        for group in self.group_leaders:
> +            for event in group.events:
> +                event.reset()
> +
>  
>  class DebugfsProvider(object):
>      """Provides data from the files that KVM creates in the kvm debugfs
>      folder."""
>      def __init__(self):
>          self._fields = self.get_available_fields()
> +        self._baseline = {}
>          self._pid = 0
>          self.do_read = True
>          self.paths = []
> +        self.reset()
>  
>      def get_available_fields(self):
>          """"Returns a list of available fields.
> @@ -741,6 +749,7 @@ class DebugfsProvider(object):
>      @fields.setter
>      def fields(self, fields):
>          self._fields = fields
> +        self.reset()
>  
>      @property
>      def pid(self):
> @@ -758,10 +767,11 @@ class DebugfsProvider(object):
>              self.paths = filter(lambda x: "{}-".format(pid) in x, vms)
>  
>          else:
> -            self.paths = ['']
> +            self.paths = []
>              self.do_read = True
> +        self.reset()
>  
> -    def read(self):
> +    def read(self, reset=0):
>          """Returns a dict with format:'file name / field -> current value'."""
>          results = {}
>  
> @@ -769,10 +779,22 @@ class DebugfsProvider(object):
>          if not self.do_read:
>              return results
>  
> -        for path in self.paths:
> +        paths = self.paths
> +        if self._pid == 0:
> +            paths = []
> +            for entry in os.walk(PATH_DEBUGFS_KVM):
> +                for dir in entry[1]:
> +                    paths.append(dir)
> +        for path in paths:
>              for field in self._fields:
> -                results[field] = results.get(field, 0) \
> -                                 + self.read_field(field, path)
> +                value = self.read_field(field, path)
> +                key = path + field
> +                if reset:
> +                    self._baseline[key] = value
> +                if self._baseline.get(key, -1) == -1:
> +                    self._baseline[key] = value
> +                results[field] = (results.get(field, 0) + value -
> +                                  self._baseline.get(key, 0))
>  
>          return results
>  
> @@ -786,6 +808,11 @@ class DebugfsProvider(object):
>          except IOError:
>              return 0
>  
> +    def reset(self):
> +        """Reset field counters"""
> +        self._baseline = {}
> +        self.read(1)
> +
>  
>  class Stats(object):
>      """Manages the data providers and the data they provide.
> @@ -822,14 +849,20 @@ class Stats(object):
>          for provider in self.providers:
>              provider.pid = self._pid_filter
>  
> +    def reset(self):
> +        self.values = {}
> +        for provider in self.providers:
> +            provider.reset()
> +
>      @property
>      def fields_filter(self):
>          return self._fields_filter
>  
>      @fields_filter.setter
>      def fields_filter(self, fields_filter):
> -        self._fields_filter = fields_filter
> -        self.update_provider_filters()
> +        if fields_filter != self._fields_filter:
> +            self._fields_filter = fields_filter
> +            self.update_provider_filters()
>  
>      @property
>      def pid_filter(self):
> @@ -837,9 +870,10 @@ class Stats(object):
>  
>      @pid_filter.setter
>      def pid_filter(self, pid):
> -        self._pid_filter = pid
> -        self.values = {}
> -        self.update_provider_pid()
> +        if pid != self._pid_filter:
> +            self._pid_filter = pid
> +            self.values = {}
> +            self.update_provider_pid()
>  
>      def get(self):
>          """Returns a dict with field -> (value, delta to last value) of all
> @@ -847,11 +881,9 @@ class Stats(object):
>          for provider in self.providers:
>              new = provider.read()
>              for key in provider.fields:
> -                oldval = self.values.get(key, (0, 0))
> +                oldval = self.values.get(key, (0, 0))[0]
>                  newval = new.get(key, 0)
> -                newdelta = None
> -                if oldval is not None:
> -                    newdelta = newval - oldval[0]
> +                newdelta = newval - oldval
>                  self.values[key] = (newval, newdelta)
>          return self.values
>  
> @@ -1117,6 +1149,10 @@ class Tui(object):
>                  if char == 'p':
>                      self.show_vm_selection_by_pid()
>                      sleeptime = DELAY_INITIAL
> +                if char == 'r':

Could be turned into elif.

> +                    self.refresh_header()
> +                    self.stats.reset()
> +                    sleeptime = DELAY_INITIAL
>              except KeyboardInterrupt:
>                  break
>              except curses.error:
> @@ -1190,6 +1226,7 @@ Interactive Commands:
>     p     filter by PID
>     q     quit
>     x     toggle reporting of stats for individual child trace events
> +   r     reset stats
>  Press any other key to refresh statistics immediately.
>  """
>  
> diff --git a/tools/kvm/kvm_stat/kvm_stat.txt b/tools/kvm/kvm_stat/kvm_stat.txt
> index c3ab6a2..109431b 100644
> --- a/tools/kvm/kvm_stat/kvm_stat.txt
> +++ b/tools/kvm/kvm_stat/kvm_stat.txt
> @@ -39,6 +39,8 @@ INTERACTIVE COMMANDS
>  
>  *q*::	quit
>  
> +*r*::	reset stats
> +
>  *x*::	toggle reporting of stats for child trace events
>  
>  Press any other key to refresh statistics immediately.
> -- 
> 2.8.4
> 

  reply	other threads:[~2017-03-15 21:53 UTC|newest]

Thread overview: 23+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-03-10 12:39 [PATCH v2 00/17] tools/kvm_stat: Misc Patches Stefan Raspl
2017-03-10 12:40 ` [PATCH v2 01/17] tools/kvm_stat: hide cursor Stefan Raspl
2017-03-10 12:40 ` [PATCH v2 02/17] tools/kvm_stat: catch curses exceptions only Stefan Raspl
2017-03-10 12:40 ` [PATCH v2 03/17] tools/kvm_stat: handle SIGINT in log and batch modes Stefan Raspl
2017-03-15 21:54   ` Radim Krčmář
2017-03-10 12:40 ` [PATCH v2 04/17] tools/kvm_stat: fix misc glitches Stefan Raspl
2017-03-10 12:40 ` [PATCH v2 05/17] tools/kvm_stat: fix trace setup glitch on field updates in TracepointProvider Stefan Raspl
2017-03-10 12:40 ` [PATCH v2 06/17] tools/kvm_stat: full PEP8 compliance Stefan Raspl
2017-03-10 12:40 ` [PATCH v2 07/17] tools/kvm_stat: reduce perceived idle time on filter updates Stefan Raspl
2017-03-10 12:40 ` [PATCH v2 08/17] tools/kvm_stat: document list of interactive commands Stefan Raspl
2017-03-10 12:40 ` [PATCH v2 09/17] tools/kvm_stat: display guest name when using pid filter Stefan Raspl
2017-03-10 12:40 ` [PATCH v2 10/17] tools/kvm_stat: remove pid filter on empty input Stefan Raspl
2017-03-10 12:40 ` [PATCH v2 11/17] tools/kvm_stat: print error messages on faulty pid filter input Stefan Raspl
2017-03-10 12:40 ` [PATCH v2 12/17] tools/kvm_stat: display regex when set to non-default Stefan Raspl
2017-03-10 12:40 ` [PATCH v2 13/17] tools/kvm_stat: remove regex filter on empty input Stefan Raspl
2017-03-10 12:40 ` [PATCH v2 14/17] tools/kvm_stat: add option '--guest' Stefan Raspl
2017-03-10 12:40 ` [PATCH v2 15/17] tools/kvm_stat: add interactive command 'c' Stefan Raspl
2017-03-10 12:40 ` [PATCH v2 16/17] tools/kvm_stat: add interactive command 'r' Stefan Raspl
2017-03-15 21:53   ` Radim Krčmář [this message]
2017-03-10 12:40 ` [PATCH v2 17/17] tools/kvm_stat: add '%Total' column Stefan Raspl
2017-03-15 21:52   ` Radim Krčmář
2017-03-15 21:36 ` [PATCH v2 00/17] tools/kvm_stat: Misc Patches Radim Krčmář
2017-03-17  7:08   ` Stefan Raspl

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=20170315215327.GI14081@potion \
    --to=rkrcmar@redhat.com \
    --cc=frankja@linux.vnet.ibm.com \
    --cc=kvm@vger.kernel.org \
    --cc=pbonzini@redhat.com \
    --cc=raspl@linux.vnet.ibm.com \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.