我需要有关 perf 中可用的以下块(磁盘 I/O)事件的信息。您能告诉我在哪里可以获得有关每个活动的详细信息吗?
block:block_bio_backmerge
block:block_bio_bounce
block:block_bio_complete
block:block_bio_frontmerge
block:block_bio_queue
block:block_bio_remap
block:block_dirty_buffer
block:block_getrq
block:block_plug
block:block_rq_complete
block:block_rq_insert
block:block_rq_issue
block:block_rq_remap
block:block_rq_requeue
block:block_sleeprq
block:block_split
block:block_touch_buffer
block:block_unplug
Run Code Online (Sandbox Code Playgroud)
请在这件事上给予我帮助。
正如 @osgx 已经提到的,这些是软件跟踪点事件,是内核源代码中许多预定义的跟踪点事件集之一,当您运行时可以看到 -
sudo perf list | grep Tracepoint
当您运行某些命令时,基于块的跟踪点事件可以提供存储设备正在执行的操作的详细信息。
sudo perf record -e block:block_rq_complete -a sleep 10
[ perf record: Woken up 1 times to write data ]
[ perf record: Captured and wrote 1.412 MB perf.data (340 samples) ]
Run Code Online (Sandbox Code Playgroud)
跟踪点block_rq_complete跟踪已完全或部分完成的 I/O 请求。
sudo perf script
swapper 0 [006] 205791.409875: block:block_rq_complete: 8,16 RM () 390439208 + 8 [0]
swapper 0 [006] 205791.410439: block:block_rq_complete: 8,16 RM () 390439256 + 8 [0]
chrome 9526 [006] 205793.149462: block:block_rq_complete: 8,16 W () 424979920 + 8 [0]
chrome 9526 [006] 205793.149781: block:block_rq_complete: 8,16 W () 490387000 + 352 [0]
swapper 0 [006] 205794.547686: block:block_rq_complete: 8,16 WS () 432636024 + 1344 [0]
swapper 0 [006] 205794.558292: block:block_rq_complete: 8,16 WS () 432637368 + 1344 [0]
swapper 0 [006] 205794.566718: block:block_rq_complete: 8,16 WS () 432638712 + 544 [0]
swapper 0 [006] 205794.599791: block:block_rq_complete: 8,16 FF () 18446744073709551615 + 0 [0]
swapper 0 [006] 205794.599868: block:block_rq_complete: 8,16 WS () 432639256 + 8 [0]
swapper 0 [006] 205794.600792: block:block_rq_complete: 8,16 FF () 18446744073709551615 + 0 [0]
swapper 0 [006] 205794.600798: block:block_rq_complete: 8,16 WS () 432639256 + 0 [0]
swapper 0 [006] 205798.268989: block:block_rq_complete: 8,16 W () 462924840 + 8 [0]
swapper 0 [006] 205798.269079: block:block_rq_complete: 8,16 W () 462934720 + 8 [0]
swapper 0 [006] 205798.269118: block:block_rq_complete: 8,16 W () 462934752 + 8 [0]
swapper 0 [006] 205798.269158: block:block_rq_complete: 8,16 W () 462935416 + 8 [0]
swapper 0 [006] 205798.269195: block:block_rq_complete: 8,16 W () 462935592 + 8 [0]
swapper 0 [006] 205798.269241: block:block_rq_complete: 8,16 W () 476143872 + 8 [0]
swapper 0 [006] 205798.269265: block:block_rq_complete: 8,16 W () 476144624 + 8 [0]
swapper 0 [006] 205798.269283: block:block_rq_complete: 8,16 W () 476145360 + 8 [0]
Run Code Online (Sandbox Code Playgroud)
输出的前 5 列很好理解 - (进程名称/命令、pid、CPU、时间戳、完成采样的事件名称),因此我们将从第 6 列开始 -
8,16 指设备的主设备号和次设备号。
ls -l /dev/sdb
brw-rw---- 1 root disk 8, 16 Apr 8 07:52 /dev/sdb
Run Code Online (Sandbox Code Playgroud)
字符 R、W、B、S、F 描述正在执行的 I/O 操作,其中“R”指读取,“W”指写入,“D”指丢弃块,“M”指元数据,“ S' 指同步,'F' 指刷新。
空括号后面的数字()指的是距完成 I/O 操作的设备起始位置的偏移量以及已完成的 I/O 扇区数。
[0]表示错误数。
有关大多数其他事件的某种程度的信息可以在此处获取 - 块事件摘要
请注意,这些事件的 API 不断变化,并且对于您使用的 Linux 内核可能会有所不同。我附上了内核版本 5.6 的摘要。