我有一个应用程序从磁盘读取大量数据并且还写了很多。我正在尝试使用direct 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个写入请求更快。
这是对的吗?如何优化写作阶段?
答案 0 :(得分:0)
您是否使用O_DIRECT
打开了文件,是否正在向已完全分配的文件中写入a?如果不是这样,那么io_submit()
可以很容易地通过实质上变成阻塞呼叫而开始花费很长时间。要使io_submit()
正常运行必须执行的一些操作,请参见answers to asynchronous IO io_submit latency in Ubuntu Linux之一。