2023-08-12 09:20:09

by Yang Jihong

[permalink] [raw]
Subject: [RFC v1 00/16] perf kwork: Implement perf kwork top

Some common tools for collecting statistics on CPU usage, such as top,
obtain statistics from timer interrupt sampling, and then periodically
read statistics from /proc/stat.

This method has some deviations:
1. In the tick interrupt, the time between the last tick and the current
tick is counted in the current task. However, the task may be running
only part of the time.
2. For each task, the top tool periodically reads the /proc/{PID}/status
information. For tasks with a short life cycle, it may be missed.

In conclusion, the top tool cannot accurately collect statistics on the
CPU usage and running time of tasks.

The statistical method based on sched_switch tracepoint can accurately
calculate the CPU usage of all tasks. This method is applicable to
scenarios where performance comparison data is of high precision.

In addition to parsing the perf.data file, the provides BPF-based CPU usage
statistics to reduce the load of the perf process.

Example usage:

# perf kwork top -h

Usage: perf kwork top [<options>]

-C, --cpu <cpu> list of cpus to profile
-i, --input <file> input file name
-n, --name <name> event name to profile
-s, --sort <key[,key2...]>
sort by key(s): rate, runtime, tid
--time <str> Time span for analysis (start,stop)

# ./perf kwork -k sched,irq,softirq record -- ./perf bench sched messaging -g 1 -l 10000
# Running 'sched/messaging' benchmark:
# 20 sender and receiver processes per group
# 1 groups == 40 processes run

Total time: 1.854 [sec]
[ perf record: Woken up 13 times to write data ]
[ perf record: Captured and wrote 27.436 MB perf.data (235986 samples) ]
#
# perf kwork top

Total : 22419.068 ms, 12 cpus
%Cpu(s): 17.99% id, 0.00% hi, 0.09% si
%Cpu0 [|||||||||||||||||||||||| 82.56%]
%Cpu1 [|||||||||||||||||||||||| 81.73%]
%Cpu2 [|||||||||||||||||||||||| 83.00%]
%Cpu3 [|||||||||||||||||||||||| 81.01%]
%Cpu4 [|||||||||||||||||||||||| 81.66%]
%Cpu5 [|||||||||||||||||||||||| 82.10%]
%Cpu6 [|||||||||||||||||||||||| 81.65%]
%Cpu7 [|||||||||||||||||||||||| 82.00%]
%Cpu8 [|||||||||||||||||||||||| 82.54%]
%Cpu9 [|||||||||||||||||||||||| 81.02%]
%Cpu10 [|||||||||||||||||||||||| 81.78%]
%Cpu11 [|||||||||||||||||||||||| 81.87%]

PID %CPU RUNTIME COMMMAND
----------------------------------------------------
2913025 27.62 516.976 ms sched-messaging
2913017 27.56 516.273 ms sched-messaging
2913018 27.56 516.152 ms sched-messaging
2913008 27.54 515.447 ms sched-messaging
2913010 27.50 514.890 ms sched-messaging
2913007 27.48 514.411 ms sched-messaging
2913015 27.36 512.563 ms sched-messaging
2913026 27.35 512.198 ms sched-messaging
2913011 27.32 511.632 ms sched-messaging
2913014 27.32 511.381 ms sched-messaging
2913012 27.30 511.138 ms sched-messaging
2913013 27.30 511.109 ms sched-messaging
2913009 27.30 510.997 ms sched-messaging
2913019 27.25 510.488 ms sched-messaging
2913021 27.23 509.661 ms sched-messaging
2913023 27.21 509.400 ms sched-messaging
2913020 27.20 509.677 ms sched-messaging
2913022 27.19 509.061 ms sched-messaging
2913016 27.18 509.231 ms sched-messaging
2913024 27.18 509.108 ms sched-messaging
2912999 21.79 407.929 ms sched-messaging
2913000 21.78 408.045 ms sched-messaging
2912998 21.75 407.579 ms sched-messaging
2912993 21.69 406.166 ms sched-messaging
2912991 21.59 404.378 ms sched-messaging
2912992 21.57 403.845 ms sched-messaging
2913005 21.56 403.715 ms sched-messaging
2913001 21.55 403.803 ms sched-messaging
2912990 21.54 403.601 ms sched-messaging
2912994 21.52 403.087 ms sched-messaging
2912995 21.49 402.421 ms sched-messaging
2912996 21.48 402.666 ms sched-messaging
2912989 21.46 402.303 ms sched-messaging
2913003 21.46 402.034 ms sched-messaging
2912988 21.44 401.820 ms sched-messaging
2913004 21.37 400.242 ms sched-messaging
2912987 21.28 398.512 ms sched-messaging
2913002 21.27 398.759 ms sched-messaging
2912997 21.27 398.518 ms sched-messaging
2913006 21.23 397.888 ms sched-messaging
0 18.89 353.061 ms swapper/3
0 18.89 353.026 ms swapper/9
0 18.26 341.190 ms swapper/6
0 18.25 341.048 ms swapper/4
0 18.13 338.844 ms swapper/10
0 18.12 338.686 ms swapper/1
0 18.05 337.333 ms swapper/11
0 17.92 334.903 ms swapper/7
0 17.80 332.691 ms swapper/5
0 17.38 324.762 ms swapper/8
0 17.29 323.102 ms swapper/0
0 16.89 315.630 ms swapper/2
2912984 2.10 39.452 ms perf
2912985 0.73 14.004 ms sched-messaging
660381 0.14 3.527 ms containerd
3006112 0.07 1.402 ms redis-server
2904655 0.05 1.071 ms kworker/0:0
659822 0.03 1.729 ms containerd
659824 0.03 1.346 ms containerd
1053 0.01 0.353 ms zabbix_agentd
2895571 0.01 0.349 ms kworker/8:1
10 0.00 0.535 ms rcu_sched
2912192 0.00 0.272 ms kworker/u24:2
2903540 0.00 0.182 ms sshd
801 0.00 0.120 ms jbd2/sda4-8
2929605 0.00 0.108 ms grpc_global_tim
2912986 0.00 0.075 ms perf
2897765 0.00 0.073 ms kworker/7:1
2912817 0.00 0.070 ms kworker/2:1
391756 0.00 0.067 ms grpc_global_tim
2901459 0.00 0.056 ms kworker/3:0
2908185 0.00 0.052 ms kworker/10:1
2901521 0.00 0.050 ms kworker/6:1
2902444 0.00 0.046 ms kworker/5:1
2898513 0.00 0.041 ms kworker/1:1
2912280 0.00 0.039 ms kworker/11:3
1057 0.00 0.037 ms zabbix_agentd
2908010 0.00 0.037 ms kworker/9:3
2912951 0.00 0.036 ms kworker/4:3
793 0.00 0.027 ms multipathd
42 0.00 0.023 ms ksoftirqd/5
9 0.00 0.022 ms ksoftirqd/0
24 0.00 0.019 ms ksoftirqd/2
59 0.00 0.019 ms migration/8
2929607 0.00 0.018 ms wecode-db
29 0.00 0.012 ms migration/3
11 0.00 0.012 ms migration/0
65 0.00 0.012 ms migration/9
17 0.00 0.011 ms migration/1
71 0.00 0.011 ms migration/10
53 0.00 0.011 ms migration/7
23 0.00 0.011 ms migration/2
47 0.00 0.011 ms migration/6
789 0.00 0.010 ms multipathd
35 0.00 0.010 ms migration/4
480 0.00 0.009 ms kworker/4:1H
41 0.00 0.008 ms migration/5
54 0.00 0.006 ms ksoftirqd/7
36 0.00 0.005 ms ksoftirqd/4
72 0.00 0.005 ms ksoftirqd/10
66 0.00 0.005 ms ksoftirqd/9
30 0.00 0.004 ms ksoftirqd/3
2898362 0.00 0.003 ms kworker/u24:0

# perf kwork top -C 2,4,5

Total : 5604.885 ms, 3 cpus
%Cpu(s): 17.65% id, 0.00% hi, 0.09% si
%Cpu2 [|||||||||||||||||||||||| 83.00%]
%Cpu4 [|||||||||||||||||||||||| 81.66%]
%Cpu5 [|||||||||||||||||||||||| 82.10%]

PID %CPU RUNTIME COMMMAND
----------------------------------------------------
0 18.25 341.048 ms swapper/4
0 17.80 332.691 ms swapper/5
0 16.89 315.630 ms swapper/2
2913012 8.99 168.201 ms sched-messaging
2913021 8.74 163.456 ms sched-messaging
2913026 8.34 156.120 ms sched-messaging
2913010 8.14 152.372 ms sched-messaging
2913007 7.74 144.754 ms sched-messaging
2913016 7.42 138.977 ms sched-messaging
2913022 7.28 136.279 ms sched-messaging
2913013 7.00 130.894 ms sched-messaging
2913019 6.96 130.455 ms sched-messaging
2913023 6.91 129.364 ms sched-messaging
2913008 6.47 121.331 ms sched-messaging
2913018 6.47 121.124 ms sched-messaging
2912994 6.42 120.213 ms sched-messaging
2913025 6.42 120.140 ms sched-messaging
2913020 6.37 119.386 ms sched-messaging
2913011 6.35 118.921 ms sched-messaging
2913014 6.24 116.779 ms sched-messaging
2913009 6.01 112.661 ms sched-messaging
2913005 5.96 111.587 ms sched-messaging
2913003 5.94 111.142 ms sched-messaging
2913024 5.87 109.876 ms sched-messaging
2912988 5.84 109.396 ms sched-messaging
2912987 5.80 108.550 ms sched-messaging
2912990 5.51 103.322 ms sched-messaging
2912993 5.45 102.045 ms sched-messaging
2912996 5.42 101.622 ms sched-messaging
2913006 5.42 101.592 ms sched-messaging
2913000 5.41 101.511 ms sched-messaging
2913002 5.41 101.420 ms sched-messaging
2912997 5.40 101.315 ms sched-messaging
2913004 5.33 99.872 ms sched-messaging
2913015 5.29 99.252 ms sched-messaging
2913017 5.22 97.822 ms sched-messaging
2912991 5.11 95.773 ms sched-messaging
2912992 5.11 95.579 ms sched-messaging
2913001 5.07 95.033 ms sched-messaging
2912989 4.93 92.425 ms sched-messaging
2912995 4.85 90.892 ms sched-messaging
2912998 4.78 89.617 ms sched-messaging
2912999 4.56 85.576 ms sched-messaging
3006112 0.07 1.402 ms redis-server
660381 0.02 0.566 ms containerd
2912984 0.02 0.452 ms perf
659824 0.01 0.369 ms containerd
659822 0.00 0.316 ms containerd
10 0.00 0.176 ms rcu_sched
801 0.00 0.120 ms jbd2/sda4-8
2912985 0.00 0.107 ms sched-messaging
2912986 0.00 0.075 ms perf
2912817 0.00 0.070 ms kworker/2:1
2912192 0.00 0.056 ms kworker/u24:2
2929605 0.00 0.046 ms grpc_global_tim
2902444 0.00 0.046 ms kworker/5:1
2912951 0.00 0.036 ms kworker/4:3
42 0.00 0.023 ms ksoftirqd/5
24 0.00 0.019 ms ksoftirqd/2
23 0.00 0.011 ms migration/2
35 0.00 0.010 ms migration/4
480 0.00 0.009 ms kworker/4:1H
41 0.00 0.008 ms migration/5
36 0.00 0.005 ms ksoftirqd/4

# perf kwork top -n perf

Total : 22419.068 ms, 12 cpus
%Cpu(s): 17.99% id, 0.00% hi, 0.09% si
%Cpu0 [ 0.00%]
%Cpu1 [ 0.00%]
%Cpu2 [ 0.02%]
%Cpu3 [ 0.00%]
%Cpu4 [ 0.00%]
%Cpu5 [ 0.00%]
%Cpu6 [ 0.00%]
%Cpu7 [ 0.00%]
%Cpu8 [ 0.03%]
%Cpu9 [ 0.09%]
%Cpu10 [ 0.00%]
%Cpu11 [ 1.96%]

PID %CPU RUNTIME COMMMAND
----------------------------------------------------
2912984 2.10 39.452 ms perf
2912986 0.00 0.075 ms perf

# perf kwork top -s tid -n sched-messaging

Total : 22419.068 ms, 12 cpus
%Cpu(s): 17.99% id, 0.00% hi, 0.09% si
%Cpu0 [|||||||||||||||||||||||| 81.80%]
%Cpu1 [|||||||||||||||||||||||| 81.65%]
%Cpu2 [|||||||||||||||||||||||| 82.88%]
%Cpu3 [|||||||||||||||||||||||| 80.96%]
%Cpu4 [|||||||||||||||||||||||| 81.64%]
%Cpu5 [|||||||||||||||||||||||| 82.04%]
%Cpu6 [|||||||||||||||||||||||| 81.63%]
%Cpu7 [|||||||||||||||||||||||| 81.97%]
%Cpu8 [|||||||||||||||||||||||| 82.43%]
%Cpu9 [|||||||||||||||||||||||| 80.86%]
%Cpu10 [|||||||||||||||||||||||| 81.72%]
%Cpu11 [||||||||||||||||||||||| 79.89%]

PID %CPU RUNTIME COMMMAND
----------------------------------------------------
2912985 0.04 1.111 ms sched-messaging
2912987 21.28 398.512 ms sched-messaging
2912988 21.44 401.820 ms sched-messaging
2912989 21.46 402.303 ms sched-messaging
2912990 21.54 403.601 ms sched-messaging
2912991 21.59 404.378 ms sched-messaging
2912992 21.57 403.845 ms sched-messaging
2912993 21.69 406.166 ms sched-messaging
2912994 21.52 403.087 ms sched-messaging
2912995 21.49 402.421 ms sched-messaging
2912996 21.48 402.666 ms sched-messaging
2912997 21.27 398.518 ms sched-messaging
2912998 21.75 407.579 ms sched-messaging
2912999 21.79 407.929 ms sched-messaging
2913000 21.78 408.045 ms sched-messaging
2913001 21.55 403.803 ms sched-messaging
2913002 21.27 398.759 ms sched-messaging
2913003 21.46 402.034 ms sched-messaging
2913004 21.37 400.242 ms sched-messaging
2913005 21.56 403.715 ms sched-messaging
2913006 21.23 397.888 ms sched-messaging
2913007 27.48 514.411 ms sched-messaging
2913008 27.54 515.447 ms sched-messaging
2913009 27.30 510.997 ms sched-messaging
2913010 27.50 514.890 ms sched-messaging
2913011 27.32 511.632 ms sched-messaging
2913012 27.30 511.138 ms sched-messaging
2913013 27.30 511.109 ms sched-messaging
2913014 27.32 511.381 ms sched-messaging
2913015 27.36 512.563 ms sched-messaging
2913016 27.18 509.231 ms sched-messaging
2913017 27.56 516.273 ms sched-messaging
2913018 27.56 516.152 ms sched-messaging
2913019 27.25 510.488 ms sched-messaging
2913020 27.20 509.677 ms sched-messaging
2913021 27.23 509.661 ms sched-messaging
2913022 27.19 509.061 ms sched-messaging
2913023 27.21 509.400 ms sched-messaging
2913024 27.18 509.108 ms sched-messaging
2913025 27.62 516.976 ms sched-messaging
2913026 27.35 512.198 ms sched-messaging

# perf kwork top -b
Starting trace, Hit <Ctrl+C> to stop and report
^C
Total : 89209.004 ms, 4 cpus
%Cpu(s): 13.47% id, 0.01% hi, 0.24% si
%Cpu0 [||||||||||||||||||||||||| 86.08%]
%Cpu1 [|||||||||||||||||||||||||| 87.08%]
%Cpu2 [||||||||||||||||||||||||| 86.10%]
%Cpu3 [||||||||||||||||||||||||| 85.86%]

