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
