blob: 950be520326fd4e48903ff0860cab8266c776f95 [file] [log] [blame]
Demonstrations of ppchcalls, the Linux/eBPF version.
ppchcalls summarizes hcall counts across the system or a specific process,
with optional latency information. It is very useful for general workload
characterization, for example:
# ./ppchcalls.py
Tracing ppc hcalls, printing top 10... Ctrl+C to quit.
^C[04:59:47]
PPC HCALL COUNT
H_IPI 26
H_EOI 22
H_XIRR 22
H_VIO_SIGNAL 4
H_REMOVE 3
H_PUT_TCE 2
H_SEND_CRQ 2
H_STUFF_TCE 2
H_ENTER 1
H_PROTECT 1
Detaching...
#
These are the top 10 entries; you can get more by using the -T switch. Here,
the output indicates that the H_IPI, H_EOI and H_XIRR hcalls were very common,
followed immediately by H_VIO_SIGNAL, H_REMOVE and so on. By default, ppchcalls
counts across the entire system, but we can point it to a specific process of
interest:
# ./ppchcalls.py -p $(pidof vim)
Tracing ppc hcalls, printing top 10... Ctrl+C to quit.
^C[06:23:12]
PPC HCALL COUNT
H_PUT_TERM_CHAR 62
H_ENTER 2
Detaching...
#
Occasionally, the count of hcalls is not enough, and you'd also want to know
the minimum, maximum and aggregate latency for each of the hcalls:
# ./ppchcalls.py -L
Tracing ppc hcalls, printing top 10... Ctrl+C to quit.
[00:53:59]
PPC HCALL COUNT MIN (us) MAX (us) AVG (us)
H_IPI 32 0.808 7.730 2.329
H_EOI 25 0.697 1.984 1.081
H_PUT_TERM_CHAR 25 10.315 47.184 14.667
H_XIRR 25 0.868 6.223 2.397
H_VIO_SIGNAL 6 1.418 22.053 7.507
H_STUFF_TCE 3 0.865 2.349 1.384
H_SEND_CRQ 3 18.015 21.137 19.673
H_REMOVE 3 1.838 7.407 3.735
H_PUT_TCE 3 1.473 4.808 2.698
H_GET_TERM_CHAR 2 8.379 26.729 17.554
Detaching...
#
Another direction would be to understand which processes are making a lot of
hcalls, thus responsible for a lot of activity. This is what the -P switch
does:
# ./ppchcalls.py -P
Tracing ppc hcalls, printing top 10... Ctrl+C to quit.
^C[04:07:39]
PID COMM COUNT
14118 top 1073
0 [unknown] 286
1679 bash 67
14111 kworker/12:0-events_freezable_power_ 12
2 kthreadd 4
11753 kworker/0:0-events 4
141 kworker/21:0H-xfs-log/dm-0 3
847 systemd-udevd 3
14116 ppchcalls.py 3
13368 kworker/u64:1-events_unbound 3
Detaching...
#
Sometimes, you'd want both, the process making the most hcalls and respective
process-wide latencies. All you need to do is combine both options:
# ./ppchcalls.py -P -L
Tracing ppc hcalls, printing top 10... Ctrl+C to quit.
^C[04:35:27]
PID COMM COUNT MIN (us) MAX (us) AVG (us)
0 [unknown] 69 0.666 13.059 2.834
14151 kworker/12:1-events_freezable_power_ 8 6.489 84.470 34.354
11753 kworker/0:0-events 4 1.415 2.059 1.784
14152 kworker/u64:0-events_unbound 2 2.402 2.935 2.668
14154 ppchcalls.py 2 3.139 11.934 7.537
1751 sshd 1 7.227 7.227 7.227
3413 kworker/6:2-mm_percpu_wq 1 6.775 6.775 6.775
Detaching...
#
Sometimes, you'd only care about a single hcall rather than all hcalls.
Use the --hcall option for this; the following example also demonstrates
the --hcall option, for printing at predefined intervals:
# ./ppchcalls.py --hcall H_VIO_SIGNAL -i 5
hcall H_VIO_SIGNAL , hcall_nr =260
Tracing ppc hcall 'H_VIO_SIGNAL'... Ctrl+C to quit.
[04:29:56]
PPC HCALL COUNT
H_VIO_SIGNAL 6
[04:30:01]
PPC HCALL COUNT
H_VIO_SIGNAL 4
[04:30:06]
PPC HCALL COUNT
H_VIO_SIGNAL 6
[04:30:07]
PPC HCALL COUNT
Detaching...
#
USAGE:
# ./ppchcalls.py -h
usage: ppchcalls.py [-h] [-p PID] [-t TID] [-i INTERVAL] [-d DURATION]
[-T TOP] [-x] [-e ERRNO] [-L] [-m] [-P] [-l]
[--hcall HCALL]
Summarize ppc hcall counts and latencies.
optional arguments:
-h, --help show this help message and exit
-p PID, --pid PID trace only this pid
-t TID, --tid TID trace only this tid
-i INTERVAL, --interval INTERVAL
print summary at this interval (seconds)
-d DURATION, --duration DURATION
total duration of trace, in seconds
-T TOP, --top TOP print only the top hcalls by count or latency
-x, --failures trace only failed hcalls (return < 0)
-e ERRNO, --errno ERRNO
trace only hcalls that return this error (numeric or
EPERM, etc.)
-L, --latency collect hcall latency
-m, --milliseconds display latency in milliseconds (default:
microseconds)
-P, --process count by process and not by hcall
-l, --list print list of recognized hcalls and exit
--hcall HCALL trace this hcall only (use option -l to get all
recognized hcalls)
#
Ref: https://docs.kernel.org/powerpc/papr_hcalls.html