PID SPID %CPU RUNTIME COMMMAND
-------------------------------------------------------------
0 0 13.86 3092.482 ms [swapper/3]
0 0 13.71 3057.756 ms [swapper/0]
0 0 13.65 3044.987 ms [swapper/2]
0 0 12.63 2818.079 ms [swapper/1]
320 320 1.32 295.427 ms bash
414 320 1.09 247.658 ms sched-messaging
678 320 1.09 246.881 ms sched-messaging
354 320 1.09 246.683 ms sched-messaging
409 320 1.08 246.839 ms sched-messaging
554 320 1.07 243.045 ms sched-messaging
405 320 1.04 237.340 ms sched-messaging
525 320 1.04 235.718 ms sched-messaging
486 320 1.03 235.369 ms sched-messaging
714 320 1.03 235.142 ms sched-messaging
435 320 1.03 233.290 ms sched-messaging
408 320 1.03 231.687 ms sched-messaging
716 320 1.02 233.513 ms sched-messaging
453 320 1.02 233.181 ms sched-messaging
522 320 1.02 230.101 ms sched-messaging
651 320 1.02 229.554 ms sched-messaging
418 320 1.01 231.359 ms sched-messaging
644 320 1.01 229.848 ms sched-messaging
535 320 1.01 229.655 ms sched-messaging
536 320 1.01 229.147 ms sched-messaging
410 320 1.01 227.700 ms sched-messaging
689 320 1.00 227.988 ms sched-messaging
412 320 1.00 227.052 ms sched-messaging
489 320 1.00 226.374 ms sched-messaging
521 320 1.00 225.499 ms sched-messaging
530 320 1.00 225.262 ms sched-messaging
681 320 1.00 225.187 ms sched-messaging
415 320 0.99 225.714 ms sched-messaging
643 320 0.99 225.090 ms sched-messaging
325 320 0.99 223.385 ms sched-messaging
498 320 0.99 222.936 ms sched-messaging
413 320 0.98 225.213 ms sched-messaging
645 320 0.98 223.211 ms sched-messaging
544 320 0.98 222.714 ms sched-messaging
441 320 0.98 222.590 ms sched-messaging
697 320 0.98 222.426 ms sched-messaging
523 320 0.98 221.841 ms sched-messaging
402 320 0.98 221.776 ms sched-messaging
<SNIP>

Yang Jihong (16):
perf kwork: Fix incorrect and missing free atom in work_push_atom()
perf kwork: Add the supported subcommands to the document
perf kwork: Set ordered_events for perf_tool
perf kwork: Add `kwork` and `src_type` to work_init() for struct
kwork_class
perf kwork: Overwrite original atom in the list when a new atom is
pushed.
perf kwork: Set default events list if not specified in
setup_event_list()
perf kwork: Add sched record support
perf kwork: Add `root` parameter to work_sort()
perf kwork: Implement perf kwork top
perf evsel: Add evsel__intval_common() helper
perf kwork top: Add statistics on hardirq event support
perf kwork top: Add statistics on softirq event support
perf kwork top: Add -C/--cpu -i/--input -n/--name -s/--sort --time
options
perf kwork top: Implements BPF-based cpu usage statistics
perf kwork top: Add BPF-based statistics on hardirq event support
perf kwork top: Add BPF-based statistics on softirq event support

tools/perf/Documentation/perf-kwork.txt | 38 +-
tools/perf/Makefile.perf | 2 +-
tools/perf/builtin-kwork.c | 758 +++++++++++++++++++++--
tools/perf/util/Build | 1 +
tools/perf/util/bpf_kwork_top.c | 308 +++++++++
tools/perf/util/bpf_skel/kwork_top.bpf.c | 338 ++++++++++
tools/perf/util/evsel.c | 13 +
tools/perf/util/evsel.h | 2 +
tools/perf/util/kwork.h | 61 +-
9 files changed, 1472 insertions(+), 49 deletions(-)
create mode 100644 tools/perf/util/bpf_kwork_top.c
create mode 100644 tools/perf/util/bpf_skel/kwork_top.bpf.c

--
2.30.GIT



2023-08-12 09:22:31

by Yang Jihong

[permalink] [raw]
Subject: [RFC v1 15/16] perf kwork top: Add BPF-based statistics on hardirq event support

Use bpf to collect statistics on hardirq events based on perf BPF skeletons.

Example usage:

# perf kwork top -k sched,irq -b
Starting trace, Hit <Ctrl+C> to stop and report
^C
Total : 136717.945 ms, 8 cpus
%Cpu(s): 17.10% id, 0.01% hi, 0.00% si
%Cpu0 [||||||||||||||||||||||||| 84.26%]
%Cpu1 [||||||||||||||||||||||||| 84.77%]
%Cpu2 [|||||||||||||||||||||||| 83.22%]
%Cpu3 [|||||||||||||||||||||||| 80.37%]
%Cpu4 [|||||||||||||||||||||||| 81.49%]
%Cpu5 [||||||||||||||||||||||||| 84.68%]
%Cpu6 [||||||||||||||||||||||||| 84.48%]
%Cpu7 [|||||||||||||||||||||||| 80.21%]

PID SPID %CPU RUNTIME COMMMAND
-------------------------------------------------------------
0 0 19.78 3482.833 ms [swapper/7]
0 0 19.62 3454.219 ms [swapper/3]
0 0 18.50 3258.339 ms [swapper/4]
0 0 16.76 2842.749 ms [swapper/2]
0 0 15.71 2627.905 ms [swapper/0]
0 0 15.51 2598.206 ms [swapper/6]
0 0 15.31 2561.820 ms [swapper/5]
0 0 15.22 2548.708 ms [swapper/1]
13253 13018 2.95 513.108 ms sched-messaging
13092 13018 2.67 454.167 ms sched-messaging
13401 13018 2.66 454.790 ms sched-messaging
13240 13018 2.64 454.587 ms sched-messaging
13251 13018 2.61 442.273 ms sched-messaging
13075 13018 2.61 438.932 ms sched-messaging
13220 13018 2.60 443.245 ms sched-messaging
13235 13018 2.59 443.268 ms sched-messaging
13222 13018 2.50 426.344 ms sched-messaging
13410 13018 2.49 426.191 ms sched-messaging
13228 13018 2.46 425.121 ms sched-messaging
13379 13018 2.38 409.950 ms sched-messaging
13236 13018 2.37 413.159 ms sched-messaging
13095 13018 2.36 396.572 ms sched-messaging
13325 13018 2.35 408.089 ms sched-messaging
13242 13018 2.32 394.750 ms sched-messaging
13386 13018 2.31 396.997 ms sched-messaging
13046 13018 2.29 383.833 ms sched-messaging
13109 13018 2.28 388.482 ms sched-messaging
13388 13018 2.28 393.576 ms sched-messaging
13238 13018 2.26 388.487 ms sched-messaging
<SNIP>

Signed-off-by: Yang Jihong <[email protected]>
---
tools/perf/util/bpf_kwork_top.c | 11 ++++
tools/perf/util/bpf_skel/kwork_top.bpf.c | 79 ++++++++++++++++++++++++
2 files changed, 90 insertions(+)

diff --git a/tools/perf/util/bpf_kwork_top.c b/tools/perf/util/bpf_kwork_top.c
index 42897ea22c61..3998bd2a938f 100644
--- a/tools/perf/util/bpf_kwork_top.c
+++ b/tools/perf/util/bpf_kwork_top.c
@@ -79,6 +79,16 @@ void perf_kwork__top_finish(void)
pr_debug("perf kwork top finish at: %lld\n", skel->bss->to_timestamp);
}

