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

问题描述 投票:0回答:1

我有一个应用程序,它从磁盘上读取大量数据,并且还要写很多数据。我正在尝试使用直接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_submit API需要花费很多时间。即使一次提交16个读请求,仍然比提交1个写请求快。

是这样吗?如何优化写阶段?

c++ io aio
1个回答
0
投票

您是否使用O_DIRECT打开了文件,是否正在将写入完全分配的文件中?如果不是,那么io_submit()实际上可以变成阻塞呼叫,很容易开始花费很长时间。要使answers to asynchronous IO io_submit latency in Ubuntu Linux正常运行必须执行的一些操作,请参阅io_submit()之一。

© www.soinside.com 2019 - 2024. All rights reserved.