块设备上的未对齐写入
Unaligned writes on block devices
我读到 未对齐 大小的块的写入会在 Linux 中的块设备上引发额外的 reads.I 平均写入。为什么?怎么才能看到?
块设备只能以其本机块对齐方式写入或读取,对于我遇到的所有内容,它都是 512 字节或 4096 字节。您可以在 sysfs 中查看您设备的块大小:
# cat /sys/block/sdb/queue/logical_block_size
512
为什么? NVMe、SCSI 和 ATA 命令集根本不支持访问小于该区域的区域。 WRITE
命令的参数在整数块中。
如果应用程序需要写入较小的区域或非对齐区域,则内核会发出读取以填补空白,然后写出较大的块。例如,假设您需要在 512 字节块的中间写入 256 字节。内核将从磁盘读取整个 512 字节,合并您的数据以写入正确的位置,然后写入 512 字节块。
监控系统读写的一种简单方法是使用 iostat
实用程序,该实用程序至少在 Centos/RHEL.[=15= 上与 sysstat
软件包打包在一起]
[root@bb-cluster-4 md]# iostat -xyz 1
...
avg-cpu: %user %nice %system %iowait %steal %idle
32.29 0.00 7.61 0.00 0.00 60.10
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sdd 0.00 0.00 1.00 0.00 4.00 0.00 8.00 0.00 1.00 1.00 0.00 1.00 0.10
我读到 未对齐 大小的块的写入会在 Linux 中的块设备上引发额外的 reads.I 平均写入。为什么?怎么才能看到?
块设备只能以其本机块对齐方式写入或读取,对于我遇到的所有内容,它都是 512 字节或 4096 字节。您可以在 sysfs 中查看您设备的块大小:
# cat /sys/block/sdb/queue/logical_block_size
512
为什么? NVMe、SCSI 和 ATA 命令集根本不支持访问小于该区域的区域。 WRITE
命令的参数在整数块中。
如果应用程序需要写入较小的区域或非对齐区域,则内核会发出读取以填补空白,然后写出较大的块。例如,假设您需要在 512 字节块的中间写入 256 字节。内核将从磁盘读取整个 512 字节,合并您的数据以写入正确的位置,然后写入 512 字节块。
监控系统读写的一种简单方法是使用 iostat
实用程序,该实用程序至少在 Centos/RHEL.[=15= 上与 sysstat
软件包打包在一起]
[root@bb-cluster-4 md]# iostat -xyz 1
...
avg-cpu: %user %nice %system %iowait %steal %idle
32.29 0.00 7.61 0.00 0.00 60.10
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sdd 0.00 0.00 1.00 0.00 4.00 0.00 8.00 0.00 1.00 1.00 0.00 1.00 0.10