0

我有一个从磁盘读取大量数据并写入大量数据的应用程序。我正在尝试使用直接 io 来提高 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:"\177\362\215\264\252\360\240\306\377?\265\36/\215#%\304\0343\300\230\256\3550\374 k\316\v\225\327\""..., nbytes:524288, offset:24117248}}) = 1 <0.002457>

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

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

4

1 回答 1

0

您是否使用打开文件O_DIRECT并将 a 写入完全分配的文件?如果不是,那么io_submit()很容易通过基本上变成阻塞呼叫来开始花费很长时间。请参阅Ubuntu Linux 中异步 IO io_submit 延迟的答案之一,了解一些必须做的事情才能io_submit()正确执行。

于 2020-01-18T11:26:28.717 回答