|
|
4a2fec |
From 25c56e3212fa11d526544b402f4f19234cf991e8 Mon Sep 17 00:00:00 2001
|
|
|
4a2fec |
From: David Hildenbrand <david@redhat.com>
|
|
|
4a2fec |
Date: Tue, 17 Oct 2017 19:15:58 +0200
|
|
|
4a2fec |
Subject: [PATCH 53/69] tools/kvm_stat: add new interactive command 's'
|
|
|
4a2fec |
|
|
|
4a2fec |
RH-Author: David Hildenbrand <david@redhat.com>
|
|
|
4a2fec |
Message-id: <20171017191605.2378-33-david@redhat.com>
|
|
|
4a2fec |
Patchwork-id: 77336
|
|
|
4a2fec |
O-Subject: [RHEL-7.5 qemu-kvm-rhev PATCH 32/39] tools/kvm_stat: add new interactive command 's'
|
|
|
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 64eefad2cdbf2d7c76e24d0b67e19efdbe1c97a9
|
|
|
4a2fec |
|
|
|
4a2fec |
Convertion of documentation (for man page generation) to texi.
|
|
|
4a2fec |
|
|
|
4a2fec |
commit 64eefad2cdbf2d7c76e24d0b67e19efdbe1c97a9
|
|
|
4a2fec |
Author: Stefan Raspl <raspl@linux.vnet.ibm.com>
|
|
|
4a2fec |
Date: Wed Jun 7 21:08:39 2017 +0200
|
|
|
4a2fec |
|
|
|
4a2fec |
tools/kvm_stat: add new interactive command 's'
|
|
|
4a2fec |
|
|
|
4a2fec |
Add new command 's' to modify the update interval. Limited to a maximum of
|
|
|
4a2fec |
25.5 sec and a minimum of 0.1 sec, since curses cannot handle longer
|
|
|
4a2fec |
and shorter delays respectively.
|
|
|
4a2fec |
|
|
|
4a2fec |
Signed-off-by: Stefan Raspl <raspl@linux.vnet.ibm.com>
|
|
|
4a2fec |
Signed-off-by: Paolo Bonzini <pbonzini@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 | 55 ++++++++++++++++++++++++++++++++++++++++-------
|
|
|
4a2fec |
scripts/kvm/kvm_stat.texi | 3 +++
|
|
|
4a2fec |
2 files changed, 50 insertions(+), 8 deletions(-)
|
|
|
4a2fec |
|
|
|
4a2fec |
diff --git a/scripts/kvm/kvm_stat b/scripts/kvm/kvm_stat
|
|
|
4a2fec |
index 6838de3..1276b88 100755
|
|
|
4a2fec |
--- a/scripts/kvm/kvm_stat
|
|
|
4a2fec |
+++ b/scripts/kvm/kvm_stat
|
|
|
4a2fec |
@@ -844,8 +844,7 @@ class Stats(object):
|
|
|
4a2fec |
self.values[key] = (newval, newdelta)
|
|
|
4a2fec |
return self.values
|
|
|
4a2fec |
|
|
|
4a2fec |
-DELAY_INITIAL = 0.25
|
|
|
4a2fec |
-DELAY_REGULAR = 3.0
|
|
|
4a2fec |
+DELAY_DEFAULT = 3.0
|
|
|
4a2fec |
MAX_GUEST_NAME_LEN = 48
|
|
|
4a2fec |
MAX_REGEX_LEN = 44
|
|
|
4a2fec |
DEFAULT_REGEX = r'^[^\(]*$'
|
|
|
4a2fec |
@@ -856,6 +855,8 @@ class Tui(object):
|
|
|
4a2fec |
def __init__(self, stats):
|
|
|
4a2fec |
self.stats = stats
|
|
|
4a2fec |
self.screen = None
|
|
|
4a2fec |
+ self._delay_initial = 0.25
|
|
|
4a2fec |
+ self._delay_regular = DELAY_DEFAULT
|
|
|
4a2fec |
|
|
|
4a2fec |
def __enter__(self):
|
|
|
4a2fec |
"""Initialises curses for later use. Based on curses.wrapper
|
|
|
4a2fec |
@@ -1027,6 +1028,7 @@ class Tui(object):
|
|
|
4a2fec |
' p filter by PID',
|
|
|
4a2fec |
' q quit',
|
|
|
4a2fec |
' r reset stats',
|
|
|
4a2fec |
+ ' s set update interval',
|
|
|
4a2fec |
' x toggle reporting of stats for individual child trace'
|
|
|
4a2fec |
' events',
|
|
|
4a2fec |
'Any other key refreshes statistics immediately')
|
|
|
4a2fec |
@@ -1106,10 +1108,41 @@ class Tui(object):
|
|
|
4a2fec |
self.refresh_header(pid)
|
|
|
4a2fec |
self.update_pid(pid)
|
|
|
4a2fec |
break
|
|
|
4a2fec |
-
|
|
|
4a2fec |
except ValueError:
|
|
|
4a2fec |
msg = '"' + str(pid) + '": Not a valid pid'
|
|
|
4a2fec |
|
|
|
4a2fec |
+ def show_set_update_interval(self):
|
|
|
4a2fec |
+ """Draws update interval selection mask."""
|
|
|
4a2fec |
+ msg = ''
|
|
|
4a2fec |
+ while True:
|
|
|
4a2fec |
+ self.screen.erase()
|
|
|
4a2fec |
+ self.screen.addstr(0, 0, 'Set update interval (defaults to %fs).' %
|
|
|
4a2fec |
+ DELAY_DEFAULT, curses.A_BOLD)
|
|
|
4a2fec |
+ self.screen.addstr(4, 0, msg)
|
|
|
4a2fec |
+ self.screen.addstr(2, 0, 'Change delay from %.1fs to ' %
|
|
|
4a2fec |
+ self._delay_regular)
|
|
|
4a2fec |
+ curses.echo()
|
|
|
4a2fec |
+ val = self.screen.getstr()
|
|
|
4a2fec |
+ curses.noecho()
|
|
|
4a2fec |
+
|
|
|
4a2fec |
+ try:
|
|
|
4a2fec |
+ if len(val) > 0:
|
|
|
4a2fec |
+ delay = float(val)
|
|
|
4a2fec |
+ if delay < 0.1:
|
|
|
4a2fec |
+ msg = '"' + str(val) + '": Value must be >=0.1'
|
|
|
4a2fec |
+ continue
|
|
|
4a2fec |
+ if delay > 25.5:
|
|
|
4a2fec |
+ msg = '"' + str(val) + '": Value must be <=25.5'
|
|
|
4a2fec |
+ continue
|
|
|
4a2fec |
+ else:
|
|
|
4a2fec |
+ delay = DELAY_DEFAULT
|
|
|
4a2fec |
+ self._delay_regular = delay
|
|
|
4a2fec |
+ break
|
|
|
4a2fec |
+
|
|
|
4a2fec |
+ except ValueError:
|
|
|
4a2fec |
+ msg = '"' + str(val) + '": Invalid value'
|
|
|
4a2fec |
+ self.refresh_header()
|
|
|
4a2fec |
+
|
|
|
4a2fec |
def show_vm_selection_by_guest_name(self):
|
|
|
4a2fec |
"""Draws guest selection mask.
|
|
|
4a2fec |
|
|
|
4a2fec |
@@ -1156,14 +1189,14 @@ class Tui(object):
|
|
|
4a2fec |
|
|
|
4a2fec |
def show_stats(self):
|
|
|
4a2fec |
"""Refreshes the screen and processes user input."""
|
|
|
4a2fec |
- sleeptime = DELAY_INITIAL
|
|
|
4a2fec |
+ sleeptime = self._delay_initial
|
|
|
4a2fec |
self.refresh_header()
|
|
|
4a2fec |
start = 0.0 # result based on init value never appears on screen
|
|
|
4a2fec |
while True:
|
|
|
4a2fec |
self.refresh_body(time.time() - start)
|
|
|
4a2fec |
curses.halfdelay(int(sleeptime * 10))
|
|
|
4a2fec |
start = time.time()
|
|
|
4a2fec |
- sleeptime = DELAY_REGULAR
|
|
|
4a2fec |
+ sleeptime = self._delay_regular
|
|
|
4a2fec |
try:
|
|
|
4a2fec |
char = self.screen.getkey()
|
|
|
4a2fec |
if char == 'c':
|
|
|
4a2fec |
@@ -1174,23 +1207,28 @@ class Tui(object):
|
|
|
4a2fec |
curses.curs_set(1)
|
|
|
4a2fec |
self.show_filter_selection()
|
|
|
4a2fec |
curses.curs_set(0)
|
|
|
4a2fec |
- sleeptime = DELAY_INITIAL
|
|
|
4a2fec |
+ sleeptime = self._delay_initial
|
|
|
4a2fec |
if char == 'g':
|
|
|
4a2fec |
curses.curs_set(1)
|
|
|
4a2fec |
self.show_vm_selection_by_guest_name()
|
|
|
4a2fec |
curses.curs_set(0)
|
|
|
4a2fec |
- sleeptime = DELAY_INITIAL
|
|
|
4a2fec |
+ sleeptime = self._delay_initial
|
|
|
4a2fec |
if char == 'h':
|
|
|
4a2fec |
self.show_help_interactive()
|
|
|
4a2fec |
if char == 'p':
|
|
|
4a2fec |
curses.curs_set(1)
|
|
|
4a2fec |
self.show_vm_selection_by_pid()
|
|
|
4a2fec |
curses.curs_set(0)
|
|
|
4a2fec |
- sleeptime = DELAY_INITIAL
|
|
|
4a2fec |
+ sleeptime = self._delay_initial
|
|
|
4a2fec |
if char == 'q':
|
|
|
4a2fec |
break
|
|
|
4a2fec |
if char == 'r':
|
|
|
4a2fec |
self.stats.reset()
|
|
|
4a2fec |
+ if char == 's':
|
|
|
4a2fec |
+ curses.curs_set(1)
|
|
|
4a2fec |
+ self.show_set_update_interval()
|
|
|
4a2fec |
+ curses.curs_set(0)
|
|
|
4a2fec |
+ sleeptime = self._delay_initial
|
|
|
4a2fec |
if char == 'x':
|
|
|
4a2fec |
self.update_drilldown()
|
|
|
4a2fec |
except KeyboardInterrupt:
|
|
|
4a2fec |
@@ -1267,6 +1305,7 @@ Interactive Commands:
|
|
|
4a2fec |
p filter by PID
|
|
|
4a2fec |
q quit
|
|
|
4a2fec |
r reset stats
|
|
|
4a2fec |
+ s set update interval
|
|
|
4a2fec |
x toggle reporting of stats for individual child trace events
|
|
|
4a2fec |
Press any other key to refresh statistics immediately.
|
|
|
4a2fec |
"""
|
|
|
4a2fec |
diff --git a/scripts/kvm/kvm_stat.texi b/scripts/kvm/kvm_stat.texi
|
|
|
4a2fec |
index 4dfcd8f..f0066ff 100644
|
|
|
4a2fec |
--- a/scripts/kvm/kvm_stat.texi
|
|
|
4a2fec |
+++ b/scripts/kvm/kvm_stat.texi
|
|
|
4a2fec |
@@ -45,6 +45,9 @@ quit
|
|
|
4a2fec |
@item r
|
|
|
4a2fec |
@kindex r
|
|
|
4a2fec |
reset stats
|
|
|
4a2fec |
+@item s
|
|
|
4a2fec |
+@kindex s
|
|
|
4a2fec |
+set update interval
|
|
|
4a2fec |
@item x
|
|
|
4a2fec |
@kindex x
|
|
|
4a2fec |
toggle reporting of stats for child trace events
|
|
|
4a2fec |
--
|
|
|
4a2fec |
1.8.3.1
|
|
|
4a2fec |
|