我想了解数据是如何写入磁盘的。我正在dd
使用不同的块大小写入数据,但根据 iostat 的说法,磁盘似乎总是受到相同大小的块的影响。例如,此命令应写入 128K 块。
dd if=/dev/zero of=/dev/sdb bs=128K count=300000
修剪后的输出iostat -dxm 1
:
Device: rrqm/s wrqm/s r/s w/s rMB/s wMB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sdb 0.00 129897.00 0.00 1024.00 0.00 512.00 1024.00 142.09 138.81 0.00 138.81 0.98 100.00
我对此的解读是,它在 1024 次操作中写入了 512MBps。这意味着每次写入 = 512/1024 = 512K。
计算相同内容的另一种方法:avgrq-sz 列显示 1024 个扇区。根据gdisk
这款三星850 Pro SSD的扇区大小为512B,因此每次写入为1024个扇区* 512B = 512K。
所以我的问题是,为什么它写入 512K 块而不是 指定的 128K 块dd
?如果我改为dd
写入4M块,iostat结果是完全一样的。合并数字对我来说也没有意义。
那是直接写入块设备;但如果我将其格式化为 XFS 并写入文件系统,则除了零合并之外,数字是相同的:
dd if=/dev/zero of=/mnt/ddtest bs=4M count=3000
现在 iostat 显示
Device: rrqm/s wrqm/s r/s w/s rMB/s wMB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sdb 0.00 0.00 0.00 1024.00 0.00 512.00 1024.00 142.31 138.92 0.00 138.92 0.98 100.00
顺便说一句,我正在使用 RHEL 7.7。
答案1
如果不指定O_DIRECT
,则 I/O 请求将转到页面缓存。当此写入缓存写回设备时,内核会尽可能使用大量写入。
(我不确定这些是否会被算作合并写入。)
内核内存管理生成的写入大小可能受到许多不同变量的限制。
上面的链接有很长的分析。但结果是,当你的物理 RAM 变得碎片化时,内核只能找到单独的页面来使用,而不能找到物理上连续的多个页面。然后,单个 IO 的大小受到“分散/聚集列表”的最大大小的限制。