了解 iostat 块测量

了解 iostat 块测量

我想了解数据是如何写入磁盘的。我正在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 请求将转到页面缓存。当此写入缓存写回设备时,内核会尽可能使用大量写入。

(我不确定这些是否会被算作合并写入。)

内核内存管理生成的写入大小可能受到许多不同变量的限制。

尤其:为什么我的 IO 请求大小被限制为大约 512K?

上面的链接有很长的分析。但结果是,当你的物理 RAM 变得碎片化时,内核只能找到单独的页面来使用,而不能找到物理上连续的多个页面。然后,单个 IO 的大小受到“分散/聚集列表”的最大大小的限制。

相关内容