提交 184b2d23 编写于 作者: S Stefan Raspl 提交者: Paolo Bonzini

tools/kvm_stat: reduce perceived idle time on filter updates

Whenever a user adds a filter, we
* redraw the header immediately for a snappy response
* print a message indicating to the user that we're busy while the
  noticeable delay induced by updating all of the stats objects takes place
* update the statistics ASAP (i.e. after 0.25s instead of 3s) to be
  consistent with behavior on startup
To do so, we split the Tui's refresh() method to allow for drawing header
and stats separately, and trigger a header refresh whenever we are about
to do something that takes a while - like updating filters.
Signed-off-by: NStefan Raspl <raspl@linux.vnet.ibm.com>
Signed-off-by: NRadim Krčmář <rkrcmar@redhat.com>
上级 692c7f6d
......@@ -801,6 +801,8 @@ class Stats(object):
LABEL_WIDTH = 40
NUMBER_WIDTH = 10
DELAY_INITIAL = 0.25
DELAY_REGULAR = 3.0
class Tui(object):
......@@ -856,13 +858,14 @@ class Tui(object):
"""Propagates pid selection to stats object."""
self.stats.pid_filter = pid
def refresh(self, sleeptime):
"""Refreshes on-screen data."""
def refresh_header(self, pid=None):
"""Refreshes the header."""
if pid is None:
pid = self.stats.pid_filter
self.screen.erase()
if self.stats.pid_filter > 0:
if pid > 0:
self.screen.addstr(0, 0, 'kvm statistics - pid {0}'
.format(self.stats.pid_filter),
curses.A_BOLD)
.format(pid), curses.A_BOLD)
else:
self.screen.addstr(0, 0, 'kvm statistics - summary', curses.A_BOLD)
self.screen.addstr(2, 1, 'Event')
......@@ -870,7 +873,13 @@ class Tui(object):
len('Total'), 'Total')
self.screen.addstr(2, 1 + LABEL_WIDTH + NUMBER_WIDTH + 8 -
len('Current'), 'Current')
self.screen.addstr(4, 1, 'Collecting data...')
self.screen.refresh()
def refresh_body(self, sleeptime):
row = 3
self.screen.move(row, 0)
self.screen.clrtobot()
stats = self.stats.get()
def sortkey(x):
......@@ -914,10 +923,12 @@ class Tui(object):
regex = self.screen.getstr()
curses.noecho()
if len(regex) == 0:
self.refresh_header()
return
try:
re.compile(regex)
self.stats.fields_filter = regex
self.refresh_header()
return
except re.error:
continue
......@@ -944,37 +955,38 @@ class Tui(object):
try:
pid = int(pid)
if pid == 0:
self.update_pid(pid)
break
else:
if not os.path.isdir(os.path.join('/proc/', str(pid))):
continue
else:
self.update_pid(pid)
break
if pid != 0 and not os.path.isdir(os.path.join('/proc/',
str(pid))):
continue
self.refresh_header(pid)
self.update_pid(pid)
break
except ValueError:
continue
def show_stats(self):
"""Refreshes the screen and processes user input."""
sleeptime = 0.25
sleeptime = DELAY_INITIAL
self.refresh_header()
while True:
self.refresh(sleeptime)
self.refresh_body(sleeptime)
curses.halfdelay(int(sleeptime * 10))
sleeptime = 3.0
sleeptime = DELAY_REGULAR
try:
char = self.screen.getkey()
if char == 'x':
self.refresh_header()
self.update_drilldown()
sleeptime = DELAY_INITIAL
if char == 'q':
break
if char == 'f':
self.show_filter_selection()
sleeptime = DELAY_INITIAL
if char == 'p':
self.show_vm_selection()
sleeptime = DELAY_INITIAL
except KeyboardInterrupt:
break
except curses.error:
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册