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