为什么使用io_submit API提交pwrite请求比提交pread请求慢得多
Why submitting pwrite request using io_submit API is much slower than submitting pread request?
我有一个应用程序,它可以从磁盘读取大量数据,还可以写入大量数据。我正在尝试使用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#%304 3433002302563550374 k316v225327""..., nbytes:524288, offset:24117248}}) = 1 <0.002457>
通常,相同的io_submit
API需要不同的时间。即使一次提交16个读取请求,它仍然比提交1个写入请求快。
那是对的吗?如何优化我的写作阶段?
您是否使用O_DIRECT
打开了文件,是否正在向完全分配的文件写入?如果没有,那么io_submit()
可以很容易地开始花费很长时间,因为它基本上变成了阻塞调用。请参阅UbuntuLinux中异步IO IO_submit延迟的答案之一,了解io_submit()
要正确执行必须做的一些事情。
相关文章:
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 在Google Kick start中提交时出错
- 如何在boost beast http请求中设置http头
- 发送一个带有libcurl C++问题的帖子请求:s
- 在多个核心中处理一个HTTP请求
- 使用libcurl提交批量url的正确BING Api POST url是什么
- 在 leetcode 上提交解决方案时出现堆栈缓冲区溢出错误
- 错误:请求非类类型为"MULTIMEDIA_FILME [500]"的成员|
- 使用 Winsock2.h C++向不和谐 API 发送 HTTP 请求时出现问题
- 每个服务器请求的内存预算
- std::getline没有在while循环中重新请求用户输入
- 使用 libgit2 创建 NOT INITIAL 提交
- 请求最简单的 OpenMP 目标 GPU 示例
- 请求有关C++中嵌入 for 循环的帮助
- 错误:请求从"常量字符 [5]"转换为非标量类型"字符串"
- 使用 winsock 接收 http 请求
- QNetworkAccessManager 稍后在添加请求时删除
- 为什么我收到来自谷歌的错误请求?
- 使用CPP手动构建POST请求,并使用它提交php表单
- 为什么使用io_submit API提交pwrite请求比提交pread请求慢得多