23.2. 用户空间访问
始终要小心使用正确校准和大小的 I/O。这对于直接 I/O 访问尤为重要。直接 I/O 应在 logical_block_size 边界上对齐,并在 logical_block_size 的倍数上保持一致。
使用原生 4K 设备(即 logical_block_size 为 4K)现在对于在设备的 logical_block_size 的倍数中执行直接 I/O 至关重要。这意味着,如果带有原生 4k 设备的应用程序执行 512 字节校准的 I/O,而不是 4k 校准的 I/O 时将失败。
为避免这种情况,应用程序应参考设备的 I/O 参数来确保使用了正确的 I/O 校准和大小。如前文所述,I/O 参数通过 sysfs 和块设备 ioctl 接口公开。
如需更多信息,请参阅 man libblkid。此 man page 由
libblkid-devel
软件包提供。
sysfs 接口
- /sys/block/
disk
/alignment_offset或者/sys/block/disk
/partition
/alignment_offset注意文件位置取决于磁盘是物理磁盘(即本地磁盘、本地 RAID 或者多路径 LUN)还是虚拟磁盘。第一个文件位置适用于物理磁盘,第二个文件位置适用于虚拟磁盘。其原因是 virtio-blk 始终会报告分区的对齐值。物理磁盘可能也可能不会报告对齐值。 - /sys/block/
disk
/queue/physical_block_size - /sys/block/
disk
/queue/logical_block_size - /sys/block/
disk
/queue/minimum_io_size - /sys/block/
disk
/queue/optimal_io_size
内核仍会为不提供 I/O 参数信息的"传统"设备导出这些 sysfs 属性,例如:
例 23.1. sysfs 接口
alignment_offset: 0 physical_block_size: 512 logical_block_size: 512 minimum_io_size: 512 optimal_io_size: 0
块设备 ioctls
- BLKALIGNOFF:
alignment_offset
- BLKPBSZGET:
physical_block_size
- BLKSSZGET:
logical_block_size
- BLKIOMIN:
minimum_io_size
- BLKIOOPT :
optimal_io_size