我正在寻找一种方法来确定应用程序是执行顺序 I/O 还是随机 I/O。是否可以查看 blktrace 捕获并判断 I/O 是顺序的还是随机的?如果是,我应该寻找什么模式的任何例子?
答案1
似乎可以使用blktrace
+blkparse
来获取此信息。看一下我在 U&L 问答中包含的图表:Linux 内核与性能工具图?,特别是本节。
blktrace
似乎它的定位就是向您显示此类数据。在查看手册页时,blkparse
它表明您可以sector
在输出中包含该数字。
OUTPUT DESCRIPTION AND FORMATTING
The output from blkparse can be tailored for specific use -- in
particular, to ease parsing of output, and/or limit output fields
to those the user wants to see. The data for fields which can be
output include:
a Action, a (small) string (1 or 2 characters) -- see table below
for more details
c CPU id
C Command
...
s Sequence numbers
S Sector number
例子
$ sudo blktrace /dev/sda
Ctrl + C
然后用以下方法进行分析blkparse
:
$ blkparse sda -f "%-10S %D %2c %8s %5T.%9t %5p %2a %3d\n" | head -10
4064336 8,0 3 1 0.000000000 2779 A R
5090384 8,0 3 2 0.000000404 2779 A R
5090384 8,0 3 3 0.000001656 2779 Q R
5090384 8,0 3 4 0.000010042 2779 G R
5090384 8,0 3 5 0.000013714 2779 I R
8,0 3 0 0.000019067 0 m N cfq2779SN / insert_request
8,0 3 0 0.000021085 0 m N cfq2779SN / add_to_rr
8,0 3 0 0.000026848 0 m N cfq2779SN / set_active wl_class:2 wl_type:1
8,0 3 0 0.000029175 0 m N cfq2779SN / fifo= (null)
8,0 3 0 0.000030077 0 m N cfq2779SN / dispatch_insert
当有扇区需要报告时,它们会显示为不带逗号的数字,即4064336。因此理论上您可以确认扇区号是连续的还是随机的。
困难的部分是确定哪个应用程序在较低级别引起了哪个 I/O 事件。为了解决这个问题,您可以使用fatrace
我在 U&L 问答中详细介绍的工具,标题为:确定负责高 I/O 的特定文件。