有关性能块事件的信息

1 linux-kernel perf

我需要有关 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)

请在这件事上给予我帮助。

Arn*_*ita 5

正如 @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 的摘要。