|
|
4a2fec |
From 5bf653923c85a01b85fe801b3a752938424ce659 Mon Sep 17 00:00:00 2001
|
|
|
4a2fec |
From: David Hildenbrand <david@redhat.com>
|
|
|
4a2fec |
Date: Tue, 17 Oct 2017 19:15:33 +0200
|
|
|
4a2fec |
Subject: [PATCH 28/69] tools/kvm_stat: reduce perceived idle time on filter
|
|
|
4a2fec |
updates
|
|
|
4a2fec |
MIME-Version: 1.0
|
|
|
4a2fec |
Content-Type: text/plain; charset=UTF-8
|
|
|
4a2fec |
Content-Transfer-Encoding: 8bit
|
|
|
4a2fec |
|
|
|
4a2fec |
RH-Author: David Hildenbrand <david@redhat.com>
|
|
|
4a2fec |
Message-id: <20171017191605.2378-8-david@redhat.com>
|
|
|
4a2fec |
Patchwork-id: 77314
|
|
|
4a2fec |
O-Subject: [RHEL-7.5 qemu-kvm-rhev PATCH 07/39] tools/kvm_stat: reduce perceived idle time on filter updates
|
|
|
4a2fec |
Bugzilla: 1497137
|
|
|
4a2fec |
RH-Acked-by: Paolo Bonzini <pbonzini@redhat.com>
|
|
|
4a2fec |
RH-Acked-by: Cornelia Huck <cohuck@redhat.com>
|
|
|
4a2fec |
RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
|
|
|
4a2fec |
RH-Acked-by: Thomas Huth <thuth@redhat.com>
|
|
|
4a2fec |
|
|
|
4a2fec |
Upstream-status: linux.git 184b2d23b057b35fba7fd4049962a897ef0e3f9d
|
|
|
4a2fec |
|
|
|
4a2fec |
commit 184b2d23b057b35fba7fd4049962a897ef0e3f9d
|
|
|
4a2fec |
Author: Stefan Raspl <raspl@linux.vnet.ibm.com>
|
|
|
4a2fec |
Date: Fri Mar 10 13:40:06 2017 +0100
|
|
|
4a2fec |
|
|
|
4a2fec |
tools/kvm_stat: reduce perceived idle time on filter updates
|
|
|
4a2fec |
|
|
|
4a2fec |
Whenever a user adds a filter, we
|
|
|
4a2fec |
* redraw the header immediately for a snappy response
|
|
|
4a2fec |
* print a message indicating to the user that we're busy while the
|
|
|
4a2fec |
noticeable delay induced by updating all of the stats objects takes place
|
|
|
4a2fec |
* update the statistics ASAP (i.e. after 0.25s instead of 3s) to be
|
|
|
4a2fec |
consistent with behavior on startup
|
|
|
4a2fec |
To do so, we split the Tui's refresh() method to allow for drawing header
|
|
|
4a2fec |
and stats separately, and trigger a header refresh whenever we are about
|
|
|
4a2fec |
to do something that takes a while - like updating filters.
|
|
|
4a2fec |
|
|
|
4a2fec |
Signed-off-by: Stefan Raspl <raspl@linux.vnet.ibm.com>
|
|
|
4a2fec |
Signed-off-by: Radim Krčmář <rkrcmar@redhat.com>
|
|
|
4a2fec |
|
|
|
4a2fec |
Signed-off-by: David Hildenbrand <david@redhat.com>
|
|
|
4a2fec |
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
|
|
|
4a2fec |
---
|
|
|
4a2fec |
scripts/kvm/kvm_stat | 48 ++++++++++++++++++++++++++++++------------------
|
|
|
4a2fec |
1 file changed, 30 insertions(+), 18 deletions(-)
|
|
|
4a2fec |
|
|
|
4a2fec |
diff --git a/scripts/kvm/kvm_stat b/scripts/kvm/kvm_stat
|
|
|
4a2fec |
index 5c4f248..3e60d93 100755
|
|
|
4a2fec |
--- a/scripts/kvm/kvm_stat
|
|
|
4a2fec |
+++ b/scripts/kvm/kvm_stat
|
|
|
4a2fec |
@@ -801,6 +801,8 @@ class Stats(object):
|
|
|
4a2fec |
|
|
|
4a2fec |
LABEL_WIDTH = 40
|
|
|
4a2fec |
NUMBER_WIDTH = 10
|
|
|
4a2fec |
+DELAY_INITIAL = 0.25
|
|
|
4a2fec |
+DELAY_REGULAR = 3.0
|
|
|
4a2fec |
|
|
|
4a2fec |
|
|
|
4a2fec |
class Tui(object):
|
|
|
4a2fec |
@@ -856,13 +858,14 @@ class Tui(object):
|
|
|
4a2fec |
"""Propagates pid selection to stats object."""
|
|
|
4a2fec |
self.stats.pid_filter = pid
|
|
|
4a2fec |
|
|
|
4a2fec |
- def refresh(self, sleeptime):
|
|
|
4a2fec |
- """Refreshes on-screen data."""
|
|
|
4a2fec |
+ def refresh_header(self, pid=None):
|
|
|
4a2fec |
+ """Refreshes the header."""
|
|
|
4a2fec |
+ if pid is None:
|
|
|
4a2fec |
+ pid = self.stats.pid_filter
|
|
|
4a2fec |
self.screen.erase()
|
|
|
4a2fec |
- if self.stats.pid_filter > 0:
|
|
|
4a2fec |
+ if pid > 0:
|
|
|
4a2fec |
self.screen.addstr(0, 0, 'kvm statistics - pid {0}'
|
|
|
4a2fec |
- .format(self.stats.pid_filter),
|
|
|
4a2fec |
- curses.A_BOLD)
|
|
|
4a2fec |
+ .format(pid), curses.A_BOLD)
|
|
|
4a2fec |
else:
|
|
|
4a2fec |
self.screen.addstr(0, 0, 'kvm statistics - summary', curses.A_BOLD)
|
|
|
4a2fec |
self.screen.addstr(2, 1, 'Event')
|
|
|
4a2fec |
@@ -870,7 +873,13 @@ class Tui(object):
|
|
|
4a2fec |
len('Total'), 'Total')
|
|
|
4a2fec |
self.screen.addstr(2, 1 + LABEL_WIDTH + NUMBER_WIDTH + 8 -
|
|
|
4a2fec |
len('Current'), 'Current')
|
|
|
4a2fec |
+ self.screen.addstr(4, 1, 'Collecting data...')
|
|
|
4a2fec |
+ self.screen.refresh()
|
|
|
4a2fec |
+
|
|
|
4a2fec |
+ def refresh_body(self, sleeptime):
|
|
|
4a2fec |
row = 3
|
|
|
4a2fec |
+ self.screen.move(row, 0)
|
|
|
4a2fec |
+ self.screen.clrtobot()
|
|
|
4a2fec |
stats = self.stats.get()
|
|
|
4a2fec |
|
|
|
4a2fec |
def sortkey(x):
|
|
|
4a2fec |
@@ -914,10 +923,12 @@ class Tui(object):
|
|
|
4a2fec |
regex = self.screen.getstr()
|
|
|
4a2fec |
curses.noecho()
|
|
|
4a2fec |
if len(regex) == 0:
|
|
|
4a2fec |
+ self.refresh_header()
|
|
|
4a2fec |
return
|
|
|
4a2fec |
try:
|
|
|
4a2fec |
re.compile(regex)
|
|
|
4a2fec |
self.stats.fields_filter = regex
|
|
|
4a2fec |
+ self.refresh_header()
|
|
|
4a2fec |
return
|
|
|
4a2fec |
except re.error:
|
|
|
4a2fec |
continue
|
|
|
4a2fec |
@@ -944,37 +955,38 @@ class Tui(object):
|
|
|
4a2fec |
|
|
|
4a2fec |
try:
|
|
|
4a2fec |
pid = int(pid)
|
|
|
4a2fec |
-
|
|
|
4a2fec |
- if pid == 0:
|
|
|
4a2fec |
- self.update_pid(pid)
|
|
|
4a2fec |
- break
|
|
|
4a2fec |
- else:
|
|
|
4a2fec |
- if not os.path.isdir(os.path.join('/proc/', str(pid))):
|
|
|
4a2fec |
- continue
|
|
|
4a2fec |
- else:
|
|
|
4a2fec |
- self.update_pid(pid)
|
|
|
4a2fec |
- break
|
|
|
4a2fec |
+ if pid != 0 and not os.path.isdir(os.path.join('/proc/',
|
|
|
4a2fec |
+ str(pid))):
|
|
|
4a2fec |
+ continue
|
|
|
4a2fec |
+ self.refresh_header(pid)
|
|
|
4a2fec |
+ self.update_pid(pid)
|
|
|
4a2fec |
+ break
|
|
|
4a2fec |
|
|
|
4a2fec |
except ValueError:
|
|
|
4a2fec |
continue
|
|
|
4a2fec |
|
|
|
4a2fec |
def show_stats(self):
|
|
|
4a2fec |
"""Refreshes the screen and processes user input."""
|
|
|
4a2fec |
- sleeptime = 0.25
|
|
|
4a2fec |
+ sleeptime = DELAY_INITIAL
|
|
|
4a2fec |
+ self.refresh_header()
|
|
|
4a2fec |
while True:
|
|
|
4a2fec |
- self.refresh(sleeptime)
|
|
|
4a2fec |
+ self.refresh_body(sleeptime)
|
|
|
4a2fec |
curses.halfdelay(int(sleeptime * 10))
|
|
|
4a2fec |
- sleeptime = 3.0
|
|
|
4a2fec |
+ sleeptime = DELAY_REGULAR
|
|
|
4a2fec |
try:
|
|
|
4a2fec |
char = self.screen.getkey()
|
|
|
4a2fec |
if char == 'x':
|
|
|
4a2fec |
+ self.refresh_header()
|
|
|
4a2fec |
self.update_drilldown()
|
|
|
4a2fec |
+ sleeptime = DELAY_INITIAL
|
|
|
4a2fec |
if char == 'q':
|
|
|
4a2fec |
break
|
|
|
4a2fec |
if char == 'f':
|
|
|
4a2fec |
self.show_filter_selection()
|
|
|
4a2fec |
+ sleeptime = DELAY_INITIAL
|
|
|
4a2fec |
if char == 'p':
|
|
|
4a2fec |
self.show_vm_selection()
|
|
|
4a2fec |
+ sleeptime = DELAY_INITIAL
|
|
|
4a2fec |
except KeyboardInterrupt:
|
|
|
4a2fec |
break
|
|
|
4a2fec |
except curses.error:
|
|
|
4a2fec |
--
|
|
|
4a2fec |
1.8.3.1
|
|
|
4a2fec |
|