Linux Direct IO

2017-10-27 linux language

可以直接在应用层和磁盘之间建立通道,减少上下文切换次数。

使用

在 Linux 中使用 DirectIO 很简单,在通过 open(2) 打开文件时,在 flags 参数中添加上 O_DIRECT 即可,以告诉内核想对该文件进行直接 IO 操作。

当然,上述的 O_DIRECT 宏依赖于 _GNU_SOURCE 的宏定义。

注意事项

因为涉及到直接操作磁盘,那么需要保证 存放数据缓存区的起始位置 以及每次 读写数据长度 必须是 磁盘逻辑块大小的整数倍,如果不满足就会报 EINVAL 的错误。

磁盘逻辑块的大小可以通过 statfs() 函数获取,对应了 f_bsize 字段,一般是 512 字节,如果是 SSD 可能是 4096 大小,也可以通过如下命令获取。

----- 硬盘的最小存储单位,一般是扇区,本身并没有Block概念
# fdisk -l
----- 文件系统Block大小,首先查看类型,然后再选择对应的工具
# df -T
/dev/sda2   ext4      51474912 16553932  32283156  34% /home
# tune2fs -l /dev/sda2 | grep "Block size"
Block size:               4096