+static void irq_load_prepare(void)
+{
+ bpf_program__set_autoload(skel->progs.on_irq_handler_entry, true);
+ bpf_program__set_autoload(skel->progs.on_irq_handler_exit, true);
+}
+
+static struct kwork_class_bpf kwork_irq_bpf = {
+ .load_prepare = irq_load_prepare,
+};
+
static void sched_load_prepare(void)
{
bpf_program__set_autoload(skel->progs.on_switch, true);
@@ -90,6 +100,7 @@ static struct kwork_class_bpf kwork_sched_bpf = {

static struct kwork_class_bpf *
kwork_class_bpf_supported_list[KWORK_CLASS_MAX] = {
+ [KWORK_CLASS_IRQ] = &kwork_irq_bpf,
[KWORK_CLASS_SCHED] = &kwork_sched_bpf,
};

diff --git a/tools/perf/util/bpf_skel/kwork_top.bpf.c b/tools/perf/util/bpf_skel/kwork_top.bpf.c
index 47ad61608ec7..9c7dc62386c7 100644
--- a/tools/perf/util/bpf_skel/kwork_top.bpf.c
+++ b/tools/perf/util/bpf_skel/kwork_top.bpf.c
@@ -54,6 +54,13 @@ struct {
__type(value, struct time_data);
} kwork_top_task_time SEC(".maps");

+struct {
+ __uint(type, BPF_MAP_TYPE_PERCPU_HASH);
+ __uint(key_size, sizeof(struct work_key));
+ __uint(value_size, sizeof(struct time_data));
+ __uint(max_entries, MAX_ENTRIES);
+} kwork_top_irq_time SEC(".maps");
+
struct {
__uint(type, BPF_MAP_TYPE_HASH);
__uint(key_size, sizeof(struct task_key));
@@ -184,4 +191,76 @@ int on_switch(u64 *ctx)
return 0;
}

+SEC("tp_btf/irq_handler_entry")
+int on_irq_handler_entry(u64 *cxt)
+{
+ struct task_struct *task;
+
+ if (!enabled)
+ return 0;
+
+ __u32 cpu = bpf_get_smp_processor_id();
+
+ if (cpu_is_filtered(cpu))
+ return 0;
+
+ __u64 ts = bpf_ktime_get_ns();
+
+ task = (struct task_struct *)bpf_get_current_task();
+ if (!task)
+ return 0;
+
+ struct work_key key = {
+ .type = KWORK_CLASS_IRQ,
+ .pid = BPF_CORE_READ(task, pid),
+ .task_p = (__u64)task,
+ };
+
+ struct time_data data = {
+ .timestamp = ts,
+ };
+
+ bpf_map_update_elem(&kwork_top_irq_time, &key, &data, BPF_ANY);
+
+ return 0;
+}
+
+SEC("tp_btf/irq_handler_exit")
+int on_irq_handler_exit(u64 *cxt)
+{
+ __u64 delta;
+ struct task_struct *task;
+ struct time_data *pelem;
+
+ if (!enabled)
+ return 0;
+
+ __u32 cpu = bpf_get_smp_processor_id();
+
+ if (cpu_is_filtered(cpu))
+ return 0;
+
+ __u64 ts = bpf_ktime_get_ns();
+
+ task = (struct task_struct *)bpf_get_current_task();
+ if (!task)
+ return 0;
+
+ struct work_key key = {
+ .type = KWORK_CLASS_IRQ,
+ .pid = BPF_CORE_READ(task, pid),
+ .task_p = (__u64)task,
+ };
+
+ pelem = bpf_map_lookup_elem(&kwork_top_irq_time, &key);
+ if (pelem && pelem->timestamp != 0)
+ delta = ts - pelem->timestamp;
+ else
+ delta = ts - from_timestamp;
+
+ update_work(&key, delta);
+
+ return 0;
+}
+
char LICENSE[] SEC("license") = "Dual BSD/GPL";
--
2.30.GIT


2023-08-12 09:23:30

by Yang Jihong

[permalink] [raw]
Subject: [RFC v1 13/16] perf kwork top: Add -C/--cpu -i/--input -n/--name -s/--sort --time options

Provide the following options for perf kwork top:

1. -C, --cpu <cpu> list of cpus to profile
2. -i, --input <file> input file name
3. -n, --name <name> event name to profile
4. -s, --sort <key[,key2...]> sort by key(s): rate, runtime, tid
5. --time <str> Time span for analysis (start,stop)

Example usage:

# perf kwork top -h

Usage: perf kwork top [<options>]

-C, --cpu <cpu> list of cpus to profile
-i, --input <file> input file name
-n, --name <name> event name to profile
-s, --sort <key[,key2...]>
sort by key(s): rate, runtime, tid
--time <str> Time span for analysis (start,stop)

# perf kwork top -C 2,4,5

Total : 51226.940 ms, 3 cpus
%Cpu(s): 92.59% id, 0.00% hi, 0.09% si
%Cpu2 [| 4.61%]
%Cpu4 [ 0.01%]
%Cpu5 [||||| 17.31%]

PID %CPU RUNTIME COMMMAND
----------------------------------------------------
0 99.98 17073.515 ms swapper/4
0 95.17 16250.874 ms swapper/2
0 82.62 14108.577 ms swapper/5
4342 21.70 3708.358 ms perf
16 0.13 22.296 ms rcu_preempt
75 0.02 4.261 ms kworker/2:1
98 0.01 2.540 ms jbd2/sda-8
61 0.01 3.404 ms kcompactd0
87 0.00 0.145 ms kworker/5:1H
73 0.00 0.596 ms kworker/5:1
41 0.00 0.041 ms ksoftirqd/5
40 0.00 0.718 ms migration/5
64 0.00 0.115 ms kworker/4:1
35 0.00 0.556 ms migration/4
353 0.00 1.143 ms sshd
26 0.00 1.665 ms ksoftirqd/2
25 0.00 0.662 ms migration/2

# perf kwork top -i perf.data

Total : 136601.588 ms, 8 cpus
%Cpu(s): 95.66% id, 0.04% hi, 0.05% si
%Cpu0 [ 0.02%]
%Cpu1 [ 0.01%]
%Cpu2 [| 4.61%]
%Cpu3 [ 0.04%]
%Cpu4 [ 0.01%]
%Cpu5 [||||| 17.31%]
%Cpu6 [ 0.51%]
%Cpu7 [||| 11.42%]

PID %CPU RUNTIME COMMMAND
----------------------------------------------------
0 99.98 17073.515 ms swapper/4
0 99.98 17072.173 ms swapper/1
0 99.93 17064.229 ms swapper/3
0 99.62 17011.013 ms swapper/0
0 99.47 16985.180 ms swapper/6
0 95.17 16250.874 ms swapper/2
0 88.51 15111.684 ms swapper/7
0 82.62 14108.577 ms swapper/5
4342 33.00 5644.045 ms perf
4344 0.43 74.351 ms perf
16 0.13 22.296 ms rcu_preempt
4345 0.05 10.093 ms perf
4343 0.05 8.769 ms perf
4341 0.02 4.882 ms perf
4095 0.02 4.605 ms kworker/7:1
75 0.02 4.261 ms kworker/2:1
120 0.01 1.909 ms systemd-journal
98 0.01 2.540 ms jbd2/sda-8
61 0.01 3.404 ms kcompactd0
667 0.01 2.542 ms kworker/u16:2
4340 0.00 1.052 ms kworker/7:2
97 0.00 0.489 ms kworker/7:1H
51 0.00 0.209 ms ksoftirqd/7
50 0.00 0.646 ms migration/7
76 0.00 0.753 ms kworker/6:1
45 0.00 0.572 ms migration/6
87 0.00 0.145 ms kworker/5:1H
73 0.00 0.596 ms kworker/5:1
41 0.00 0.041 ms ksoftirqd/5
40 0.00 0.718 ms migration/5
64 0.00 0.115 ms kworker/4:1
35 0.00 0.556 ms migration/4
353 0.00 2.600 ms sshd
74 0.00 0.205 ms kworker/3:1
33 0.00 1.576 ms kworker/3:0H
30 0.00 0.996 ms migration/3
26 0.00 1.665 ms ksoftirqd/2
25 0.00 0.662 ms migration/2
397 0.00 0.057 ms kworker/1:1
20 0.00 1.005 ms migration/1
2909 0.00 1.053 ms kworker/0:2
17 0.00 0.720 ms migration/0
15 0.00 0.039 ms ksoftirqd/0

# perf kwork top -n perf

Total : 136601.588 ms, 8 cpus
%Cpu(s): 95.66% id, 0.04% hi, 0.05% si
%Cpu0 [ 0.01%]
%Cpu1 [ 0.00%]
%Cpu2 [| 4.44%]
%Cpu3 [ 0.00%]
%Cpu4 [ 0.00%]
%Cpu5 [ 0.00%]
%Cpu6 [ 0.49%]
%Cpu7 [||| 11.38%]

PID %CPU RUNTIME COMMMAND
----------------------------------------------------
4342 15.74 2695.516 ms perf
4344 0.43 74.351 ms perf
4345 0.05 10.093 ms perf
4343 0.05 8.769 ms perf
4341 0.02 4.882 ms perf

# perf kwork top -s tid

Total : 136601.588 ms, 8 cpus
%Cpu(s): 95.66% id, 0.04% hi, 0.05% si
%Cpu0 [ 0.02%]
%Cpu1 [ 0.01%]
%Cpu2 [| 4.61%]
%Cpu3 [ 0.04%]
%Cpu4 [ 0.01%]
%Cpu5 [||||| 17.31%]
%Cpu6 [ 0.51%]
%Cpu7 [||| 11.42%]

PID %CPU RUNTIME COMMMAND
----------------------------------------------------
0 99.62 17011.013 ms swapper/0
0 99.98 17072.173 ms swapper/1
0 95.17 16250.874 ms swapper/2
0 99.93 17064.229 ms swapper/3
0 99.98 17073.515 ms swapper/4
0 82.62 14108.577 ms swapper/5
0 99.47 16985.180 ms swapper/6
0 88.51 15111.684 ms swapper/7
15 0.00 0.039 ms ksoftirqd/0
16 0.13 22.296 ms rcu_preempt
17 0.00 0.720 ms migration/0
20 0.00 1.005 ms migration/1
25 0.00 0.662 ms migration/2
26 0.00 1.665 ms ksoftirqd/2
30 0.00 0.996 ms migration/3
33 0.00 1.576 ms kworker/3:0H
35 0.00 0.556 ms migration/4
40 0.00 0.718 ms migration/5
41 0.00 0.041 ms ksoftirqd/5
45 0.00 0.572 ms migration/6
50 0.00 0.646 ms migration/7
51 0.00 0.209 ms ksoftirqd/7
61 0.01 3.404 ms kcompactd0
64 0.00 0.115 ms kworker/4:1
73 0.00 0.596 ms kworker/5:1
74 0.00 0.205 ms kworker/3:1
75 0.02 4.261 ms kworker/2:1
76 0.00 0.753 ms kworker/6:1
87 0.00 0.145 ms kworker/5:1H
97 0.00 0.489 ms kworker/7:1H
98 0.01 2.540 ms jbd2/sda-8
120 0.01 1.909 ms systemd-journal
353 0.00 2.600 ms sshd
397 0.00 0.057 ms kworker/1:1
667 0.01 2.542 ms kworker/u16:2
2909 0.00 1.053 ms kworker/0:2
4095 0.02 4.605 ms kworker/7:1
4340 0.00 1.052 ms kworker/7:2
4341 0.02 4.882 ms perf
4342 33.00 5644.045 ms perf
4343 0.05 8.769 ms perf
4344 0.43 74.351 ms perf
4345 0.05 10.093 ms perf

# perf kwork top --time 128800,

Total : 53495.122 ms, 8 cpus
%Cpu(s): 94.71% id, 0.09% hi, 0.09% si
%Cpu0 [ 0.07%]
%Cpu1 [ 0.04%]
%Cpu2 [|| 8.49%]
%Cpu3 [ 0.09%]
%Cpu4 [ 0.02%]
%Cpu5 [ 0.06%]
%Cpu6 [ 0.12%]
%Cpu7 [|||||| 21.24%]

PID %CPU RUNTIME COMMMAND
----------------------------------------------------
0 99.96 3981.363 ms swapper/4
0 99.94 3978.955 ms swapper/1
0 99.91 9329.375 ms swapper/5
0 99.87 4906.829 ms swapper/3
0 99.86 9028.064 ms swapper/6
0 98.67 3928.161 ms swapper/0
0 91.17 8388.432 ms swapper/2
0 78.65 7125.602 ms swapper/7
4342 29.42 2675.198 ms perf
16 0.18 16.817 ms rcu_preempt
4345 0.09 8.183 ms perf
4344 0.04 4.290 ms perf
4343 0.03 2.844 ms perf
353 0.03 2.600 ms sshd
4095 0.02 2.702 ms kworker/7:1
120 0.02 1.909 ms systemd-journal
98 0.02 2.540 ms jbd2/sda-8
61 0.02 1.886 ms kcompactd0
667 0.02 1.011 ms kworker/u16:2
75 0.02 2.693 ms kworker/2:1
4341 0.01 1.838 ms perf
30 0.01 0.788 ms migration/3
26 0.01 1.665 ms ksoftirqd/2
20 0.01 0.752 ms migration/1
2909 0.01 0.604 ms kworker/0:2
4340 0.00 0.635 ms kworker/7:2
97 0.00 0.214 ms kworker/7:1H
51 0.00 0.209 ms ksoftirqd/7
50 0.00 0.646 ms migration/7
76 0.00 0.602 ms kworker/6:1
45 0.00 0.366 ms migration/6
87 0.00 0.145 ms kworker/5:1H
40 0.00 0.446 ms migration/5
35 0.00 0.318 ms migration/4
74 0.00 0.205 ms kworker/3:1
33 0.00 0.080 ms kworker/3:0H
25 0.00 0.448 ms migration/2
397 0.00 0.057 ms kworker/1:1
17 0.00 0.365 ms migration/0

Signed-off-by: Yang Jihong <[email protected]>
---
tools/perf/Documentation/perf-kwork.txt | 26 +++++++++++
tools/perf/builtin-kwork.c | 57 +++++++++++++++++++++++--
2 files changed, 80 insertions(+), 3 deletions(-)

diff --git a/tools/perf/Documentation/perf-kwork.txt b/tools/perf/Documentation/perf-kwork.txt
index 0601fcb0feea..34d6c285e527 100644
--- a/tools/perf/Documentation/perf-kwork.txt
+++ b/tools/perf/Documentation/perf-kwork.txt
@@ -178,6 +178,32 @@ OPTIONS for 'perf kwork timehist'
stop time is not given (i.e, time string is 'x.y,') then analysis goes
to end of file.

+OPTIONS for 'perf kwork top'
+---------------------------------
+
+-C::
+--cpu::
+ Only show events for the given CPU(s) (comma separated list).
+
+-i::
+--input::
+ Input file name. (default: perf.data unless stdin is a fifo)
+
+-n::
+--name::
+ Only show events for the given name.
+
+-s::
+--sort::
+ Sort by key(s): rate, runtime, tid
+
+--time::
+ Only analyze samples within given time window: <start>,<stop>. Times
+ have the format seconds.microseconds. If start is not given (i.e., time
+ string is ',x.y') then analysis starts at the beginning of the file. If
+ stop time is not given (i.e, time string is 'x.y,') then analysis goes
+ to end of file.
+
SEE ALSO
--------
linkperf:perf-record[1]
diff --git a/tools/perf/builtin-kwork.c b/tools/perf/builtin-kwork.c
index c741cc1a543f..d5949ff4bd15 100644
--- a/tools/perf/builtin-kwork.c
+++ b/tools/perf/builtin-kwork.c
@@ -146,6 +146,24 @@ static int cpu_usage_cmp(struct kwork_work *l, struct kwork_work *r)
return 0;
}

+static int id_or_cpu_r_cmp(struct kwork_work *l, struct kwork_work *r)
+{
+ if (l->id < r->id)
+ return 1;
+ if (l->id > r->id)
+ return -1;
+
+ if (l->id != 0)
+ return 0;
+
+ if (l->cpu < r->cpu)
+ return 1;
+ if (l->cpu > r->cpu)
+ return -1;
+
+ return 0;
+}
+
static int sort_dimension__add(struct perf_kwork *kwork __maybe_unused,
const char *tok, struct list_head *list)
{
@@ -174,6 +192,10 @@ static int sort_dimension__add(struct perf_kwork *kwork __maybe_unused,
.name = "rate",
.cmp = cpu_usage_cmp,
};
+ static struct sort_dimension tid_sort_dimension = {
+ .name = "tid",
+ .cmp = id_or_cpu_r_cmp,
+ };
struct sort_dimension *available_sorts[] = {
&id_sort_dimension,
&max_sort_dimension,
@@ -181,6 +203,7 @@ static int sort_dimension__add(struct perf_kwork *kwork __maybe_unused,
&runtime_sort_dimension,
&avg_sort_dimension,
&rate_sort_dimension,
+ &tid_sort_dimension,
};

if (kwork->report == KWORK_REPORT_LATENCY)
@@ -381,6 +404,17 @@ static void profile_update_timespan(struct perf_kwork *kwork,
kwork->timeend = sample->time;
}

+static bool profile_name_match(struct perf_kwork *kwork,
+ struct kwork_work *work)
+{
+ if (kwork->profile_name && work->name &&
+ (strcmp(work->name, kwork->profile_name) != 0)) {
+ return false;
+ }
+
+ return true;
+}
+
static bool profile_event_match(struct perf_kwork *kwork,
struct kwork_work *work,
struct perf_sample *sample)
@@ -396,10 +430,14 @@ static bool profile_event_match(struct perf_kwork *kwork,
((ptime->end != 0) && (ptime->end < time)))
return false;

- if ((kwork->profile_name != NULL) &&
- (work->name != NULL) &&
- (strcmp(work->name, kwork->profile_name) != 0))
+ /*
+ * report top needs to collect the runtime of all tasks to
+ * calculate the load of each core.
+ */
+ if ((kwork->report != KWORK_REPORT_TOP) &&
+ !profile_name_match(kwork, work)) {
return false;
+ }

profile_update_timespan(kwork, sample);
return true;
@@ -2070,6 +2108,9 @@ static void top_merge_tasks(struct perf_kwork *kwork)
rb_erase_cached(node, &class->work_root);
data = rb_entry(node, struct kwork_work, node);

+ if (!profile_name_match(kwork, data))
+ continue;
+
cpu = data->cpu;
merged_work = find_work_by_id(&merged_root, data->id,
data->id == 0 ? cpu : -1);
@@ -2329,6 +2370,16 @@ int cmd_kwork(int argc, const char **argv)
OPT_PARENT(kwork_options)
};
const struct option top_options[] = {
+ OPT_STRING('s', "sort", &kwork.sort_order, "key[,key2...]",
+ "sort by key(s): rate, runtime, tid"),
+ OPT_STRING('C', "cpu", &kwork.cpu_list, "cpu",
+ "list of cpus to profile"),
+ OPT_STRING('n', "name", &kwork.profile_name, "name",
+ "event name to profile"),
+ OPT_STRING(0, "time", &kwork.time_str, "str",
+ "Time span for analysis (start,stop)"),
+ OPT_STRING('i', "input", &input_name, "file",
+ "input file name"),
OPT_PARENT(kwork_options)
};
const char *kwork_usage[] = {
--
2.30.GIT


2023-08-12 09:25:49

by Yang Jihong

[permalink] [raw]
Subject: [RFC v1 05/16] perf kwork: Overwrite original atom in the list when a new atom is pushed.

work_push_atom() supports nesting. Currently, all supported kworks are not
nested. A `overwrite` parameter is added to overwrite the original atom in
the list.

Signed-off-by: Yang Jihong <[email protected]>
---
tools/perf/builtin-kwork.c | 24 ++++++++++++++++++------
1 file changed, 18 insertions(+), 6 deletions(-)

diff --git a/tools/perf/builtin-kwork.c b/tools/perf/builtin-kwork.c
index 42ea59a957ae..f620911a26a2 100644
--- a/tools/perf/builtin-kwork.c
+++ b/tools/perf/builtin-kwork.c
@@ -392,9 +392,10 @@ static int work_push_atom(struct perf_kwork *kwork,
struct evsel *evsel,
struct perf_sample *sample,
struct machine *machine,
- struct kwork_work **ret_work)
+ struct kwork_work **ret_work,
+ bool overwrite)
{
- struct kwork_atom *atom, *dst_atom;
+ struct kwork_atom *atom, *dst_atom, *last_atom;
struct kwork_work *work, key;

BUG_ON(class->work_init == NULL);
@@ -427,6 +428,17 @@ static int work_push_atom(struct perf_kwork *kwork,
if (ret_work != NULL)
*ret_work = work;

+ if (overwrite) {
+ last_atom = list_last_entry_or_null(&work->atom_list[src_type],
+ struct kwork_atom, list);
+ if (last_atom) {
+ atom_del(last_atom);
+
+ kwork->nr_skipped_events[src_type]++;
+ kwork->nr_skipped_events[KWORK_TRACE_MAX]++;
+ }
+ }
+
list_add_tail(&atom->list, &work->atom_list[src_type]);

return 0;
@@ -502,7 +514,7 @@ static int report_entry_event(struct perf_kwork *kwork,
{
return work_push_atom(kwork, class, KWORK_TRACE_ENTRY,
KWORK_TRACE_MAX, evsel, sample,
- machine, NULL);
+ machine, NULL, true);
}

static int report_exit_event(struct perf_kwork *kwork,
@@ -557,7 +569,7 @@ static int latency_raise_event(struct perf_kwork *kwork,
{
return work_push_atom(kwork, class, KWORK_TRACE_RAISE,
KWORK_TRACE_MAX, evsel, sample,
- machine, NULL);
+ machine, NULL, true);
}

static int latency_entry_event(struct perf_kwork *kwork,
@@ -716,7 +728,7 @@ static int timehist_raise_event(struct perf_kwork *kwork,
{
return work_push_atom(kwork, class, KWORK_TRACE_RAISE,
KWORK_TRACE_MAX, evsel, sample,
- machine, NULL);
+ machine, NULL, true);
}

static int timehist_entry_event(struct perf_kwork *kwork,
@@ -730,7 +742,7 @@ static int timehist_entry_event(struct perf_kwork *kwork,

ret = work_push_atom(kwork, class, KWORK_TRACE_ENTRY,
KWORK_TRACE_RAISE, evsel, sample,
- machine, &work);
+ machine, &work, true);
if (ret)
return ret;

--
2.30.GIT


2023-08-12 09:26:10

by Yang Jihong

[permalink] [raw]
Subject: [RFC v1 16/16] perf kwork top: Add BPF-based statistics on softirq event support

Use bpf to collect statistics on softirq events based on perf BPF skeletons.

Example usage:

# perf kwork top -b
Starting trace, Hit <Ctrl+C> to stop and report
^C
Total : 135445.704 ms, 8 cpus
%Cpu(s): 28.35% id, 0.00% hi, 0.25% si
%Cpu0 [|||||||||||||||||||| 69.85%]
%Cpu1 [|||||||||||||||||||||| 74.10%]
%Cpu2 [||||||||||||||||||||| 71.18%]
%Cpu3 [|||||||||||||||||||| 69.61%]
%Cpu4 [|||||||||||||||||||||| 74.05%]
%Cpu5 [|||||||||||||||||||| 69.33%]
%Cpu6 [|||||||||||||||||||| 69.71%]
%Cpu7 [|||||||||||||||||||||| 73.77%]

PID SPID %CPU RUNTIME COMMMAND
-------------------------------------------------------------
0 0 30.43 5271.005 ms [swapper/5]
0 0 30.17 5226.644 ms [swapper/3]
0 0 30.08 5210.257 ms [swapper/6]
0 0 29.89 5177.177 ms [swapper/0]
0 0 28.51 4938.672 ms [swapper/2]
0 0 25.93 4223.464 ms [swapper/7]
0 0 25.69 4181.411 ms [swapper/4]
0 0 25.63 4173.804 ms [swapper/1]
16665 16265 2.16 360.600 ms sched-messaging
16537 16265 2.05 356.275 ms sched-messaging
16503 16265 2.01 343.063 ms sched-messaging
16424 16265 1.97 336.876 ms sched-messaging
16580 16265 1.94 323.658 ms sched-messaging
16515 16265 1.92 321.616 ms sched-messaging
16659 16265 1.91 325.538 ms sched-messaging
16634 16265 1.88 327.766 ms sched-messaging
16454 16265 1.87 326.843 ms sched-messaging
16382 16265 1.87 322.591 ms sched-messaging
16642 16265 1.86 320.506 ms sched-messaging
16582 16265 1.86 320.164 ms sched-messaging
16315 16265 1.86 326.872 ms sched-messaging
16637 16265 1.85 323.766 ms sched-messaging
16506 16265 1.82 311.688 ms sched-messaging
16512 16265 1.81 304.643 ms sched-messaging
16560 16265 1.80 314.751 ms sched-messaging
16320 16265 1.80 313.405 ms sched-messaging
16442 16265 1.80 314.403 ms sched-messaging
16626 16265 1.78 295.380 ms sched-messaging
16600 16265 1.77 309.444 ms sched-messaging
16550 16265 1.76 301.161 ms sched-messaging
16525 16265 1.75 296.560 ms sched-messaging
16314 16265 1.75 298.338 ms sched-messaging
16595 16265 1.74 304.390 ms sched-messaging
16555 16265 1.74 287.564 ms sched-messaging
16520 16265 1.74 295.734 ms sched-messaging
16507 16265 1.73 293.956 ms sched-messaging
16593 16265 1.72 296.443 ms sched-messaging
16531 16265 1.72 299.950 ms sched-messaging
16281 16265 1.72 301.339 ms sched-messaging
<SNIP>

Signed-off-by: Yang Jihong <[email protected]>
---
tools/perf/util/bpf_kwork_top.c | 11 ++++
tools/perf/util/bpf_skel/kwork_top.bpf.c | 72 ++++++++++++++++++++++++
2 files changed, 83 insertions(+)

diff --git a/tools/perf/util/bpf_kwork_top.c b/tools/perf/util/bpf_kwork_top.c
index 3998bd2a938f..1a607b94f44d 100644
--- a/tools/perf/util/bpf_kwork_top.c
+++ b/tools/perf/util/bpf_kwork_top.c
@@ -89,6 +89,16 @@ static struct kwork_class_bpf kwork_irq_bpf = {
.load_prepare = irq_load_prepare,
};

+static void softirq_load_prepare(void)
+{
+ bpf_program__set_autoload(skel->progs.on_softirq_entry, true);
+ bpf_program__set_autoload(skel->progs.on_softirq_exit, true);
+}
+
+static struct kwork_class_bpf kwork_softirq_bpf = {
+ .load_prepare = softirq_load_prepare,
+};
+
static void sched_load_prepare(void)
{
bpf_program__set_autoload(skel->progs.on_switch, true);
@@ -101,6 +111,7 @@ static struct kwork_class_bpf kwork_sched_bpf = {
static struct kwork_class_bpf *
kwork_class_bpf_supported_list[KWORK_CLASS_MAX] = {
[KWORK_CLASS_IRQ] = &kwork_irq_bpf,
+ [KWORK_CLASS_SOFTIRQ] = &kwork_softirq_bpf,
[KWORK_CLASS_SCHED] = &kwork_sched_bpf,
};

diff --git a/tools/perf/util/bpf_skel/kwork_top.bpf.c b/tools/perf/util/bpf_skel/kwork_top.bpf.c
index 9c7dc62386c7..84c15ccbab44 100644
--- a/tools/perf/util/bpf_skel/kwork_top.bpf.c
+++ b/tools/perf/util/bpf_skel/kwork_top.bpf.c
@@ -263,4 +263,76 @@ int on_irq_handler_exit(u64 *cxt)
return 0;
}

+SEC("tp_btf/softirq_entry")
+int on_softirq_entry(u64 *cxt)
+{
+ struct task_struct *task;
+
+ if (!enabled)
+ return 0;
+
+ __u32 cpu = bpf_get_smp_processor_id();
+
+ if (cpu_is_filtered(cpu))
+ return 0;
+
+ __u64 ts = bpf_ktime_get_ns();
+
+ task = (struct task_struct *)bpf_get_current_task();
+ if (!task)
+ return 0;
+
+ struct work_key key = {
+ .type = KWORK_CLASS_SOFTIRQ,
+ .pid = BPF_CORE_READ(task, pid),
+ .task_p = (__u64)task,
+ };
+
+ struct time_data data = {
+ .timestamp = ts,
+ };
+
+ bpf_map_update_elem(&kwork_top_irq_time, &key, &data, BPF_ANY);
+
+ return 0;
+}
+
+SEC("tp_btf/softirq_exit")
+int on_softirq_exit(u64 *cxt)
+{
+ __u64 delta;
+ struct task_struct *task;
+ struct time_data *pelem;
+
+ if (!enabled)
+ return 0;
+
+ __u32 cpu = bpf_get_smp_processor_id();
+
+ if (cpu_is_filtered(cpu))
+ return 0;
+
+ __u64 ts = bpf_ktime_get_ns();
+
+ task = (struct task_struct *)bpf_get_current_task();
+ if (!task)
+ return 0;
+
+ struct work_key key = {
+ .type = KWORK_CLASS_SOFTIRQ,
+ .pid = BPF_CORE_READ(task, pid),
+ .task_p = (__u64)task,
+ };
+
+ pelem = bpf_map_lookup_elem(&kwork_top_irq_time, &key);
+ if (pelem)
+ delta = ts - pelem->timestamp;
+ else
+ delta = ts - from_timestamp;
+
+ update_work(&key, delta);
+
+ return 0;
+}
+
char LICENSE[] SEC("license") = "Dual BSD/GPL";
--
2.30.GIT


2023-08-12 09:26:11

by Yang Jihong

[permalink] [raw]
Subject: [RFC v1 02/16] perf kwork: Add the supported subcommands to the document

Add missing report, latency and timehist subcommands to the document.

Fixes: f98919ec4fcc ("perf kwork: Implement 'report' subcommand")
Fixes: ad3d9f7a929a ("perf kwork: Implement perf kwork latency")
Fixes: bcc8b3e88d6f ("perf kwork: Implement perf kwork timehist")
Signed-off-by: Yang Jihong <[email protected]>
---
tools/perf/Documentation/perf-kwork.txt | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/tools/perf/Documentation/perf-kwork.txt b/tools/perf/Documentation/perf-kwork.txt
index 3c36324712b6..482d6c52e2ed 100644
--- a/tools/perf/Documentation/perf-kwork.txt
+++ b/tools/perf/Documentation/perf-kwork.txt
@@ -8,7 +8,7 @@ perf-kwork - Tool to trace/measure kernel work properties (latencies)
SYNOPSIS
--------
[verse]
-'perf kwork' {record}
+'perf kwork' {record|report|latency|timehist}

DESCRIPTION
-----------
--
2.30.GIT


2023-08-12 09:27:38

by Yang Jihong

[permalink] [raw]
Subject: [RFC v1 03/16] perf kwork: Set ordered_events for perf_tool

perf kwork processes data based on timestamps and needs to sort events.

Fixes: f98919ec4fcc ("perf kwork: Implement 'report' subcommand")
Signed-off-by: Yang Jihong <[email protected]>
---
tools/perf/builtin-kwork.c | 7 ++++---
1 file changed, 4 insertions(+), 3 deletions(-)

diff --git a/tools/perf/builtin-kwork.c b/tools/perf/builtin-kwork.c
index 73b5dc099a8a..de2fbb7c56c3 100644
--- a/tools/perf/builtin-kwork.c
+++ b/tools/perf/builtin-kwork.c
@@ -1694,9 +1694,10 @@ int cmd_kwork(int argc, const char **argv)
static struct perf_kwork kwork = {
.class_list = LIST_HEAD_INIT(kwork.class_list),
.tool = {
- .mmap = perf_event__process_mmap,
- .mmap2 = perf_event__process_mmap2,
- .sample = perf_kwork__process_tracepoint_sample,
+ .mmap = perf_event__process_mmap,
+ .mmap2 = perf_event__process_mmap2,
+ .sample = perf_kwork__process_tracepoint_sample,
+ .ordered_events = true,
},
.atom_page_list = LIST_HEAD_INIT(kwork.atom_page_list),
.sort_list = LIST_HEAD_INIT(kwork.sort_list),
--
2.30.GIT


2023-09-04 13:41:25

by Yang Jihong

[permalink] [raw]
Subject: Re: [RFC v1 00/16] perf kwork: Implement perf kwork top

Hello,

On 2023/9/4 13:13, Ian Rogers wrote:
> On Sat, Aug 12, 2023 at 1:52 AM Yang Jihong <[email protected]> wrote:
>>
>> Some common tools for collecting statistics on CPU usage, such as top,
>> obtain statistics from timer interrupt sampling, and then periodically
>> read statistics from /proc/stat.
>>
>> This method has some deviations:
>> 1. In the tick interrupt, the time between the last tick and the current
>> tick is counted in the current task. However, the task may be running
>> only part of the time.
>> 2. For each task, the top tool periodically reads the /proc/{PID}/status
>> information. For tasks with a short life cycle, it may be missed.
>>
>> In conclusion, the top tool cannot accurately collect statistics on the
>> CPU usage and running time of tasks.
>>
>> The statistical method based on sched_switch tracepoint can accurately
>> calculate the CPU usage of all tasks. This method is applicable to
>> scenarios where performance comparison data is of high precision.
>>
>> In addition to parsing the perf.data file, the provides BPF-based CPU usage
>> statistics to reduce the load of the perf process.
>>
>> Example usage:
>>
>> # perf kwork top -h
>>
>> Usage: perf kwork top [<options>]
>>
>> -C, --cpu <cpu> list of cpus to profile
>> -i, --input <file> input file name
>> -n, --name <name> event name to profile
>> -s, --sort <key[,key2...]>
>> sort by key(s): rate, runtime, tid
>> --time <str> Time span for analysis (start,stop)
>>
>> # ./perf kwork -k sched,irq,softirq record -- ./perf bench sched messaging -g 1 -l 10000
>> # Running 'sched/messaging' benchmark:
>> # 20 sender and receiver processes per group
>> # 1 groups == 40 processes run
>>
>> Total time: 1.854 [sec]
>> [ perf record: Woken up 13 times to write data ]
>> [ perf record: Captured and wrote 27.436 MB perf.data (235986 samples) ]
>> #
>> # perf kwork top
>>
>> Total : 22419.068 ms, 12 cpus
>> %Cpu(s): 17.99% id, 0.00% hi, 0.09% si
>> %Cpu0 [|||||||||||||||||||||||| 82.56%]
>> %Cpu1 [|||||||||||||||||||||||| 81.73%]
>> %Cpu2 [|||||||||||||||||||||||| 83.00%]
>> %Cpu3 [|||||||||||||||||||||||| 81.01%]
>> %Cpu4 [|||||||||||||||||||||||| 81.66%]
>> %Cpu5 [|||||||||||||||||||||||| 82.10%]
>> %Cpu6 [|||||||||||||||||||||||| 81.65%]
>> %Cpu7 [|||||||||||||||||||||||| 82.00%]
>> %Cpu8 [|||||||||||||||||||||||| 82.54%]
>> %Cpu9 [|||||||||||||||||||||||| 81.02%]
>> %Cpu10 [|||||||||||||||||||||||| 81.78%]
>> %Cpu11 [|||||||||||||||||||||||| 81.87%]
>>
>> PID %CPU RUNTIME COMMMAND
>> ----------------------------------------------------
>> 2913025 27.62 516.976 ms sched-messaging
>> 2913017 27.56 516.273 ms sched-messaging
>> 2913018 27.56 516.152 ms sched-messaging
>> 2913008 27.54 515.447 ms sched-messaging
>> 2913010 27.50 514.890 ms sched-messaging
>> 2913007 27.48 514.411 ms sched-messaging
>> 2913015 27.36 512.563 ms sched-messaging
>> 2913026 27.35 512.198 ms sched-messaging
>> 2913011 27.32 511.632 ms sched-messaging
>> 2913014 27.32 511.381 ms sched-messaging
>> 2913012 27.30 511.138 ms sched-messaging
>> 2913013 27.30 511.109 ms sched-messaging
>> 2913009 27.30 510.997 ms sched-messaging
>> 2913019 27.25 510.488 ms sched-messaging
>> 2913021 27.23 509.661 ms sched-messaging
>> 2913023 27.21 509.400 ms sched-messaging
>> 2913020 27.20 509.677 ms sched-messaging
>> 2913022 27.19 509.061 ms sched-messaging
>> 2913016 27.18 509.231 ms sched-messaging
>> 2913024 27.18 509.108 ms sched-messaging
>> 2912999 21.79 407.929 ms sched-messaging
>> 2913000 21.78 408.045 ms sched-messaging
>> 2912998 21.75 407.579 ms sched-messaging
>> 2912993 21.69 406.166 ms sched-messaging
>> 2912991 21.59 404.378 ms sched-messaging
>> 2912992 21.57 403.845 ms sched-messaging
>> 2913005 21.56 403.715 ms sched-messaging
>> 2913001 21.55 403.803 ms sched-messaging
>> 2912990 21.54 403.601 ms sched-messaging
>> 2912994 21.52 403.087 ms sched-messaging
>> 2912995 21.49 402.421 ms sched-messaging
>> 2912996 21.48 402.666 ms sched-messaging
>> 2912989 21.46 402.303 ms sched-messaging
>> 2913003 21.46 402.034 ms sched-messaging
>> 2912988 21.44 401.820 ms sched-messaging
>> 2913004 21.37 400.242 ms sched-messaging
>> 2912987 21.28 398.512 ms sched-messaging
>> 2913002 21.27 398.759 ms sched-messaging
>> 2912997 21.27 398.518 ms sched-messaging
>> 2913006 21.23 397.888 ms sched-messaging
>> 0 18.89 353.061 ms swapper/3
>> 0 18.89 353.026 ms swapper/9
>> 0 18.26 341.190 ms swapper/6
>> 0 18.25 341.048 ms swapper/4
>> 0 18.13 338.844 ms swapper/10
>> 0 18.12 338.686 ms swapper/1
>> 0 18.05 337.333 ms swapper/11
>> 0 17.92 334.903 ms swapper/7
>> 0 17.80 332.691 ms swapper/5
>> 0 17.38 324.762 ms swapper/8
>> 0 17.29 323.102 ms swapper/0
>> 0 16.89 315.630 ms swapper/2
>> 2912984 2.10 39.452 ms perf
>> 2912985 0.73 14.004 ms sched-messaging
>> 660381 0.14 3.527 ms containerd
>> 3006112 0.07 1.402 ms redis-server
>> 2904655 0.05 1.071 ms kworker/0:0
>> 659822 0.03 1.729 ms containerd
>> 659824 0.03 1.346 ms containerd
>> 1053 0.01 0.353 ms zabbix_agentd
>> 2895571 0.01 0.349 ms kworker/8:1
>> 10 0.00 0.535 ms rcu_sched
>> 2912192 0.00 0.272 ms kworker/u24:2
>> 2903540 0.00 0.182 ms sshd
>> 801 0.00 0.120 ms jbd2/sda4-8
>> 2929605 0.00 0.108 ms grpc_global_tim
>> 2912986 0.00 0.075 ms perf
>> 2897765 0.00 0.073 ms kworker/7:1
>> 2912817 0.00 0.070 ms kworker/2:1
>> 391756 0.00 0.067 ms grpc_global_tim
>> 2901459 0.00 0.056 ms kworker/3:0
>> 2908185 0.00 0.052 ms kworker/10:1
>> 2901521 0.00 0.050 ms kworker/6:1
>> 2902444 0.00 0.046 ms kworker/5:1
>> 2898513 0.00 0.041 ms kworker/1:1
>> 2912280 0.00 0.039 ms kworker/11:3
>> 1057 0.00 0.037 ms zabbix_agentd
>> 2908010 0.00 0.037 ms kworker/9:3
>> 2912951 0.00 0.036 ms kworker/4:3
>> 793 0.00 0.027 ms multipathd
>> 42 0.00 0.023 ms ksoftirqd/5
>> 9 0.00 0.022 ms ksoftirqd/0
>> 24 0.00 0.019 ms ksoftirqd/2
>> 59 0.00 0.019 ms migration/8
>> 2929607 0.00 0.018 ms wecode-db
>> 29 0.00 0.012 ms migration/3
>> 11 0.00 0.012 ms migration/0
>> 65 0.00 0.012 ms migration/9
>> 17 0.00 0.011 ms migration/1
>> 71 0.00 0.011 ms migration/10
>> 53 0.00 0.011 ms migration/7
>> 23 0.00 0.011 ms migration/2
>> 47 0.00 0.011 ms migration/6
>> 789 0.00 0.010 ms multipathd
>> 35 0.00 0.010 ms migration/4
>> 480 0.00 0.009 ms kworker/4:1H
>> 41 0.00 0.008 ms migration/5
>> 54 0.00 0.006 ms ksoftirqd/7
>> 36 0.00 0.005 ms ksoftirqd/4
>> 72 0.00 0.005 ms ksoftirqd/10
>> 66 0.00 0.005 ms ksoftirqd/9
>> 30 0.00 0.004 ms ksoftirqd/3
>> 2898362 0.00 0.003 ms kworker/u24:0
>>
>> # perf kwork top -C 2,4,5
>>
>> Total : 5604.885 ms, 3 cpus
>> %Cpu(s): 17.65% id, 0.00% hi, 0.09% si
>> %Cpu2 [|||||||||||||||||||||||| 83.00%]
>> %Cpu4 [|||||||||||||||||||||||| 81.66%]
>> %Cpu5 [|||||||||||||||||||||||| 82.10%]
>>
>> PID %CPU RUNTIME COMMMAND
>> ----------------------------------------------------
>> 0 18.25 341.048 ms swapper/4
>> 0 17.80 332.691 ms swapper/5
>> 0 16.89 315.630 ms swapper/2
>> 2913012 8.99 168.201 ms sched-messaging
>> 2913021 8.74 163.456 ms sched-messaging
>> 2913026 8.34 156.120 ms sched-messaging
>> 2913010 8.14 152.372 ms sched-messaging
>> 2913007 7.74 144.754 ms sched-messaging
>> 2913016 7.42 138.977 ms sched-messaging
>> 2913022 7.28 136.279 ms sched-messaging
>> 2913013 7.00 130.894 ms sched-messaging
>> 2913019 6.96 130.455 ms sched-messaging
>> 2913023 6.91 129.364 ms sched-messaging
>> 2913008 6.47 121.331 ms sched-messaging
>> 2913018 6.47 121.124 ms sched-messaging
>> 2912994 6.42 120.213 ms sched-messaging
>> 2913025 6.42 120.140 ms sched-messaging
>> 2913020 6.37 119.386 ms sched-messaging
>> 2913011 6.35 118.921 ms sched-messaging
>> 2913014 6.24 116.779 ms sched-messaging
>> 2913009 6.01 112.661 ms sched-messaging
>> 2913005 5.96 111.587 ms sched-messaging
>> 2913003 5.94 111.142 ms sched-messaging
>> 2913024 5.87 109.876 ms sched-messaging
>> 2912988 5.84 109.396 ms sched-messaging
>> 2912987 5.80 108.550 ms sched-messaging
>> 2912990 5.51 103.322 ms sched-messaging
>> 2912993 5.45 102.045 ms sched-messaging
>> 2912996 5.42 101.622 ms sched-messaging
>> 2913006 5.42 101.592 ms sched-messaging
>> 2913000 5.41 101.511 ms sched-messaging
>> 2913002 5.41 101.420 ms sched-messaging
>> 2912997 5.40 101.315 ms sched-messaging
>> 2913004 5.33 99.872 ms sched-messaging
>> 2913015 5.29 99.252 ms sched-messaging
>> 2913017 5.22 97.822 ms sched-messaging
>> 2912991 5.11 95.773 ms sched-messaging
>> 2912992 5.11 95.579 ms sched-messaging
>> 2913001 5.07 95.033 ms sched-messaging
>> 2912989 4.93 92.425 ms sched-messaging
>> 2912995 4.85 90.892 ms sched-messaging
>> 2912998 4.78 89.617 ms sched-messaging
>> 2912999 4.56 85.576 ms sched-messaging
>> 3006112 0.07 1.402 ms redis-server
>> 660381 0.02 0.566 ms containerd
>> 2912984 0.02 0.452 ms perf
>> 659824 0.01 0.369 ms containerd
>> 659822 0.00 0.316 ms containerd
>> 10 0.00 0.176 ms rcu_sched
>> 801 0.00 0.120 ms jbd2/sda4-8
>> 2912985 0.00 0.107 ms sched-messaging
>> 2912986 0.00 0.075 ms perf
>> 2912817 0.00 0.070 ms kworker/2:1
>> 2912192 0.00 0.056 ms kworker/u24:2
>> 2929605 0.00 0.046 ms grpc_global_tim
>> 2902444 0.00 0.046 ms kworker/5:1
>> 2912951 0.00 0.036 ms kworker/4:3
>> 42 0.00 0.023 ms ksoftirqd/5
>> 24 0.00 0.019 ms ksoftirqd/2
>> 23 0.00 0.011 ms migration/2
>> 35 0.00 0.010 ms migration/4
>> 480 0.00 0.009 ms kworker/4:1H
>> 41 0.00 0.008 ms migration/5
>> 36 0.00 0.005 ms ksoftirqd/4
>>
>> # perf kwork top -n perf
>>
>> Total : 22419.068 ms, 12 cpus
>> %Cpu(s): 17.99% id, 0.00% hi, 0.09% si
>> %Cpu0 [ 0.00%]
>> %Cpu1 [ 0.00%]
>> %Cpu2 [ 0.02%]
>> %Cpu3 [ 0.00%]
>> %Cpu4 [ 0.00%]
>> %Cpu5 [ 0.00%]
>> %Cpu6 [ 0.00%]
>> %Cpu7 [ 0.00%]
>> %Cpu8 [ 0.03%]
>> %Cpu9 [ 0.09%]
>> %Cpu10 [ 0.00%]
>> %Cpu11 [ 1.96%]
>>
>> PID %CPU RUNTIME COMMMAND
>> ----------------------------------------------------
>> 2912984 2.10 39.452 ms perf
>> 2912986 0.00 0.075 ms perf
>>
>> # perf kwork top -s tid -n sched-messaging
>>
>> Total : 22419.068 ms, 12 cpus
>> %Cpu(s): 17.99% id, 0.00% hi, 0.09% si
>> %Cpu0 [|||||||||||||||||||||||| 81.80%]
>> %Cpu1 [|||||||||||||||||||||||| 81.65%]
>> %Cpu2 [|||||||||||||||||||||||| 82.88%]
>> %Cpu3 [|||||||||||||||||||||||| 80.96%]
>> %Cpu4 [|||||||||||||||||||||||| 81.64%]
>> %Cpu5 [|||||||||||||||||||||||| 82.04%]
>> %Cpu6 [|||||||||||||||||||||||| 81.63%]
>> %Cpu7 [|||||||||||||||||||||||| 81.97%]
>> %Cpu8 [|||||||||||||||||||||||| 82.43%]
>> %Cpu9 [|||||||||||||||||||||||| 80.86%]
>> %Cpu10 [|||||||||||||||||||||||| 81.72%]
>> %Cpu11 [||||||||||||||||||||||| 79.89%]
>>
>> PID %CPU RUNTIME COMMMAND
>> ----------------------------------------------------
>> 2912985 0.04 1.111 ms sched-messaging
>> 2912987 21.28 398.512 ms sched-messaging
>> 2912988 21.44 401.820 ms sched-messaging
>> 2912989 21.46 402.303 ms sched-messaging
>> 2912990 21.54 403.601 ms sched-messaging
>> 2912991 21.59 404.378 ms sched-messaging
>> 2912992 21.57 403.845 ms sched-messaging
>> 2912993 21.69 406.166 ms sched-messaging
>> 2912994 21.52 403.087 ms sched-messaging
>> 2912995 21.49 402.421 ms sched-messaging
>> 2912996 21.48 402.666 ms sched-messaging
>> 2912997 21.27 398.518 ms sched-messaging
>> 2912998 21.75 407.579 ms sched-messaging
>> 2912999 21.79 407.929 ms sched-messaging
>> 2913000 21.78 408.045 ms sched-messaging
>> 2913001 21.55 403.803 ms sched-messaging
>> 2913002 21.27 398.759 ms sched-messaging
>> 2913003 21.46 402.034 ms sched-messaging
>> 2913004 21.37 400.242 ms sched-messaging
>> 2913005 21.56 403.715 ms sched-messaging
>> 2913006 21.23 397.888 ms sched-messaging
>> 2913007 27.48 514.411 ms sched-messaging
>> 2913008 27.54 515.447 ms sched-messaging
>> 2913009 27.30 510.997 ms sched-messaging
>> 2913010 27.50 514.890 ms sched-messaging
>> 2913011 27.32 511.632 ms sched-messaging
>> 2913012 27.30 511.138 ms sched-messaging
>> 2913013 27.30 511.109 ms sched-messaging
>> 2913014 27.32 511.381 ms sched-messaging
>> 2913015 27.36 512.563 ms sched-messaging
>> 2913016 27.18 509.231 ms sched-messaging
>> 2913017 27.56 516.273 ms sched-messaging
>> 2913018 27.56 516.152 ms sched-messaging
>> 2913019 27.25 510.488 ms sched-messaging
>> 2913020 27.20 509.677 ms sched-messaging
>> 2913021 27.23 509.661 ms sched-messaging
>> 2913022 27.19 509.061 ms sched-messaging
>> 2913023 27.21 509.400 ms sched-messaging
>> 2913024 27.18 509.108 ms sched-messaging
>> 2913025 27.62 516.976 ms sched-messaging
>> 2913026 27.35 512.198 ms sched-messaging
>>
>> # perf kwork top -b
>> Starting trace, Hit <Ctrl+C> to stop and report
>> ^C
>> Total : 89209.004 ms, 4 cpus
>> %Cpu(s): 13.47% id, 0.01% hi, 0.24% si
>> %Cpu0 [||||||||||||||||||||||||| 86.08%]
>> %Cpu1 [|||||||||||||||||||||||||| 87.08%]
>> %Cpu2 [||||||||||||||||||||||||| 86.10%]
>> %Cpu3 [||||||||||||||||||||||||| 85.86%]
>>
>> PID SPID %CPU RUNTIME COMMMAND
>> -------------------------------------------------------------
>> 0 0 13.86 3092.482 ms [swapper/3]
>> 0 0 13.71 3057.756 ms [swapper/0]
>> 0 0 13.65 3044.987 ms [swapper/2]
>> 0 0 12.63 2818.079 ms [swapper/1]
>> 320 320 1.32 295.427 ms bash
>> 414 320 1.09 247.658 ms sched-messaging
>> 678 320 1.09 246.881 ms sched-messaging
>> 354 320 1.09 246.683 ms sched-messaging
>> 409 320 1.08 246.839 ms sched-messaging
>> 554 320 1.07 243.045 ms sched-messaging
>> 405 320 1.04 237.340 ms sched-messaging
>> 525 320 1.04 235.718 ms sched-messaging
>> 486 320 1.03 235.369 ms sched-messaging
>> 714 320 1.03 235.142 ms sched-messaging
>> 435 320 1.03 233.290 ms sched-messaging
>> 408 320 1.03 231.687 ms sched-messaging
>> 716 320 1.02 233.513 ms sched-messaging
>> 453 320 1.02 233.181 ms sched-messaging
>> 522 320 1.02 230.101 ms sched-messaging
>> 651 320 1.02 229.554 ms sched-messaging
>> 418 320 1.01 231.359 ms sched-messaging
>> 644 320 1.01 229.848 ms sched-messaging
>> 535 320 1.01 229.655 ms sched-messaging
>> 536 320 1.01 229.147 ms sched-messaging
>> 410 320 1.01 227.700 ms sched-messaging
>> 689 320 1.00 227.988 ms sched-messaging
>> 412 320 1.00 227.052 ms sched-messaging
>> 489 320 1.00 226.374 ms sched-messaging
>> 521 320 1.00 225.499 ms sched-messaging
>> 530 320 1.00 225.262 ms sched-messaging
>> 681 320 1.00 225.187 ms sched-messaging
>> 415 320 0.99 225.714 ms sched-messaging
>> 643 320 0.99 225.090 ms sched-messaging
>> 325 320 0.99 223.385 ms sched-messaging
>> 498 320 0.99 222.936 ms sched-messaging
>> 413 320 0.98 225.213 ms sched-messaging
>> 645 320 0.98 223.211 ms sched-messaging
>> 544 320 0.98 222.714 ms sched-messaging
>> 441 320 0.98 222.590 ms sched-messaging
>> 697 320 0.98 222.426 ms sched-messaging
>> 523 320 0.98 221.841 ms sched-messaging
>> 402 320 0.98 221.776 ms sched-messaging
>> <SNIP>
>>
>> Yang Jihong (16):
>> perf kwork: Fix incorrect and missing free atom in work_push_atom()
>> perf kwork: Add the supported subcommands to the document
>> perf kwork: Set ordered_events for perf_tool
>> perf kwork: Add `kwork` and `src_type` to work_init() for struct
>> kwork_class
>> perf kwork: Overwrite original atom in the list when a new atom is
>> pushed.
>> perf kwork: Set default events list if not specified in
>> setup_event_list()
>> perf kwork: Add sched record support
>> perf kwork: Add `root` parameter to work_sort()
>> perf kwork: Implement perf kwork top
>> perf evsel: Add evsel__intval_common() helper
>> perf kwork top: Add statistics on hardirq event support
>> perf kwork top: Add statistics on softirq event support
>> perf kwork top: Add -C/--cpu -i/--input -n/--name -s/--sort --time
>> options
>> perf kwork top: Implements BPF-based cpu usage statistics
>> perf kwork top: Add BPF-based statistics on hardirq event support
>> perf kwork top: Add BPF-based statistics on softirq event support
>
> Besides documentation nits, series:
> Reviewed-by: Ian Rogers <[email protected]>

Thanks for reivew.

>
> Whilst looking at the series, could we clean up
> tools/perf/util/kwork.h ? Generally none of the structs are commented.

Okay, I'll put up a separate patch and add comments about it.
> Some like:
> > struct kwork_atom {
> struct list_head list;
> u64 time;
> struct kwork_atom *prev;
>
> void *page_addr;
> unsigned long bit_inpage;
> };
>
> Why is it an atom? Why is there a prev when the kwork_atom is also on
> a list (which has a prev) ?
>
An atom indicates a minimum granularity event.
For example, an "irq_hander_entry" event of an IRQ whose irqnum==10 is
an atom.

The prev member is used to store the sequence of events.
For example, the sequence of events is as follows:
raise -> entry -> exit

Then:
entry_atom->prev = raise_atom

This relationship needs to be saved because need to calculate latency
time and running time at the same time in the "perf kwork timehist"

Thanks,
Yang

2023-09-04 18:45:37

by Yang Jihong

[permalink] [raw]
Subject: Re: [RFC v1 05/16] perf kwork: Overwrite original atom in the list when a new atom is pushed.

Hello,

On 2023/9/4 12:13, Ian Rogers wrote:
> On Sat, Aug 12, 2023 at 1:52 AM Yang Jihong <[email protected]> wrote:
>>
>> work_push_atom() supports nesting. Currently, all supported kworks are not
>> nested. A `overwrite` parameter is added to overwrite the original atom in
>> the list.
>>
>> Signed-off-by: Yang Jihong <[email protected]>
>> ---
>> tools/perf/builtin-kwork.c | 24 ++++++++++++++++++------
>> 1 file changed, 18 insertions(+), 6 deletions(-)
>>
>> diff --git a/tools/perf/builtin-kwork.c b/tools/perf/builtin-kwork.c
>> index 42ea59a957ae..f620911a26a2 100644
>> --- a/tools/perf/builtin-kwork.c
>> +++ b/tools/perf/builtin-kwork.c
>> @@ -392,9 +392,10 @@ static int work_push_atom(struct perf_kwork *kwork,
>> struct evsel *evsel,
>> struct perf_sample *sample,
>> struct machine *machine,
>> - struct kwork_work **ret_work)
>> + struct kwork_work **ret_work,
>> + bool overwrite)
>
> kerneldoc would be useful. Pushing something seems self-evident but
> what does overwrite mean without reading the code?

Okay, I'll add comments.

>
>> {
>> - struct kwork_atom *atom, *dst_atom;
>> + struct kwork_atom *atom, *dst_atom, *last_atom;
>> struct kwork_work *work, key;
>>
>> BUG_ON(class->work_init == NULL);
>> @@ -427,6 +428,17 @@ static int work_push_atom(struct perf_kwork *kwork,
>> if (ret_work != NULL)
>> *ret_work = work;
>>
>> + if (overwrite) {
>> + last_atom = list_last_entry_or_null(&work->atom_list[src_type],
>> + struct kwork_atom, list);
>> + if (last_atom) {
>> + atom_del(last_atom);
>> +
>> + kwork->nr_skipped_events[src_type]++;
>> + kwork->nr_skipped_events[KWORK_TRACE_MAX]++;
>> + }
>> + }
>> +
>> list_add_tail(&atom->list, &work->atom_list[src_type]);
>>
>> return 0;
>> @@ -502,7 +514,7 @@ static int report_entry_event(struct perf_kwork *kwork,
>> {
>> return work_push_atom(kwork, class, KWORK_TRACE_ENTRY,
>> KWORK_TRACE_MAX, evsel, sample,
>> - machine, NULL);
>> + machine, NULL, true);
>
> nit: for constant arguments it can be useful to add parameter names
> which can enable checks like clang-tidy's bugprone argument:
> https://clang.llvm.org/extra/clang-tidy/checks/bugprone/argument-comment.html
> This would make this:
> return work_push_atom(kwork, class, KWORK_TRACE_ENTRY,
> KWORK_TRACE_MAX, evsel, sample,
> machine, /*ret_work=*/NULL, /*overwite=*/true);
>
Thanks for your advice, will add parameter names later.

Thanks,
Yang

2023-09-05 17:09:22

by Yang Jihong

[permalink] [raw]
Subject: Re: [RFC v1 00/16] perf kwork: Implement perf kwork top

Hello,

On 2023/9/4 22:54, Ian Rogers wrote:
> On Mon, Sep 4, 2023 at 4:59 AM Yang Jihong <[email protected]> wrote:
>>
>> Hello,
>>
>> On 2023/9/4 13:13, Ian Rogers wrote:
>>> On Sat, Aug 12, 2023 at 1:52 AM Yang Jihong <[email protected]> wrote:
>>>>
>>>> Some common tools for collecting statistics on CPU usage, such as top,
>>>> obtain statistics from timer interrupt sampling, and then periodically
>>>> read statistics from /proc/stat.
>>>>
>>>> This method has some deviations:
>>>> 1. In the tick interrupt, the time between the last tick and the current
>>>> tick is counted in the current task. However, the task may be running
>>>> only part of the time.
>>>> 2. For each task, the top tool periodically reads the /proc/{PID}/status
>>>> information. For tasks with a short life cycle, it may be missed.
>>>>
>>>> In conclusion, the top tool cannot accurately collect statistics on the
>>>> CPU usage and running time of tasks.
>>>>
>>>> The statistical method based on sched_switch tracepoint can accurately
>>>> calculate the CPU usage of all tasks. This method is applicable to
>>>> scenarios where performance comparison data is of high precision.
>>>>
>>>> In addition to parsing the perf.data file, the provides BPF-based CPU usage
>>>> statistics to reduce the load of the perf process.
>>>>
>>>> Example usage:
>>>>
>>>> # perf kwork top -h
>>>>
>>>> Usage: perf kwork top [<options>]
>>>>
>>>> -C, --cpu <cpu> list of cpus to profile
>>>> -i, --input <file> input file name
>>>> -n, --name <name> event name to profile
>>>> -s, --sort <key[,key2...]>
>>>> sort by key(s): rate, runtime, tid
>>>> --time <str> Time span for analysis (start,stop)
>>>>
>>>> # ./perf kwork -k sched,irq,softirq record -- ./perf bench sched messaging -g 1 -l 10000
>>>> # Running 'sched/messaging' benchmark:
>>>> # 20 sender and receiver processes per group
>>>> # 1 groups == 40 processes run
>>>>
>>>> Total time: 1.854 [sec]
>>>> [ perf record: Woken up 13 times to write data ]
>>>> [ perf record: Captured and wrote 27.436 MB perf.data (235986 samples) ]
>>>> #
>>>> # perf kwork top
>>>>
>>>> Total : 22419.068 ms, 12 cpus
>>>> %Cpu(s): 17.99% id, 0.00% hi, 0.09% si
>>>> %Cpu0 [|||||||||||||||||||||||| 82.56%]
>>>> %Cpu1 [|||||||||||||||||||||||| 81.73%]
>>>> %Cpu2 [|||||||||||||||||||||||| 83.00%]
>>>> %Cpu3 [|||||||||||||||||||||||| 81.01%]
>>>> %Cpu4 [|||||||||||||||||||||||| 81.66%]
>>>> %Cpu5 [|||||||||||||||||||||||| 82.10%]
>>>> %Cpu6 [|||||||||||||||||||||||| 81.65%]
>>>> %Cpu7 [|||||||||||||||||||||||| 82.00%]
>>>> %Cpu8 [|||||||||||||||||||||||| 82.54%]
>>>> %Cpu9 [|||||||||||||||||||||||| 81.02%]
>>>> %Cpu10 [|||||||||||||||||||||||| 81.78%]
>>>> %Cpu11 [|||||||||||||||||||||||| 81.87%]
>>>>
>>>> PID %CPU RUNTIME COMMMAND
>>>> ----------------------------------------------------
>>>> 2913025 27.62 516.976 ms sched-messaging
>>>> 2913017 27.56 516.273 ms sched-messaging
>>>> 2913018 27.56 516.152 ms sched-messaging
>>>> 2913008 27.54 515.447 ms sched-messaging
>>>> 2913010 27.50 514.890 ms sched-messaging
>>>> 2913007 27.48 514.411 ms sched-messaging
>>>> 2913015 27.36 512.563 ms sched-messaging
>>>> 2913026 27.35 512.198 ms sched-messaging
>>>> 2913011 27.32 511.632 ms sched-messaging
>>>> 2913014 27.32 511.381 ms sched-messaging
>>>> 2913012 27.30 511.138 ms sched-messaging
>>>> 2913013 27.30 511.109 ms sched-messaging
>>>> 2913009 27.30 510.997 ms sched-messaging
>>>> 2913019 27.25 510.488 ms sched-messaging
>>>> 2913021 27.23 509.661 ms sched-messaging
>>>> 2913023 27.21 509.400 ms sched-messaging
>>>> 2913020 27.20 509.677 ms sched-messaging
>>>> 2913022 27.19 509.061 ms sched-messaging
>>>> 2913016 27.18 509.231 ms sched-messaging
>>>> 2913024 27.18 509.108 ms sched-messaging
>>>> 2912999 21.79 407.929 ms sched-messaging
>>>> 2913000 21.78 408.045 ms sched-messaging
>>>> 2912998 21.75 407.579 ms sched-messaging
>>>> 2912993 21.69 406.166 ms sched-messaging
>>>> 2912991 21.59 404.378 ms sched-messaging
>>>> 2912992 21.57 403.845 ms sched-messaging
>>>> 2913005 21.56 403.715 ms sched-messaging
>>>> 2913001 21.55 403.803 ms sched-messaging
>>>> 2912990 21.54 403.601 ms sched-messaging
>>>> 2912994 21.52 403.087 ms sched-messaging
>>>> 2912995 21.49 402.421 ms sched-messaging
>>>> 2912996 21.48 402.666 ms sched-messaging
>>>> 2912989 21.46 402.303 ms sched-messaging
>>>> 2913003 21.46 402.034 ms sched-messaging
>>>> 2912988 21.44 401.820 ms sched-messaging
>>>> 2913004 21.37 400.242 ms sched-messaging
>>>> 2912987 21.28 398.512 ms sched-messaging
>>>> 2913002 21.27 398.759 ms sched-messaging
>>>> 2912997 21.27 398.518 ms sched-messaging
>>>> 2913006 21.23 397.888 ms sched-messaging
>>>> 0 18.89 353.061 ms swapper/3
>>>> 0 18.89 353.026 ms swapper/9
>>>> 0 18.26 341.190 ms swapper/6
>>>> 0 18.25 341.048 ms swapper/4
>>>> 0 18.13 338.844 ms swapper/10
>>>> 0 18.12 338.686 ms swapper/1
>>>> 0 18.05 337.333 ms swapper/11
>>>> 0 17.92 334.903 ms swapper/7
>>>> 0 17.80 332.691 ms swapper/5
>>>> 0 17.38 324.762 ms swapper/8
>>>> 0 17.29 323.102 ms swapper/0
>>>> 0 16.89 315.630 ms swapper/2
>>>> 2912984 2.10 39.452 ms perf
>>>> 2912985 0.73 14.004 ms sched-messaging
>>>> 660381 0.14 3.527 ms containerd
>>>> 3006112 0.07 1.402 ms redis-server
>>>> 2904655 0.05 1.071 ms kworker/0:0
>>>> 659822 0.03 1.729 ms containerd
>>>> 659824 0.03 1.346 ms containerd
>>>> 1053 0.01 0.353 ms zabbix_agentd
>>>> 2895571 0.01 0.349 ms kworker/8:1
>>>> 10 0.00 0.535 ms rcu_sched
>>>> 2912192 0.00 0.272 ms kworker/u24:2
>>>> 2903540 0.00 0.182 ms sshd
>>>> 801 0.00 0.120 ms jbd2/sda4-8
>>>> 2929605 0.00 0.108 ms grpc_global_tim
>>>> 2912986 0.00 0.075 ms perf
>>>> 2897765 0.00 0.073 ms kworker/7:1
>>>> 2912817 0.00 0.070 ms kworker/2:1
>>>> 391756 0.00 0.067 ms grpc_global_tim
>>>> 2901459 0.00 0.056 ms kworker/3:0
>>>> 2908185 0.00 0.052 ms kworker/10:1
>>>> 2901521 0.00 0.050 ms kworker/6:1
>>>> 2902444 0.00 0.046 ms kworker/5:1
>>>> 2898513 0.00 0.041 ms kworker/1:1
>>>> 2912280 0.00 0.039 ms kworker/11:3
>>>> 1057 0.00 0.037 ms zabbix_agentd
>>>> 2908010 0.00 0.037 ms kworker/9:3
>>>> 2912951 0.00 0.036 ms kworker/4:3
>>>> 793 0.00 0.027 ms multipathd
>>>> 42 0.00 0.023 ms ksoftirqd/5
>>>> 9 0.00 0.022 ms ksoftirqd/0
>>>> 24 0.00 0.019 ms ksoftirqd/2
>>>> 59 0.00 0.019 ms migration/8
>>>> 2929607 0.00 0.018 ms wecode-db
>>>> 29 0.00 0.012 ms migration/3
>>>> 11 0.00 0.012 ms migration/0
>>>> 65 0.00 0.012 ms migration/9
>>>> 17 0.00 0.011 ms migration/1
>>>> 71 0.00 0.011 ms migration/10
>>>> 53 0.00 0.011 ms migration/7
>>>> 23 0.00 0.011 ms migration/2
>>>> 47 0.00 0.011 ms migration/6
>>>> 789 0.00 0.010 ms multipathd
>>>> 35 0.00 0.010 ms migration/4
>>>> 480 0.00 0.009 ms kworker/4:1H
>>>> 41 0.00 0.008 ms migration/5
>>>> 54 0.00 0.006 ms ksoftirqd/7
>>>> 36 0.00 0.005 ms ksoftirqd/4
>>>> 72 0.00 0.005 ms ksoftirqd/10
>>>> 66 0.00 0.005 ms ksoftirqd/9
>>>> 30 0.00 0.004 ms ksoftirqd/3
>>>> 2898362 0.00 0.003 ms kworker/u24:0
>>>>
>>>> # perf kwork top -C 2,4,5
>>>>
>>>> Total : 5604.885 ms, 3 cpus
>>>> %Cpu(s): 17.65% id, 0.00% hi, 0.09% si
>>>> %Cpu2 [|||||||||||||||||||||||| 83.00%]
>>>> %Cpu4 [|||||||||||||||||||||||| 81.66%]
>>>> %Cpu5 [|||||||||||||||||||||||| 82.10%]
>>>>
>>>> PID %CPU RUNTIME COMMMAND
>>>> ----------------------------------------------------
>>>> 0 18.25 341.048 ms swapper/4
>>>> 0 17.80 332.691 ms swapper/5
>>>> 0 16.89 315.630 ms swapper/2
>>>> 2913012 8.99 168.201 ms sched-messaging
>>>> 2913021 8.74 163.456 ms sched-messaging
>>>> 2913026 8.34 156.120 ms sched-messaging
>>>> 2913010 8.14 152.372 ms sched-messaging
>>>> 2913007 7.74 144.754 ms sched-messaging
>>>> 2913016 7.42 138.977 ms sched-messaging
>>>> 2913022 7.28 136.279 ms sched-messaging
>>>> 2913013 7.00 130.894 ms sched-messaging
>>>> 2913019 6.96 130.455 ms sched-messaging
>>>> 2913023 6.91 129.364 ms sched-messaging
>>>> 2913008 6.47 121.331 ms sched-messaging
>>>> 2913018 6.47 121.124 ms sched-messaging
>>>> 2912994 6.42 120.213 ms sched-messaging
>>>> 2913025 6.42 120.140 ms sched-messaging
>>>> 2913020 6.37 119.386 ms sched-messaging
>>>> 2913011 6.35 118.921 ms sched-messaging
>>>> 2913014 6.24 116.779 ms sched-messaging
>>>> 2913009 6.01 112.661 ms sched-messaging
>>>> 2913005 5.96 111.587 ms sched-messaging
>>>> 2913003 5.94 111.142 ms sched-messaging
>>>> 2913024 5.87 109.876 ms sched-messaging
>>>> 2912988 5.84 109.396 ms sched-messaging
>>>> 2912987 5.80 108.550 ms sched-messaging
>>>> 2912990 5.51 103.322 ms sched-messaging
>>>> 2912993 5.45 102.045 ms sched-messaging
>>>> 2912996 5.42 101.622 ms sched-messaging
>>>> 2913006 5.42 101.592 ms sched-messaging
>>>> 2913000 5.41 101.511 ms sched-messaging
>>>> 2913002 5.41 101.420 ms sched-messaging
>>>> 2912997 5.40 101.315 ms sched-messaging
>>>> 2913004 5.33 99.872 ms sched-messaging
>>>> 2913015 5.29 99.252 ms sched-messaging
>>>> 2913017 5.22 97.822 ms sched-messaging
>>>> 2912991 5.11 95.773 ms sched-messaging
>>>> 2912992 5.11 95.579 ms sched-messaging
>>>> 2913001 5.07 95.033 ms sched-messaging
>>>> 2912989 4.93 92.425 ms sched-messaging
>>>> 2912995 4.85 90.892 ms sched-messaging
>>>> 2912998 4.78 89.617 ms sched-messaging
>>>> 2912999 4.56 85.576 ms sched-messaging
>>>> 3006112 0.07 1.402 ms redis-server
>>>> 660381 0.02 0.566 ms containerd
>>>> 2912984 0.02 0.452 ms perf
>>>> 659824 0.01 0.369 ms containerd
>>>> 659822 0.00 0.316 ms containerd
>>>> 10 0.00 0.176 ms rcu_sched
>>>> 801 0.00 0.120 ms jbd2/sda4-8
>>>> 2912985 0.00 0.107 ms sched-messaging
>>>> 2912986 0.00 0.075 ms perf
>>>> 2912817 0.00 0.070 ms kworker/2:1
>>>> 2912192 0.00 0.056 ms kworker/u24:2
>>>> 2929605 0.00 0.046 ms grpc_global_tim
>>>> 2902444 0.00 0.046 ms kworker/5:1
>>>> 2912951 0.00 0.036 ms kworker/4:3
>>>> 42 0.00 0.023 ms ksoftirqd/5
>>>> 24 0.00 0.019 ms ksoftirqd/2
>>>> 23 0.00 0.011 ms migration/2
>>>> 35 0.00 0.010 ms migration/4
>>>> 480 0.00 0.009 ms kworker/4:1H
>>>> 41 0.00 0.008 ms migration/5
>>>> 36 0.00 0.005 ms ksoftirqd/4
>>>>
>>>> # perf kwork top -n perf
>>>>
>>>> Total : 22419.068 ms, 12 cpus
>>>> %Cpu(s): 17.99% id, 0.00% hi, 0.09% si
>>>> %Cpu0 [ 0.00%]
>>>> %Cpu1 [ 0.00%]
>>>> %Cpu2 [ 0.02%]
>>>> %Cpu3 [ 0.00%]
>>>> %Cpu4 [ 0.00%]
>>>> %Cpu5 [ 0.00%]
>>>> %Cpu6 [ 0.00%]
>>>> %Cpu7 [ 0.00%]
>>>> %Cpu8 [ 0.03%]
>>>> %Cpu9 [ 0.09%]
>>>> %Cpu10 [ 0.00%]
>>>> %Cpu11 [ 1.96%]
>>>>
>>>> PID %CPU RUNTIME COMMMAND
>>>> ----------------------------------------------------
>>>> 2912984 2.10 39.452 ms perf
>>>> 2912986 0.00 0.075 ms perf
>>>>
>>>> # perf kwork top -s tid -n sched-messaging
>>>>
>>>> Total : 22419.068 ms, 12 cpus
>>>> %Cpu(s): 17.99% id, 0.00% hi, 0.09% si
>>>> %Cpu0 [|||||||||||||||||||||||| 81.80%]
>>>> %Cpu1 [|||||||||||||||||||||||| 81.65%]
>>>> %Cpu2 [|||||||||||||||||||||||| 82.88%]
>>>> %Cpu3 [|||||||||||||||||||||||| 80.96%]
>>>> %Cpu4 [|||||||||||||||||||||||| 81.64%]
>>>> %Cpu5 [|||||||||||||||||||||||| 82.04%]
>>>> %Cpu6 [|||||||||||||||||||||||| 81.63%]
>>>> %Cpu7 [|||||||||||||||||||||||| 81.97%]
>>>> %Cpu8 [|||||||||||||||||||||||| 82.43%]
>>>> %Cpu9 [|||||||||||||||||||||||| 80.86%]
>>>> %Cpu10 [|||||||||||||||||||||||| 81.72%]
>>>> %Cpu11 [||||||||||||||||||||||| 79.89%]
>>>>
>>>> PID %CPU RUNTIME COMMMAND
>>>> ----------------------------------------------------
>>>> 2912985 0.04 1.111 ms sched-messaging
>>>> 2912987 21.28 398.512 ms sched-messaging
>>>> 2912988 21.44 401.820 ms sched-messaging
>>>> 2912989 21.46 402.303 ms sched-messaging
>>>> 2912990 21.54 403.601 ms sched-messaging
>>>> 2912991 21.59 404.378 ms sched-messaging
>>>> 2912992 21.57 403.845 ms sched-messaging
>>>> 2912993 21.69 406.166 ms sched-messaging
>>>> 2912994 21.52 403.087 ms sched-messaging
>>>> 2912995 21.49 402.421 ms sched-messaging
>>>> 2912996 21.48 402.666 ms sched-messaging
>>>> 2912997 21.27 398.518 ms sched-messaging
>>>> 2912998 21.75 407.579 ms sched-messaging
>>>> 2912999 21.79 407.929 ms sched-messaging
>>>> 2913000 21.78 408.045 ms sched-messaging
>>>> 2913001 21.55 403.803 ms sched-messaging
>>>> 2913002 21.27 398.759 ms sched-messaging
>>>> 2913003 21.46 402.034 ms sched-messaging
>>>> 2913004 21.37 400.242 ms sched-messaging
>>>> 2913005 21.56 403.715 ms sched-messaging
>>>> 2913006 21.23 397.888 ms sched-messaging
>>>> 2913007 27.48 514.411 ms sched-messaging
>>>> 2913008 27.54 515.447 ms sched-messaging
>>>> 2913009 27.30 510.997 ms sched-messaging
>>>> 2913010 27.50 514.890 ms sched-messaging
>>>> 2913011 27.32 511.632 ms sched-messaging
>>>> 2913012 27.30 511.138 ms sched-messaging
>>>> 2913013 27.30 511.109 ms sched-messaging
>>>> 2913014 27.32 511.381 ms sched-messaging
>>>> 2913015 27.36 512.563 ms sched-messaging
>>>> 2913016 27.18 509.231 ms sched-messaging
>>>> 2913017 27.56 516.273 ms sched-messaging
>>>> 2913018 27.56 516.152 ms sched-messaging
>>>> 2913019 27.25 510.488 ms sched-messaging
>>>> 2913020 27.20 509.677 ms sched-messaging
>>>> 2913021 27.23 509.661 ms sched-messaging
>>>> 2913022 27.19 509.061 ms sched-messaging
>>>> 2913023 27.21 509.400 ms sched-messaging
>>>> 2913024 27.18 509.108 ms sched-messaging
>>>> 2913025 27.62 516.976 ms sched-messaging
>>>> 2913026 27.35 512.198 ms sched-messaging
>>>>
>>>> # perf kwork top -b
>>>> Starting trace, Hit <Ctrl+C> to stop and report
>>>> ^C
>>>> Total : 89209.004 ms, 4 cpus
>>>> %Cpu(s): 13.47% id, 0.01% hi, 0.24% si
>>>> %Cpu0 [||||||||||||||||||||||||| 86.08%]
>>>> %Cpu1 [|||||||||||||||||||||||||| 87.08%]
>>>> %Cpu2 [||||||||||||||||||||||||| 86.10%]
>>>> %Cpu3 [||||||||||||||||||||||||| 85.86%]
>>>>
>>>> PID SPID %CPU RUNTIME COMMMAND
>>>> -------------------------------------------------------------
>>>> 0 0 13.86 3092.482 ms [swapper/3]
>>>> 0 0 13.71 3057.756 ms [swapper/0]
>>>> 0 0 13.65 3044.987 ms [swapper/2]
>>>> 0 0 12.63 2818.079 ms [swapper/1]
>>>> 320 320 1.32 295.427 ms bash
>>>> 414 320 1.09 247.658 ms sched-messaging
>>>> 678 320 1.09 246.881 ms sched-messaging
>>>> 354 320 1.09 246.683 ms sched-messaging
>>>> 409 320 1.08 246.839 ms sched-messaging
>>>> 554 320 1.07 243.045 ms sched-messaging
>>>> 405 320 1.04 237.340 ms sched-messaging
>>>> 525 320 1.04 235.718 ms sched-messaging
>>>> 486 320 1.03 235.369 ms sched-messaging
>>>> 714 320 1.03 235.142 ms sched-messaging
>>>> 435 320 1.03 233.290 ms sched-messaging
>>>> 408 320 1.03 231.687 ms sched-messaging
>>>> 716 320 1.02 233.513 ms sched-messaging
>>>> 453 320 1.02 233.181 ms sched-messaging
>>>> 522 320 1.02 230.101 ms sched-messaging
>>>> 651 320 1.02 229.554 ms sched-messaging
>>>> 418 320 1.01 231.359 ms sched-messaging
>>>> 644 320 1.01 229.848 ms sched-messaging
>>>> 535 320 1.01 229.655 ms sched-messaging
>>>> 536 320 1.01 229.147 ms sched-messaging
>>>> 410 320 1.01 227.700 ms sched-messaging
>>>> 689 320 1.00 227.988 ms sched-messaging
>>>> 412 320 1.00 227.052 ms sched-messaging
>>>> 489 320 1.00 226.374 ms sched-messaging
>>>> 521 320 1.00 225.499 ms sched-messaging
>>>> 530 320 1.00 225.262 ms sched-messaging
>>>> 681 320 1.00 225.187 ms sched-messaging
>>>> 415 320 0.99 225.714 ms sched-messaging
>>>> 643 320 0.99 225.090 ms sched-messaging
>>>> 325 320 0.99 223.385 ms sched-messaging
>>>> 498 320 0.99 222.936 ms sched-messaging
>>>> 413 320 0.98 225.213 ms sched-messaging
>>>> 645 320 0.98 223.211 ms sched-messaging
>>>> 544 320 0.98 222.714 ms sched-messaging
>>>> 441 320 0.98 222.590 ms sched-messaging
>>>> 697 320 0.98 222.426 ms sched-messaging
>>>> 523 320 0.98 221.841 ms sched-messaging
>>>> 402 320 0.98 221.776 ms sched-messaging
>>>> <SNIP>
>>>>
>>>> Yang Jihong (16):
>>>> perf kwork: Fix incorrect and missing free atom in work_push_atom()
>>>> perf kwork: Add the supported subcommands to the document
>>>> perf kwork: Set ordered_events for perf_tool
>>>> perf kwork: Add `kwork` and `src_type` to work_init() for struct
>>>> kwork_class
>>>> perf kwork: Overwrite original atom in the list when a new atom is
>>>> pushed.
>>>> perf kwork: Set default events list if not specified in
>>>> setup_event_list()
>>>> perf kwork: Add sched record support
>>>> perf kwork: Add `root` parameter to work_sort()
>>>> perf kwork: Implement perf kwork top
>>>> perf evsel: Add evsel__intval_common() helper
>>>> perf kwork top: Add statistics on hardirq event support
>>>> perf kwork top: Add statistics on softirq event support
>>>> perf kwork top: Add -C/--cpu -i/--input -n/--name -s/--sort --time
>>>> options
>>>> perf kwork top: Implements BPF-based cpu usage statistics
>>>> perf kwork top: Add BPF-based statistics on hardirq event support
>>>> perf kwork top: Add BPF-based statistics on softirq event support
>>>
>>> Besides documentation nits, series:
>>> Reviewed-by: Ian Rogers <[email protected]>
>>
>> Thanks for reivew.
>>
>>>
>>> Whilst looking at the series, could we clean up
>>> tools/perf/util/kwork.h ? Generally none of the structs are commented.
>>
>> Okay, I'll put up a separate patch and add comments about it.
>>> Some like:
>>> > struct kwork_atom {
>>> struct list_head list;
>>> u64 time;
>>> struct kwork_atom *prev;
>>>
>>> void *page_addr;
>>> unsigned long bit_inpage;
>>> };
>>>
>>> Why is it an atom? Why is there a prev when the kwork_atom is also on
>>> a list (which has a prev) ?
>>>
>> An atom indicates a minimum granularity event.
>> For example, an "irq_hander_entry" event of an IRQ whose irqnum==10 is
>> an atom.
>>
>> The prev member is used to store the sequence of events.
>> For example, the sequence of events is as follows:
>> raise -> entry -> exit
>>
>> Then:
>> entry_atom->prev = raise_atom
>>
>> This relationship needs to be saved because need to calculate latency
>> time and running time at the same time in the "perf kwork timehist"
>
> Thanks Yang, this is good context. Could it be added to the header

Okay, I can submit a separate patch with comments.

> file? I'm also wondering at some point we should start generating
> kerneldoc from comments in the code. I don't know if you want to look
> into kerneldoc style comments.

Of course, would you like to tell me how to do it?
Not just perf kwork, but the whole perf tool code, I can do some work on
this.

>
> Thanks,
> Ian
>
>> Thanks,
>> Yang
>
> .
>

2023-09-05 19:02:16

by Ian Rogers

[permalink] [raw]
Subject: Re: [RFC v1 00/16] perf kwork: Implement perf kwork top

On Sat, Aug 12, 2023 at 1:52 AM Yang Jihong <[email protected]> wrote:
>
> Some common tools for collecting statistics on CPU usage, such as top,
> obtain statistics from timer interrupt sampling, and then periodically
> read statistics from /proc/stat.
>
> This method has some deviations:
> 1. In the tick interrupt, the time between the last tick and the current
> tick is counted in the current task. However, the task may be running
> only part of the time.
> 2. For each task, the top tool periodically reads the /proc/{PID}/status
> information. For tasks with a short life cycle, it may be missed.
>
> In conclusion, the top tool cannot accurately collect statistics on the
> CPU usage and running time of tasks.
>
> The statistical method based on sched_switch tracepoint can accurately
> calculate the CPU usage of all tasks. This method is applicable to
> scenarios where performance comparison data is of high precision.
>
> In addition to parsing the perf.data file, the provides BPF-based CPU usage
> statistics to reduce the load of the perf process.
>
> Example usage:
>
> # perf kwork top -h
>
> Usage: perf kwork top [<options>]
>
> -C, --cpu <cpu> list of cpus to profile
> -i, --input <file> input file name
> -n, --name <name> event name to profile
> -s, --sort <key[,key2...]>
> sort by key(s): rate, runtime, tid
> --time <str> Time span for analysis (start,stop)
>
> # ./perf kwork -k sched,irq,softirq record -- ./perf bench sched messaging -g 1 -l 10000
> # Running 'sched/messaging' benchmark:
> # 20 sender and receiver processes per group
> # 1 groups == 40 processes run
>
> Total time: 1.854 [sec]
> [ perf record: Woken up 13 times to write data ]
> [ perf record: Captured and wrote 27.436 MB perf.data (235986 samples) ]
> #
> # perf kwork top
>
> Total : 22419.068 ms, 12 cpus
> %Cpu(s): 17.99% id, 0.00% hi, 0.09% si
> %Cpu0 [|||||||||||||||||||||||| 82.56%]
> %Cpu1 [|||||||||||||||||||||||| 81.73%]
> %Cpu2 [|||||||||||||||||||||||| 83.00%]
> %Cpu3 [|||||||||||||||||||||||| 81.01%]
> %Cpu4 [|||||||||||||||||||||||| 81.66%]
> %Cpu5 [|||||||||||||||||||||||| 82.10%]
> %Cpu6 [|||||||||||||||||||||||| 81.65%]
> %Cpu7 [|||||||||||||||||||||||| 82.00%]
> %Cpu8 [|||||||||||||||||||||||| 82.54%]
> %Cpu9 [|||||||||||||||||||||||| 81.02%]
> %Cpu10 [|||||||||||||||||||||||| 81.78%]
> %Cpu11 [|||||||||||||||||||||||| 81.87%]
>
> PID %CPU RUNTIME COMMMAND
> ----------------------------------------------------
> 2913025 27.62 516.976 ms sched-messaging
> 2913017 27.56 516.273 ms sched-messaging
> 2913018 27.56 516.152 ms sched-messaging
> 2913008 27.54 515.447 ms sched-messaging
> 2913010 27.50 514.890 ms sched-messaging
> 2913007 27.48 514.411 ms sched-messaging
> 2913015 27.36 512.563 ms sched-messaging
> 2913026 27.35 512.198 ms sched-messaging
> 2913011 27.32 511.632 ms sched-messaging
> 2913014 27.32 511.381 ms sched-messaging
> 2913012 27.30 511.138 ms sched-messaging
> 2913013 27.30 511.109 ms sched-messaging
> 2913009 27.30 510.997 ms sched-messaging
> 2913019 27.25 510.488 ms sched-messaging
> 2913021 27.23 509.661 ms sched-messaging
> 2913023 27.21 509.400 ms sched-messaging
> 2913020 27.20 509.677 ms sched-messaging
> 2913022 27.19 509.061 ms sched-messaging
> 2913016 27.18 509.231 ms sched-messaging
> 2913024 27.18 509.108 ms sched-messaging
> 2912999 21.79 407.929 ms sched-messaging
> 2913000 21.78 408.045 ms sched-messaging
> 2912998 21.75 407.579 ms sched-messaging
> 2912993 21.69 406.166 ms sched-messaging
> 2912991 21.59 404.378 ms sched-messaging
> 2912992 21.57 403.845 ms sched-messaging
> 2913005 21.56 403.715 ms sched-messaging
> 2913001 21.55 403.803 ms sched-messaging
> 2912990 21.54 403.601 ms sched-messaging
> 2912994 21.52 403.087 ms sched-messaging
> 2912995 21.49 402.421 ms sched-messaging
> 2912996 21.48 402.666 ms sched-messaging
> 2912989 21.46 402.303 ms sched-messaging
> 2913003 21.46 402.034 ms sched-messaging
> 2912988 21.44 401.820 ms sched-messaging
> 2913004 21.37 400.242 ms sched-messaging
> 2912987 21.28 398.512 ms sched-messaging
> 2913002 21.27 398.759 ms sched-messaging
> 2912997 21.27 398.518 ms sched-messaging
> 2913006 21.23 397.888 ms sched-messaging
> 0 18.89 353.061 ms swapper/3
> 0 18.89 353.026 ms swapper/9
> 0 18.26 341.190 ms swapper/6
> 0 18.25 341.048 ms swapper/4
> 0 18.13 338.844 ms swapper/10
> 0 18.12 338.686 ms swapper/1
> 0 18.05 337.333 ms swapper/11
> 0 17.92 334.903 ms swapper/7
> 0 17.80 332.691 ms swapper/5
> 0 17.38 324.762 ms swapper/8
> 0 17.29 323.102 ms swapper/0
> 0 16.89 315.630 ms swapper/2
> 2912984 2.10 39.452 ms perf
> 2912985 0.73 14.004 ms sched-messaging
> 660381 0.14 3.527 ms containerd
> 3006112 0.07 1.402 ms redis-server
> 2904655 0.05 1.071 ms kworker/0:0
> 659822 0.03 1.729 ms containerd
> 659824 0.03 1.346 ms containerd
> 1053 0.01 0.353 ms zabbix_agentd
> 2895571 0.01 0.349 ms kworker/8:1
> 10 0.00 0.535 ms rcu_sched
> 2912192 0.00 0.272 ms kworker/u24:2
> 2903540 0.00 0.182 ms sshd
> 801 0.00 0.120 ms jbd2/sda4-8
> 2929605 0.00 0.108 ms grpc_global_tim
> 2912986 0.00 0.075 ms perf
> 2897765 0.00 0.073 ms kworker/7:1
> 2912817 0.00 0.070 ms kworker/2:1
> 391756 0.00 0.067 ms grpc_global_tim
> 2901459 0.00 0.056 ms kworker/3:0
> 2908185 0.00 0.052 ms kworker/10:1
> 2901521 0.00 0.050 ms kworker/6:1
> 2902444 0.00 0.046 ms kworker/5:1
> 2898513 0.00 0.041 ms kworker/1:1
> 2912280 0.00 0.039 ms kworker/11:3
> 1057 0.00 0.037 ms zabbix_agentd
> 2908010 0.00 0.037 ms kworker/9:3
> 2912951 0.00 0.036 ms kworker/4:3
> 793 0.00 0.027 ms multipathd
> 42 0.00 0.023 ms ksoftirqd/5
> 9 0.00 0.022 ms ksoftirqd/0
> 24 0.00 0.019 ms ksoftirqd/2
> 59 0.00 0.019 ms migration/8
> 2929607 0.00 0.018 ms wecode-db
> 29 0.00 0.012 ms migration/3
> 11 0.00 0.012 ms migration/0
> 65 0.00 0.012 ms migration/9
> 17 0.00 0.011 ms migration/1
> 71 0.00 0.011 ms migration/10
> 53 0.00 0.011 ms migration/7
> 23 0.00 0.011 ms migration/2
> 47 0.00 0.011 ms migration/6
> 789 0.00 0.010 ms multipathd
> 35 0.00 0.010 ms migration/4
> 480 0.00 0.009 ms kworker/4:1H
> 41 0.00 0.008 ms migration/5
> 54 0.00 0.006 ms ksoftirqd/7
> 36 0.00 0.005 ms ksoftirqd/4
> 72 0.00 0.005 ms ksoftirqd/10
> 66 0.00 0.005 ms ksoftirqd/9
> 30 0.00 0.004 ms ksoftirqd/3
> 2898362 0.00 0.003 ms kworker/u24:0
>
> # perf kwork top -C 2,4,5
>
> Total : 5604.885 ms, 3 cpus
> %Cpu(s): 17.65% id, 0.00% hi, 0.09% si
> %Cpu2 [|||||||||||||||||||||||| 83.00%]
> %Cpu4 [|||||||||||||||||||||||| 81.66%]
> %Cpu5 [|||||||||||||||||||||||| 82.10%]
>
> PID %CPU RUNTIME COMMMAND
> ----------------------------------------------------
> 0 18.25 341.048 ms swapper/4
> 0 17.80 332.691 ms swapper/5
> 0 16.89 315.630 ms swapper/2
> 2913012 8.99 168.201 ms sched-messaging
> 2913021 8.74 163.456 ms sched-messaging
> 2913026 8.34 156.120 ms sched-messaging
> 2913010 8.14 152.372 ms sched-messaging
> 2913007 7.74 144.754 ms sched-messaging
> 2913016 7.42 138.977 ms sched-messaging
> 2913022 7.28 136.279 ms sched-messaging
> 2913013 7.00 130.894 ms sched-messaging
> 2913019 6.96 130.455 ms sched-messaging
> 2913023 6.91 129.364 ms sched-messaging
> 2913008 6.47 121.331 ms sched-messaging
> 2913018 6.47 121.124 ms sched-messaging
> 2912994 6.42 120.213 ms sched-messaging
> 2913025 6.42 120.140 ms sched-messaging
> 2913020 6.37 119.386 ms sched-messaging
> 2913011 6.35 118.921 ms sched-messaging
> 2913014 6.24 116.779 ms sched-messaging
> 2913009 6.01 112.661 ms sched-messaging
> 2913005 5.96 111.587 ms sched-messaging
> 2913003 5.94 111.142 ms sched-messaging
> 2913024 5.87 109.876 ms sched-messaging
> 2912988 5.84 109.396 ms sched-messaging
> 2912987 5.80 108.550 ms sched-messaging
> 2912990 5.51 103.322 ms sched-messaging
> 2912993 5.45 102.045 ms sched-messaging
> 2912996 5.42 101.622 ms sched-messaging
> 2913006 5.42 101.592 ms sched-messaging
> 2913000 5.41 101.511 ms sched-messaging
> 2913002 5.41 101.420 ms sched-messaging
> 2912997 5.40 101.315 ms sched-messaging
> 2913004 5.33 99.872 ms sched-messaging
> 2913015 5.29 99.252 ms sched-messaging
> 2913017 5.22 97.822 ms sched-messaging
> 2912991 5.11 95.773 ms sched-messaging
> 2912992 5.11 95.579 ms sched-messaging
> 2913001 5.07 95.033 ms sched-messaging
> 2912989 4.93 92.425 ms sched-messaging
> 2912995 4.85 90.892 ms sched-messaging
> 2912998 4.78 89.617 ms sched-messaging
> 2912999 4.56 85.576 ms sched-messaging
> 3006112 0.07 1.402 ms redis-server
> 660381 0.02 0.566 ms containerd
> 2912984 0.02 0.452 ms perf
> 659824 0.01 0.369 ms containerd
> 659822 0.00 0.316 ms containerd
> 10 0.00 0.176 ms rcu_sched
> 801 0.00 0.120 ms jbd2/sda4-8
> 2912985 0.00 0.107 ms sched-messaging
> 2912986 0.00 0.075 ms perf
> 2912817 0.00 0.070 ms kworker/2:1
> 2912192 0.00 0.056 ms kworker/u24:2
> 2929605 0.00 0.046 ms grpc_global_tim
> 2902444 0.00 0.046 ms kworker/5:1
> 2912951 0.00 0.036 ms kworker/4:3
> 42 0.00 0.023 ms ksoftirqd/5
> 24 0.00 0.019 ms ksoftirqd/2
> 23 0.00 0.011 ms migration/2
> 35 0.00 0.010 ms migration/4
> 480 0.00 0.009 ms kworker/4:1H
> 41 0.00 0.008 ms migration/5
> 36 0.00 0.005 ms ksoftirqd/4
>
> # perf kwork top -n perf
>
> Total : 22419.068 ms, 12 cpus
> %Cpu(s): 17.99% id, 0.00% hi, 0.09% si
> %Cpu0 [ 0.00%]
> %Cpu1 [ 0.00%]
> %Cpu2 [ 0.02%]
> %Cpu3 [ 0.00%]
> %Cpu4 [ 0.00%]
> %Cpu5 [ 0.00%]
> %Cpu6 [ 0.00%]
> %Cpu7 [ 0.00%]
> %Cpu8 [ 0.03%]
> %Cpu9 [ 0.09%]
> %Cpu10 [ 0.00%]
> %Cpu11 [ 1.96%]
>
> PID %CPU RUNTIME COMMMAND
> ----------------------------------------------------
> 2912984 2.10 39.452 ms perf
> 2912986 0.00 0.075 ms perf
>
> # perf kwork top -s tid -n sched-messaging
>
> Total : 22419.068 ms, 12 cpus
> %Cpu(s): 17.99% id, 0.00% hi, 0.09% si
> %Cpu0 [|||||||||||||||||||||||| 81.80%]
> %Cpu1 [|||||||||||||||||||||||| 81.65%]
> %Cpu2 [|||||||||||||||||||||||| 82.88%]
> %Cpu3 [|||||||||||||||||||||||| 80.96%]
> %Cpu4 [|||||||||||||||||||||||| 81.64%]
> %Cpu5 [|||||||||||||||||||||||| 82.04%]
> %Cpu6 [|||||||||||||||||||||||| 81.63%]
> %Cpu7 [|||||||||||||||||||||||| 81.97%]
> %Cpu8 [|||||||||||||||||||||||| 82.43%]
> %Cpu9 [|||||||||||||||||||||||| 80.86%]
> %Cpu10 [|||||||||||||||||||||||| 81.72%]
> %Cpu11 [||||||||||||||||||||||| 79.89%]
>
> PID %CPU RUNTIME COMMMAND
> ----------------------------------------------------
> 2912985 0.04 1.111 ms sched-messaging
> 2912987 21.28 398.512 ms sched-messaging
> 2912988 21.44 401.820 ms sched-messaging
> 2912989 21.46 402.303 ms sched-messaging
> 2912990 21.54 403.601 ms sched-messaging
> 2912991 21.59 404.378 ms sched-messaging
> 2912992 21.57 403.845 ms sched-messaging
> 2912993 21.69 406.166 ms sched-messaging
> 2912994 21.52 403.087 ms sched-messaging
> 2912995 21.49 402.421 ms sched-messaging
> 2912996 21.48 402.666 ms sched-messaging
> 2912997 21.27 398.518 ms sched-messaging
> 2912998 21.75 407.579 ms sched-messaging
> 2912999 21.79 407.929 ms sched-messaging
> 2913000 21.78 408.045 ms sched-messaging
> 2913001 21.55 403.803 ms sched-messaging
> 2913002 21.27 398.759 ms sched-messaging
> 2913003 21.46 402.034 ms sched-messaging
> 2913004 21.37 400.242 ms sched-messaging
> 2913005 21.56 403.715 ms sched-messaging
> 2913006 21.23 397.888 ms sched-messaging
> 2913007 27.48 514.411 ms sched-messaging
> 2913008 27.54 515.447 ms sched-messaging
> 2913009 27.30 510.997 ms sched-messaging
> 2913010 27.50 514.890 ms sched-messaging
> 2913011 27.32 511.632 ms sched-messaging
> 2913012 27.30 511.138 ms sched-messaging
> 2913013 27.30 511.109 ms sched-messaging
> 2913014 27.32 511.381 ms sched-messaging
> 2913015 27.36 512.563 ms sched-messaging
> 2913016 27.18 509.231 ms sched-messaging
> 2913017 27.56 516.273 ms sched-messaging
> 2913018 27.56 516.152 ms sched-messaging
> 2913019 27.25 510.488 ms sched-messaging
> 2913020 27.20 509.677 ms sched-messaging
> 2913021 27.23 509.661 ms sched-messaging
> 2913022 27.19 509.061 ms sched-messaging
> 2913023 27.21 509.400 ms sched-messaging
> 2913024 27.18 509.108 ms sched-messaging
> 2913025 27.62 516.976 ms sched-messaging
> 2913026 27.35 512.198 ms sched-messaging
>
> # perf kwork top -b
> Starting trace, Hit <Ctrl+C> to stop and report
> ^C
> Total : 89209.004 ms, 4 cpus
> %Cpu(s): 13.47% id, 0.01% hi, 0.24% si
> %Cpu0 [||||||||||||||||||||||||| 86.08%]
> %Cpu1 [|||||||||||||||||||||||||| 87.08%]
> %Cpu2 [||||||||||||||||||||||||| 86.10%]
> %Cpu3 [||||||||||||||||||||||||| 85.86%]
>
> PID SPID %CPU RUNTIME COMMMAND
> -------------------------------------------------------------
> 0 0 13.86 3092.482 ms [swapper/3]
> 0 0 13.71 3057.756 ms [swapper/0]
> 0 0 13.65 3044.987 ms [swapper/2]
> 0 0 12.63 2818.079 ms [swapper/1]
> 320 320 1.32 295.427 ms bash
> 414 320 1.09 247.658 ms sched-messaging
> 678 320 1.09 246.881 ms sched-messaging
> 354 320 1.09 246.683 ms sched-messaging
> 409 320 1.08 246.839 ms sched-messaging
> 554 320 1.07 243.045 ms sched-messaging
> 405 320 1.04 237.340 ms sched-messaging
> 525 320 1.04 235.718 ms sched-messaging
> 486 320 1.03 235.369 ms sched-messaging
> 714 320 1.03 235.142 ms sched-messaging
> 435 320 1.03 233.290 ms sched-messaging
> 408 320 1.03 231.687 ms sched-messaging
> 716 320 1.02 233.513 ms sched-messaging
> 453 320 1.02 233.181 ms sched-messaging
> 522 320 1.02 230.101 ms sched-messaging
> 651 320 1.02 229.554 ms sched-messaging
> 418 320 1.01 231.359 ms sched-messaging
> 644 320 1.01 229.848 ms sched-messaging
> 535 320 1.01 229.655 ms sched-messaging
> 536 320 1.01 229.147 ms sched-messaging
> 410 320 1.01 227.700 ms sched-messaging
> 689 320 1.00 227.988 ms sched-messaging
> 412 320 1.00 227.052 ms sched-messaging
> 489 320 1.00 226.374 ms sched-messaging
> 521 320 1.00 225.499 ms sched-messaging
> 530 320 1.00 225.262 ms sched-messaging
> 681 320 1.00 225.187 ms sched-messaging
> 415 320 0.99 225.714 ms sched-messaging
> 643 320 0.99 225.090 ms sched-messaging
> 325 320 0.99 223.385 ms sched-messaging
> 498 320 0.99 222.936 ms sched-messaging
> 413 320 0.98 225.213 ms sched-messaging
> 645 320 0.98 223.211 ms sched-messaging
> 544 320 0.98 222.714 ms sched-messaging
> 441 320 0.98 222.590 ms sched-messaging
> 697 320 0.98 222.426 ms sched-messaging
> 523 320 0.98 221.841 ms sched-messaging
> 402 320 0.98 221.776 ms sched-messaging
> <SNIP>
>
> Yang Jihong (16):
> perf kwork: Fix incorrect and missing free atom in work_push_atom()
> perf kwork: Add the supported subcommands to the document
> perf kwork: Set ordered_events for perf_tool
> perf kwork: Add `kwork` and `src_type` to work_init() for struct
> kwork_class
> perf kwork: Overwrite original atom in the list when a new atom is
> pushed.
> perf kwork: Set default events list if not specified in
> setup_event_list()
> perf kwork: Add sched record support
> perf kwork: Add `root` parameter to work_sort()
> perf kwork: Implement perf kwork top
> perf evsel: Add evsel__intval_common() helper
> perf kwork top: Add statistics on hardirq event support
> perf kwork top: Add statistics on softirq event support
> perf kwork top: Add -C/--cpu -i/--input -n/--name -s/--sort --time
> options
> perf kwork top: Implements BPF-based cpu usage statistics
> perf kwork top: Add BPF-based statistics on hardirq event support
> perf kwork top: Add BPF-based statistics on softirq event support

Besides documentation nits, series:
Reviewed-by: Ian Rogers <[email protected]>

Whilst looking at the series, could we clean up
tools/perf/util/kwork.h ? Generally none of the structs are commented.
Some like:

struct kwork_atom {
struct list_head list;
u64 time;
struct kwork_atom *prev;

void *page_addr;
unsigned long bit_inpage;
};

Why is it an atom? Why is there a prev when the kwork_atom is also on
a list (which has a prev) ?

structs like trace_kwork_handler could be a forward reference in
kwork.h with the declaration in builtin-kwork.c.

Thanks,
Ian

> tools/perf/Documentation/perf-kwork.txt | 38 +-
> tools/perf/Makefile.perf | 2 +-
> tools/perf/builtin-kwork.c | 758 +++++++++++++++++++++--
> tools/perf/util/Build | 1 +
> tools/perf/util/bpf_kwork_top.c | 308 +++++++++
> tools/perf/util/bpf_skel/kwork_top.bpf.c | 338 ++++++++++
> tools/perf/util/evsel.c | 13 +
> tools/perf/util/evsel.h | 2 +
> tools/perf/util/kwork.h | 61 +-
> 9 files changed, 1472 insertions(+), 49 deletions(-)
> create mode 100644 tools/perf/util/bpf_kwork_top.c
> create mode 100644 tools/perf/util/bpf_skel/kwork_top.bpf.c
>
> --
> 2.30.GIT
>