Skip to content

Commit 64eefad

Browse files
Stefan Rasplbonzini
authored andcommitted
tools/kvm_stat: add new interactive command 's'
Add new command 's' to modify the update interval. Limited to a maximum of 25.5 sec and a minimum of 0.1 sec, since curses cannot handle longer and shorter delays respectively. Signed-off-by: Stefan Raspl <[email protected]> Signed-off-by: Paolo Bonzini <[email protected]>
1 parent 1fdea7b commit 64eefad

File tree

2 files changed

+49
-8
lines changed

2 files changed

+49
-8
lines changed

tools/kvm/kvm_stat/kvm_stat

Lines changed: 47 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -844,8 +844,7 @@ class Stats(object):
844844
self.values[key] = (newval, newdelta)
845845
return self.values
846846

847-
DELAY_INITIAL = 0.25
848-
DELAY_REGULAR = 3.0
847+
DELAY_DEFAULT = 3.0
849848
MAX_GUEST_NAME_LEN = 48
850849
MAX_REGEX_LEN = 44
851850
DEFAULT_REGEX = r'^[^\(]*$'
@@ -856,6 +855,8 @@ class Tui(object):
856855
def __init__(self, stats):
857856
self.stats = stats
858857
self.screen = None
858+
self._delay_initial = 0.25
859+
self._delay_regular = DELAY_DEFAULT
859860

860861
def __enter__(self):
861862
"""Initialises curses for later use. Based on curses.wrapper
@@ -1027,6 +1028,7 @@ class Tui(object):
10271028
' p filter by PID',
10281029
' q quit',
10291030
' r reset stats',
1031+
' s set update interval',
10301032
' x toggle reporting of stats for individual child trace'
10311033
' events',
10321034
'Any other key refreshes statistics immediately')
@@ -1106,10 +1108,41 @@ class Tui(object):
11061108
self.refresh_header(pid)
11071109
self.update_pid(pid)
11081110
break
1109-
11101111
except ValueError:
11111112
msg = '"' + str(pid) + '": Not a valid pid'
11121113

1114+
def show_set_update_interval(self):
1115+
"""Draws update interval selection mask."""
1116+
msg = ''
1117+
while True:
1118+
self.screen.erase()
1119+
self.screen.addstr(0, 0, 'Set update interval (defaults to %fs).' %
1120+
DELAY_DEFAULT, curses.A_BOLD)
1121+
self.screen.addstr(4, 0, msg)
1122+
self.screen.addstr(2, 0, 'Change delay from %.1fs to ' %
1123+
self._delay_regular)
1124+
curses.echo()
1125+
val = self.screen.getstr()
1126+
curses.noecho()
1127+
1128+
try:
1129+
if len(val) > 0:
1130+
delay = float(val)
1131+
if delay < 0.1:
1132+
msg = '"' + str(val) + '": Value must be >=0.1'
1133+
continue
1134+
if delay > 25.5:
1135+
msg = '"' + str(val) + '": Value must be <=25.5'
1136+
continue
1137+
else:
1138+
delay = DELAY_DEFAULT
1139+
self._delay_regular = delay
1140+
break
1141+
1142+
except ValueError:
1143+
msg = '"' + str(val) + '": Invalid value'
1144+
self.refresh_header()
1145+
11131146
def show_vm_selection_by_guest_name(self):
11141147
"""Draws guest selection mask.
11151148
@@ -1156,14 +1189,14 @@ class Tui(object):
11561189

11571190
def show_stats(self):
11581191
"""Refreshes the screen and processes user input."""
1159-
sleeptime = DELAY_INITIAL
1192+
sleeptime = self._delay_initial
11601193
self.refresh_header()
11611194
start = 0.0 # result based on init value never appears on screen
11621195
while True:
11631196
self.refresh_body(time.time() - start)
11641197
curses.halfdelay(int(sleeptime * 10))
11651198
start = time.time()
1166-
sleeptime = DELAY_REGULAR
1199+
sleeptime = self._delay_regular
11671200
try:
11681201
char = self.screen.getkey()
11691202
if char == 'c':
@@ -1174,23 +1207,28 @@ class Tui(object):
11741207
curses.curs_set(1)
11751208
self.show_filter_selection()
11761209
curses.curs_set(0)
1177-
sleeptime = DELAY_INITIAL
1210+
sleeptime = self._delay_initial
11781211
if char == 'g':
11791212
curses.curs_set(1)
11801213
self.show_vm_selection_by_guest_name()
11811214
curses.curs_set(0)
1182-
sleeptime = DELAY_INITIAL
1215+
sleeptime = self._delay_initial
11831216
if char == 'h':
11841217
self.show_help_interactive()
11851218
if char == 'p':
11861219
curses.curs_set(1)
11871220
self.show_vm_selection_by_pid()
11881221
curses.curs_set(0)
1189-
sleeptime = DELAY_INITIAL
1222+
sleeptime = self._delay_initial
11901223
if char == 'q':
11911224
break
11921225
if char == 'r':
11931226
self.stats.reset()
1227+
if char == 's':
1228+
curses.curs_set(1)
1229+
self.show_set_update_interval()
1230+
curses.curs_set(0)
1231+
sleeptime = self._delay_initial
11941232
if char == 'x':
11951233
self.update_drilldown()
11961234
except KeyboardInterrupt:
@@ -1267,6 +1305,7 @@ Interactive Commands:
12671305
p filter by PID
12681306
q quit
12691307
r reset stats
1308+
s set update interval
12701309
x toggle reporting of stats for individual child trace events
12711310
Press any other key to refresh statistics immediately.
12721311
"""

tools/kvm/kvm_stat/kvm_stat.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,8 @@ INTERACTIVE COMMANDS
4343

4444
*r*:: reset stats
4545

46+
*s*:: set update interval
47+
4648
*x*:: toggle reporting of stats for child trace events
4749

4850
Press any other key to refresh statistics immediately.

0 commit comments

Comments
 (0)