我需要将大量数据移动到没有任何文件系统的逻辑卷。在执行此操作时,我注意到每次写入都会有一次读取。这是我在写入常规文件时看不到的。我缩小到以下步骤:
### Creat logical volume
lvremove -f /dev/VolGroup1/data_test
lvcreate -L 100G -n data_test VolGroup1
### Start dumping data
nohup dd if=/dev/zero of=/dev/VolGroup1/data_test bs=1k count=100M &
### Check IO
iostat -h -d -k -N -y -j PATH -p /dev/VolGroup1/data_test 10 1
注意到 dd 的新书有很多阅读量
Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
dm-9
56900.60 110719.28 116882.72 1108300 1169996
有人知道为什么会发生这种情况吗?底层系统是 SSD 的 raid10。
答案1
看来 LVM 公开了最小 I/O 大小。如果您尝试写入小于(倍数)此 I/O 大小的内容,则系统将首先读取增量以填充最后一个块,然后更新其内容并最终重写它。
虽然我无法找到关于此内容的确切文档,但我可以找到参考资料红帽:
LVM 还将检测设备的“I/O 提示”。设备数据区域的起始位置将是 sysfs 中公开的“minimum_io_size”或“optimal_io_size”的倍数。如果“optimal_io_size”未定义(0),则使用“minimum_io_size”。默认情况下,LVM 将自动确定这些“I/O 提示”,但可以通过 lvm.conf 的“data_alignment_detection”禁用此功能。不建议禁用此功能。
一些搜索结果(这里使用 dm-1):
$ grep ^ /sys/class/block/dm-1/queue/*_io_size
/sys/class/block/dm-1/queue/minimum_io_size:4096
/sys/class/block/dm-1/queue/optimal_io_size:0
因此,如果您替换为,dm-9
例如,结果为 4096 和 0,则使用 4k 的大小。否则,如果有 4096 和更大的值,请使用这个更大的值以获得最佳性能。
因此,如果按照这些值增加bs=
参数,则读取速度应该为零,并且写入速度将会提高。