我试图使用fio工具和ioengine作为libaio来获得性能数字(简单的4K随机读取)。 我观察到如果直接io被禁用(直接= 0),那么iops大幅下降。当direct = 1时,iops的效果要好50倍!
setup: fio being run from a linux client connected to a PCIe based
appliance over Fibre Channel.
这是从我的fio配置文件中删除的:
[global]
filename=/dev/dm-30
size=10G
runtime=300
time_based
group_reporting
[test]
rw=randread
bs=4k
iodepth=16
runtime=300
ioengine=libaio
refill_buffers
ioscheduler=noop
#direct=1
通过这个设置,我观察到iops大约为8000,当我在上面显示的配置文件中启用direct = 1时,我看到iops跳到250K! (在我正在使用的设置的情况下这是现实的)
所以,我的问题是如果我们使用libaio引擎,使用缓冲的i / o有什么问题吗?是强制性的,如果我们使用libaio,我们应该坚持直接io?
答案 0 :(得分:0)
每the docs on Kernel Asynchronous I/O (AIO) Support for Linux:
什么不起作用?
- AIO读取和写入没有O_DIRECT打开的文件(即正常缓冲文件系统AIO)。在ext2,ext3,jfs,xfs和nfs上,这些不会返回显式错误,而是静默地默认为同步或非AIO行为(即io_submit在这些情况下等待I / O完成)。对于大多数其他文件系统,报告了-EINVAL。
简而言之,如果你不使用O_DIRECT
,AIO仍然“适用于”许多最常见的文件系统,但在同步I / O上变得很慢(你可能刚刚使用过read
/ write
并为您节省了一些系统调用。大量的性能提升是实际受益于异步行为的结果。
所以要回答标题中的问题:是的,libaio
只应与未缓冲的/ O_DIRECT
文件描述符一起使用,如果您希望获得任何的好处来自它。