12 Dec, 2020
1 commit
-
The new counters halt_poll_success_ns and halt_poll_fail_ns do not count
events. Instead they provide a time, and mess up our statistics. Therefore,
we should exclude them.
Removal is currently implemented with an exempt list. If more counters like
these appear, we can think about a more general rule like excluding all
fields name "*_ns", in case that's a standing convention.Signed-off-by: Stefan Raspl
Tested-and-reported-by: Christian Borntraeger
Message-Id:
Signed-off-by: Paolo Bonzini
21 Apr, 2020
3 commits
-
Add a sample unit file as a basis for systemd integration of kvm_stat
logs.Signed-off-by: Stefan Raspl
Message-Id:
Signed-off-by: Paolo Bonzini -
To integrate with logrotate, we have a signal handler that will re-open
the logfile.
Assuming we have a systemd unit file with
ExecStart=kvm_stat -dtc -s 10 -L /var/log/kvm_stat.csv
ExecReload=/bin/kill -HUP $MAINPID
and a logrotate config featuring
postrotate
/bin/systemctl reload kvm_stat.service
endscript
Then the overall flow will look like this:
(1) systemd starts kvm_stat, logging to A.
(2) At some point, logrotate runs, moving A to B.
kvm_stat continues to write to B at this point.
(3) After rotating, logrotate restarts the kvm_stat unit via systemctl.
(4) The kvm_stat unit sends a SIGHUP to kvm_stat, finally making it
switch over to writing to A again.
Note that in order to keep the structure of the cvs output in tact, we
make sure to, in contrast to the standard log format, only write the
header once at the beginning of a file. This implies that the header is
suppressed when appending to an existing file. Unlike with the standard
format, where we append to an existing file by starting out with a
header.Signed-off-by: Stefan Raspl
Message-Id:
Signed-off-by: Paolo Bonzini -
When running in logging mode, skip records with all zeros (=empty records)
to preserve space when logging to files.Signed-off-by: Stefan Raspl
Message-Id:
Signed-off-by: Paolo Bonzini
24 Mar, 2020
4 commits
-
Add an alternative format that can be more easily used for further
processing later on.
Note that we add a timestamp in the first column for both, the regular
and the new csv format.Signed-off-by: Stefan Raspl
Message-Id:
Signed-off-by: Paolo Bonzini -
This now controls both, the refresh rate of the interactive mode as well
as the logging mode. Which, as a consequence, means that the default of
logging mode is now 3s, too (use command line switch '-s' to adjust to
your liking).Signed-off-by: Stefan Raspl
Message-Id:
Signed-off-by: Paolo Bonzini -
optparse is deprecated for a while, hence switching over to argparse
(which also works with python2).
As a consequence, help output has some subtle changes, the most
significant one being that the options are all listed explicitly
instead of a universal '[options]' indicator. Also, some of the error
messages are phrased slightly different.
While at it, squashed a number of minor PEP8 issues.Signed-off-by: Stefan Raspl
Message-Id:
Signed-off-by: Paolo Bonzini -
Make sure command line arguments are sorted alphabetically
everywhere, and adjusted existing texts for interactive command 's' to
become consistent with the long form --set-delay.
Throwing in some PEP8 fixes (all cosmetics) for good measure.Signed-off-by: Stefan Raspl
Message-Id:
Signed-off-by: Paolo Bonzini
23 Jan, 2020
1 commit
-
The filter name is fixed to "exit_reason" for some kvm_exit events, no
matter what architect we have. Actually, the filter name ("exit_reason")
is only applicable to x86, meaning it's broken on other architects
including aarch64.This fixes the issue by providing various kvm_exit filter names, depending
on architect we're on. Afterwards, the variable filter name is picked and
applied through ioctl(fd, SET_FILTER).Reported-by: Andrew Jones
Signed-off-by: Gavin Shan
Cc: stable@vger.kernel.org
Signed-off-by: Paolo Bonzini
19 Jun, 2019
1 commit
-
Based on 1 normalized pattern(s):
this work is licensed under the terms of the gnu gpl version 2 see
the copying file in the top level directoryextracted by the scancode license scanner the SPDX license identifier
GPL-2.0-only
has been chosen to replace the boilerplate/reference in 35 file(s).
Signed-off-by: Thomas Gleixner
Reviewed-by: Kate Stewart
Reviewed-by: Enrico Weigelt
Reviewed-by: Allison Randal
Cc: linux-spdx@vger.kernel.org
Link: https://lkml.kernel.org/r/20190604081206.797835076@linutronix.de
Signed-off-by: Greg Kroah-Hartman
25 May, 2019
1 commit
-
The fields filter would not work with child fields, as the respective
parents would not be included. No parents displayed == no childs displayed.
To reproduce, run on s390 (would work on other platforms, too, but would
require a different filter name):
- Run 'kvm_stat -d'
- Press 'f'
- Enter 'instruct'
Notice that events like instruction_diag_44 or instruction_diag_500 are not
displayed - the output remains empty.
With this patch, we will filter by matching events and their parents.
However, consider the following example where we filter by
instruction_diag_44:kvm statistics - summary
regex filter: instruction_diag_44
Event Total %Total CurAvg/s
exit_instruction 276 100.0 12
instruction_diag_44 256 92.8 11
Total 276 12Note that the parent ('exit_instruction') displays the total events, but
the childs listed do not match its total (256 instead of 276). This is
intended (since we're filtering all but one child), but might be confusing
on first sight.Signed-off-by: Stefan Raspl
Signed-off-by: Paolo Bonzini
27 Nov, 2018
1 commit
-
The current shebang does not work in environments that only support python3
and have no python2 installed. Plus there does not seem to be a way to
support python2 and python3 at the same time. Since all known python3 issues
were fixed, and as python3 is the way to go, let's switch over.
Note that the code is still python2 compliant, so folks in bad use can
simply revert the shebang.Suggested-by: Christian Ehrhardt
Signed-off-by: Stefan Raspl
Signed-off-by: Paolo Bonzini
01 Oct, 2018
1 commit
-
We currently display the default number of decimal places for floats in
_show_set_update_interval(), which is quite pointless. Cutting down to a
single decimal place.Signed-off-by: Stefan Raspl
Signed-off-by: Paolo Bonzini
30 Aug, 2018
7 commits
-
When filtering by guest (interactive commands 'p'/'g'), and the respective
guest was destroyed, detect when the guest is up again through the guest
name if possible.
I.e. when displaying events for a specific guest, it is not necessary
anymore to restart kvm_stat in case the guest is restarted.Signed-off-by: Stefan Raspl
Signed-off-by: Radim Krčmář -
For destroyed guests, kvm_stat essentially freezes with the last data
displayed. This is acceptable for users, in case they want to inspect the
final data. But it looks a bit irritating. Therefore, detect this situation
and display a respective indicator in the header.Signed-off-by: Stefan Raspl
Signed-off-by: Radim Krčmář -
When running with the DebugFS provider, removal of a guest can result in a
negative CurAvg/s, which looks rather confusing.
If so, suppress the body refresh and print a message instead.
To reproduce, have at least one guest A completely booted. Then start
another guest B (which generates a huge amount of events), then destroy B.
On the next refresh, kvm_stat should display a whole lot of negative values
in the CurAvg/s column.Signed-off-by: Stefan Raspl
Signed-off-by: Radim Krčmář -
When setting a PID filter in debugfs, we unnecessarily reset the
statistics, although there is no reason to do so. This behavior was
merely introduced with commit 9f114a03c6854f "tools/kvm_stat: add
interactive command 'r'", most likely to mimic the behavior of
the tracepoints provider in this respect. However, there are plenty
of differences between the two providers, so there is no reason not
to take advantage of the possibility to filter by PID without
resetting the statistics.Signed-off-by: Stefan Raspl
Signed-off-by: Radim Krčmář -
With pid filtering active, when a guest is removed e.g. via virsh shutdown,
successive updates produce garbage.
Therefore, we add code to detect this case and prevent further body updates.
Note that when displaying the help dialog via 'h' in this case, once we exit
we're stuck with the 'Collecting data...' message till we remove the filter.Signed-off-by: Stefan Raspl
Signed-off-by: Radim Krčmář -
When filtering by guest, kvm_stat displays garbage when the guest is
destroyed - see sample output below.
We add code to remove the invalid paths from the providers, so at least
no more garbage is displayed.
Here's a sample output to illustrate:kvm statistics - pid 13986 (foo)
Event Total %Total CurAvg/s
diagnose_258 -2 0.0 0
deliver_program_interruption -3 0.0 0
diagnose_308 -4 0.0 0
halt_poll_invalid -91 0.0 -6
deliver_service_signal -244 0.0 -16
halt_successful_poll -250 0.1 -17
exit_pei -285 0.1 -19
exit_external_request -312 0.1 -21
diagnose_9c -328 0.1 -22
userspace_handled -713 0.1 -47
halt_attempted_poll -939 0.2 -62
deliver_emergency_signal -3126 0.6 -208
halt_wakeup -7199 1.5 -481
exit_wait_state -7379 1.5 -493
diagnose_500 -56499 11.5 -3757
exit_null -85491 17.4 -5685
diagnose_44 -133300 27.1 -8874
exit_instruction -195898 39.8 -13037
Total -492063Signed-off-by: Stefan Raspl
Signed-off-by: Radim Krčmář -
Python3 returns a float for a regular division - switch to a division
operator that returns an integer.
Furthermore, filters return a generator object instead of the actual
list - wrap result in yet another list, which makes it still work in
both, Python2 and 3.Signed-off-by: Stefan Raspl
Signed-off-by: Radim Krčmář
29 Mar, 2018
3 commits
-
Unused since added in 18e8f4100
Signed-off-by: Cole Robinson
Reviewed-and-tested-by: Stefan Raspl
Signed-off-by: Radim Krčmář -
$ python3 tools/kvm/kvm_stat/kvm_stat
Traceback (most recent call last):
File "tools/kvm/kvm_stat/kvm_stat", line 1668, in
main()
File "tools/kvm/kvm_stat/kvm_stat", line 1639, in main
assign_globals()
File "tools/kvm/kvm_stat/kvm_stat", line 1618, in assign_globals
for line in file('/proc/mounts'):
NameError: name 'file' is not definedopen() is the python3 way, and works on python2.6+
Signed-off-by: Cole Robinson
Reviewed-and-tested-by: Stefan Raspl
Signed-off-by: Radim Krčmář -
$ python3 tools/kvm/kvm_stat/kvm_stat
File "tools/kvm/kvm_stat/kvm_stat", line 1137
def sortkey((_k, v)):
^
SyntaxError: invalid syntaxFix it in a way that's compatible with python2 and python3
Signed-off-by: Cole Robinson
Tested-by: Stefan Raspl
Signed-off-by: Radim Krčmář
24 Feb, 2018
12 commits
-
The 'Total' line looks a bit weird when we have a single event only. This
can happen e.g. due to filters. Therefore suppress when there's only a
single event in the output.Signed-off-by: Stefan Raspl
Signed-off-by: Paolo Bonzini -
We keep the current logic that sorts all events (parent and child), but
re-shuffle the events afterwards, grouping the children after the
respective parent. Note that the percentage column for child events
gives the percentage of the parent's total.
Since we rework the logic anyway, we modify the total average
calculation to use the raw numbers instead of the (rounded) averages.
Note that this can result in differing numbers (between total average
and the sum of the individual averages) due to rounding errors.Signed-off-by: Stefan Raspl
Signed-off-by: Paolo Bonzini -
Drilldown (i.e. toggle display of child trace events) was implemented by
overriding the fields filter. This resulted in inconsistencies: E.g. when
drilldown was not active, adding a filter that also matches child trace
events would not only filter fields according to the filter, but also add
in the child trace events matching the filter. E.g. on x86, setting
'kvm_userspace_exit' as the fields filter after startup would result in
display of kvm_userspace_exit(DCR), although that wasn't previously
present - not exactly what one would expect from a filter.
This patch addresses the issue by keeping drilldown and fields filter
separate. While at it, we also fix a PEP8 issue by adding a blank line
at one place (since we're in the area...).
We implement this by adding a framework that also allows to define a
taxonomy among the debugfs events to identify child trace events. I.e.
drilldown using 'x' can now also work with debugfs. A respective parent-
child relationship is only known for S390 at the moment, but could be
added adjusting other platforms' ARCH.dbg_is_child() methods
accordingly.Signed-off-by: Stefan Raspl
Signed-off-by: Paolo Bonzini -
We can do with a single dialog that takes both, pids and guest names.
Note that we keep both interactive commands, 'p' and 'g' for now, to
avoid confusion among users used to a specific key.While at it, we improve on some minor glitches regarding curses usage,
e.g. cursor still visible when not supposed to be.Signed-off-by: Stefan Raspl
Signed-off-by: Paolo Bonzini -
Helps quite a bit reading the code when it's obvious when a method is
intended for internal use only.Signed-off-by: Stefan Raspl
Signed-off-by: Paolo Bonzini -
Te checks for debugfs assumed that debugfs is always mounted at
/sys/kernel/debug - which is likely, but not guaranteed. This is addressed
by checking /proc/mounts for the actual location.
Furthermore, when debugfs was mounted, but the kvm module not loaded, a
misleading error pointing towards debugfs not present was given.
To reproduce,
(a) run kvm_stat with debugfs mounted at a place different from
/sys/kernel/debug
(b) run kvm_stat with debugfs mounted but kvm module not loadedSigned-off-by: Stefan Raspl
Signed-off-by: Paolo Bonzini -
Entering an invalid regular expression did not produce any indication of an
error so far.
To reproduce, press 'f' and enter 'foo(' (with an unescaped bracket).Signed-off-by: Stefan Raspl
Signed-off-by: Paolo Bonzini -
When we apply a filter that will only leave child trace events, we
receive a ZeroDivisionError when calculating the percentages.
In that case, provide percentages based on child events only.
To reproduce, run 'kvm_stat -f .*[\(].*'.Signed-off-by: Stefan Raspl
Signed-off-by: Paolo Bonzini -
Use '==' for equality checks and 'is' when comparing identities.
An example where '==' and 'is' behave differently:
>>> a = 4242
>>> a == 4242
True
>>> a is 4242
FalseSigned-off-by: Marc Hartmayer
Signed-off-by: Paolo Bonzini -
If it's clear that the values of a dictionary will be used then use
the '.items()' method.Signed-off-by: Marc Hartmayer
Tested-by: Stefan Raspl
[Include fix for logging mode by Stefan Raspl]
Signed-off-by: Paolo Bonzini -
Use a namedtuple for storing the values as it allows to access the
fields of a tuple via names. This makes the overall code much easier
to read and to understand. Access by index is still possible as
before.Signed-off-by: Marc Hartmayer
Tested-by: Stefan Raspl
Signed-off-by: Paolo Bonzini -
The 'sortkey' function references a value in its enclosing
scope (closure). This is not common practice for a sort key function
so let's replace it. Additionally, the function 'sorted' has already a
parameter for reversing the result therefore the inversion of the
values is unneeded. The check for stats[x][1] is also superfluous as
it's ensured that this value is initialized with 0.Signed-off-by: Marc Hartmayer
Tested-by: Stefan Raspl
Signed-off-by: Paolo Bonzini
21 Dec, 2017
1 commit
-
Sort the fields returned by specifying '-f help' on the command line.
While at it, simplify the code a bit, indent the output and eliminate an
extra blank line at the beginning.Signed-off-by: Stefan Raspl
Signed-off-by: Paolo Bonzini
14 Dec, 2017
4 commits
-
Add a line for the total number of events and current average at the
bottom of the body.
Note that both values exclude child trace events. I.e. if drilldown is
activated via interactive command 'x', only the totals are accounted, or
we'd be counting these twice (see previous commit "tools/kvm_stat: fix
child trace events accounting").Signed-off-by: Stefan Raspl
Signed-off-by: Paolo Bonzini -
Unhandled arguments, which could easily include typos, are simply
ignored. We should be strict to avoid undetected typos.
To reproduce start kvm_stat with an extra argument, e.g.
'kvm_stat -d bnuh5ol' and note that this will actually work.Signed-off-by: Stefan Raspl
Signed-off-by: Paolo Bonzini -
Errors while parsing the '-g' command line argument result in display of
usage information prior to the error message. This is a bit confusing,
as the command line is syntactically correct.
To reproduce, run 'kvm_stat -g' and specify a non-existing or inactive
guest.Signed-off-by: Stefan Raspl
Signed-off-by: Paolo Bonzini -
Passing an invalid regular expression on the command line results in a
traceback. Note that interactive specification of invalid regular
expressions is not affected
To reproduce, run "kvm_stat -f '*'".Signed-off-by: Stefan Raspl
Signed-off-by: Paolo Bonzini