系统相关
首页 > 系统相关> > linux – 为什么blktrace只写8块?

linux – 为什么blktrace只写8块?

作者:互联网

我想了解数据库写入磁盘的I / O模式,以决定使用多少磁盘以获得最佳性能.要分析我想要使用blktrace的I / O模式,我必须首先解决它.这是我在这里尝试的.

我有一个USB棒,我连接到我的电脑,它变成/ dev / sdd.现在我开始吧

dd if=/dev/sdd of=/dev/null

在一个单独的窗口我开始

blktrace -d /dev/sdd -o - | blkparse -i -

并期望看到已合并(M)并放入队列(Q)的读(R)操作.这是有效的,但根据我的理解,块大小始终为8:

8,48   6    15257     2.157995037  2470  M   R 816696 + 8 [dd]
8,48   6    15258     2.157996273  2470  Q   R 816704 + 8 [dd]
8,48   6    15259     2.157996520  2470  M   R 816704 + 8 [dd]
8,48   6    15260     2.157997794  2470  Q   R 816712 + 8 [dd]

现在我停止一切并告诉系统只读一个字节:

dd if=/dev/sdd of=/dev/null count=1 bs=1
1+0 records in
1+0 records out
1 byte (1 B) copied, 0.00325544 s, 0.3 kB/s

这显示在blkparse控制台上,如下所示:

8,48   6        1    17.220316681  2543  G   N [dd]
8,48   6        2    17.220317209  2543  I   N 0 (00 ..) [dd]
8,48   6        3    17.220317707  2543  D   N 0 (00 ..) [dd]
8,48   6        4    17.220787473  2543  Q   R 0 + 8 [dd]
8,48   6        5    17.220790545  2543  G   R 0 + 8 [dd]
8,48   6        6    17.220791330  2543  P   N [dd]
8,48   6        7    17.220793515  2543  Q   R 8 + 8 [dd]
8,48   6        8    17.220794597  2543  M   R 8 + 8 [dd]
8,48   6        9    17.220796134  2543  Q   R 16 + 8 [dd]
8,48   6       10    17.220796419  2543  M   R 16 + 8 [dd]
8,48   6       11    17.220797695  2543  Q   R 24 + 8 [dd]
8,48   6       12    17.220797943  2543  M   R 24 + 8 [dd]
8,48   6       13    17.220798862  2543  I   R 0 + 32 [dd]

这里发生了什么?为什么读取一个字节显示为3个“R”请求,每个请求都有Q和M动作?为什么它“似乎”读取32或24字节?在哪里教育我进一步教育我?

解决方法:

因为您正在执行缓冲IO并且页面缓存在整个页面中工作,这些页面在PC上为4k,或者在512个512字节扇区中.内核预读机制也会在dd将继续读取的假设下读取更多内容.如果你想避免这种情况,那么你需要通过传递dd iflag = direct选项来使用直接IO,但你不能让它读取单个字节这样做 – 直接IO必须对齐,并且甚至是扇区大小的多个.

标签:linux,io,block-device
来源: https://codeday.me/bug/20190813/1648989.html