/
usr
/
share
/
doc
/
bpftrace
/
examples
/
/usr/share/doc/bpftrace/examples
mkdir
upload
Name
Size
Mode
Actions
bashreadline_example.txt
722
0644
edit
dl
rm
biolatency_example.txt
1790
0644
edit
dl
rm
biosnoop_example.txt
2056
0644
edit
dl
rm
biostacks_example.txt
1914
0644
edit
dl
rm
bitesize_example.txt
3003
0644
edit
dl
rm
capable_example.txt
2659
0644
edit
dl
rm
cpuwalk_example.txt
4919
0644
edit
dl
rm
dcsnoop_example.txt
4612
0644
edit
dl
rm
execsnoop_example.txt
1535
0644
edit
dl
rm
gethostlatency_example.txt
923
0644
edit
dl
rm
killsnoop_example.txt
846
0644
edit
dl
rm
loads_example.txt
864
0644
edit
dl
rm
mdflush_example.txt
1866
0644
edit
dl
rm
naptime_example.txt
844
0644
edit
dl
rm
oomkill_example.txt
1668
0644
edit
dl
rm
opensnoop_example.txt
2528
0644
edit
dl
rm
pidpersec_example.txt
1504
0644
edit
dl
rm
runqlat_example.txt
8632
0644
edit
dl
rm
runqlen_example.txt
980
0644
edit
dl
rm
setuids_example.txt
2441
0644
edit
dl
rm
ssllatency_example.txt
4510
0644
edit
dl
rm
sslsnoop_example.txt
1916
0644
edit
dl
rm
statsnoop_example.txt
2738
0644
edit
dl
rm
swapin_example.txt
549
0644
edit
dl
rm
syncsnoop_example.txt
541
0644
edit
dl
rm
syscount_example.txt
1144
0644
edit
dl
rm
tcpaccept_example.txt
1350
0644
edit
dl
rm
tcpconnect_example.txt
1085
0644
edit
dl
rm
tcpdrop_example.txt
1256
0644
edit
dl
rm
tcplife_example.txt
1597
0644
edit
dl
rm
tcpretrans_example.txt
1153
0644
edit
dl
rm
tcpsynbl_example.txt
940
0644
edit
dl
rm
threadsnoop_example.txt
1182
0644
edit
dl
rm
undump_example.txt
680
0644
edit
dl
rm
vfscount_example.txt
1199
0644
edit
dl
rm
vfsstat_example.txt
929
0644
edit
dl
rm
writeback_example.txt
1962
0644
edit
dl
rm
xfsdist_example.txt
3419
0644
edit
dl
rm
Edit:
/usr/share/doc/bpftrace/examples/runqlat_example.txt
(8632B)
Demonstrations of runqlat, the Linux BPF/bpftrace version. This traces time spent waiting in the CPU scheduler for a turn on-CPU. This metric is often called run queue latency, or scheduler latency. This tool shows this latency as a power-of-2 histogram in nanoseconds. For example: # ./runqlat.bt Attaching 5 probes... Tracing CPU scheduler... Hit Ctrl-C to end. ^C @usecs: [0] 1 | | [1] 11 |@@ | [2, 4) 16 |@@@ | [4, 8) 43 |@@@@@@@@@@ | [8, 16) 134 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ | [16, 32) 220 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@| [32, 64) 117 |@@@@@@@@@@@@@@@@@@@@@@@@@@@ | [64, 128) 84 |@@@@@@@@@@@@@@@@@@@ | [128, 256) 10 |@@ | [256, 512) 2 | | [512, 1K) 5 |@ | [1K, 2K) 5 |@ | [2K, 4K) 5 |@ | [4K, 8K) 4 | | [8K, 16K) 1 | | [16K, 32K) 2 | | [32K, 64K) 0 | | [64K, 128K) 1 | | [128K, 256K) 0 | | [256K, 512K) 0 | | [512K, 1M) 1 | | This is an idle system where most of the time we are waiting for less than 128 microseconds, shown by the mode above. As an example of reading the output, the above histogram shows 220 scheduling events with a run queue latency of between 16 and 32 microseconds. The output also shows an outlier taking between 0.5 and 1 seconds: ??? XXX likely work was scheduled behind another higher priority task, and had to wait briefly. The kernel decides whether it is worth migrating such work to an idle CPU, or leaving it wait its turn on its current CPU run queue where the CPU caches should be hotter. I'll now add a single-threaded CPU bound workload to this system, and bind it on one CPU: # ./runqlat.bt Attaching 5 probes... Tracing CPU scheduler... Hit Ctrl-C to end. ^C @usecs: [1] 6 |@@@ | [2, 4) 26 |@@@@@@@@@@@@@ | [4, 8) 97 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@| [8, 16) 72 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ | [16, 32) 17 |@@@@@@@@@ | [32, 64) 19 |@@@@@@@@@@ | [64, 128) 20 |@@@@@@@@@@ | [128, 256) 3 |@ | [256, 512) 0 | | [512, 1K) 0 | | [1K, 2K) 1 | | [2K, 4K) 1 | | [4K, 8K) 4 |@@ | [8K, 16K) 3 |@ | [16K, 32K) 0 | | [32K, 64K) 0 | | [64K, 128K) 0 | | [128K, 256K) 1 | | [256K, 512K) 0 | | [512K, 1M) 0 | | [1M, 2M) 1 | | That didn't make much difference. Now I'll add a second single-threaded CPU workload, and bind it to the same CPU, causing contention: # ./runqlat.bt Attaching 5 probes... Tracing CPU scheduler... Hit Ctrl-C to end. ^C @usecs: [0] 1 | | [1] 8 |@@@ | [2, 4) 28 |@@@@@@@@@@@@ | [4, 8) 95 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ | [8, 16) 120 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@| [16, 32) 22 |@@@@@@@@@ | [32, 64) 10 |@@@@ | [64, 128) 7 |@@@ | [128, 256) 3 |@ | [256, 512) 1 | | [512, 1K) 0 | | [1K, 2K) 0 | | [2K, 4K) 2 | | [4K, 8K) 4 |@ | [8K, 16K) 107 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ | [16K, 32K) 0 | | [32K, 64K) 0 | | [64K, 128K) 0 | | [128K, 256K) 0 | | [256K, 512K) 1 | | There's now a second mode between 8 and 16 milliseconds, as each thread must wait its turn on the one CPU. Now I'll run 10 CPU-bound threads on one CPU: # ./runqlat.bt Attaching 5 probes... Tracing CPU scheduler... Hit Ctrl-C to end. ^C @usecs: [0] 2 | | [1] 10 |@ | [2, 4) 38 |@@@@ | [4, 8) 63 |@@@@@@ | [8, 16) 106 |@@@@@@@@@@@ | [16, 32) 28 |@@@ | [32, 64) 13 |@ | [64, 128) 15 |@ | [128, 256) 2 | | [256, 512) 2 | | [512, 1K) 1 | | [1K, 2K) 1 | | [2K, 4K) 2 | | [4K, 8K) 4 | | [8K, 16K) 3 | | [16K, 32K) 0 | | [32K, 64K) 478 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@| [64K, 128K) 1 | | [128K, 256K) 0 | | [256K, 512K) 0 | | [512K, 1M) 0 | | [1M, 2M) 1 | | This shows that most of the time threads need to wait their turn, with the largest mode between 32 and 64 milliseconds. There is another version of this tool in bcc: https://github.com/iovisor/bcc The bcc version provides options to customize the output.
Save
cmd:
run