为什么使用io_submit API提交pwrite请求比提交pread请求慢得多

Why submitting pwrite request using io_submit API is much slower than submitting pread request?

本文关键字:请求 提交 pread pwrite io submit API 为什么      更新时间:2023-10-16

我有一个应用程序,它可以从磁盘读取大量数据,还可以写入大量数据。我正在尝试使用directio来提高I/O性能。

现在我使用libaio来实现异步IO,用于读写。初步结果表明,阅读阶段有所提高,但写作阶段下降幅度较大。

然后我使用strace来捕获运行时行为,这是读取阶段日志(我删除了一些不相关的日志(:

8509  20:59:03.005920 io_submit(139876672323584, 16, {{pread, filedes:102, buf:0x7f36bf816000, nbytes:524288, offset:96468992}} <unfinished ...>
8509  20:59:03.007236 <... io_submit resumed> ) = 16 <0.000893>

这是写入阶段日志:

8098  20:47:40.219194 io_submit(140277578346496, 1, {{pwrite, filedes:116, str:"177362215264252360240306377?26536/215#%3043433002302563550374 k316v225327""..., nbytes:524288, offset:24117248}}) = 1 <0.002457>

通常,相同的io_submit API需要不同的时间。即使一次提交16个读取请求,它仍然比提交1个写入请求快。

那是对的吗?如何优化我的写作阶段?

您是否使用O_DIRECT打开了文件,是否正在向完全分配的文件写入?如果没有,那么io_submit()可以很容易地开始花费很长时间,因为它基本上变成了阻塞调用。请参阅UbuntuLinux中异步IO IO_submit延迟的答案之一,了解io_submit()要正确执行必须做的一些事情。