io_uring如何实现异步读?为何未观测到io-wrk线程?
为什么使用io_uring时观测不到io-wrk线程?
io_uring默认无需用户态辅助线程
io_uring的核心特性是在内核态直接处理IO请求,默认初始化(未设置IORING_SETUP_SQPOLL等特定参数)下,不会创建用户态的io-wrk线程。你之前查阅的资料可能描述的是早期版本、第三方封装库的自定义实现,或特定配置场景,原生liburing的默认逻辑不存在这类线程。你的代码未完成IO请求提交流程
从提供的代码片段来看,你仅完成了io_uring初始化、内存分配、SQE准备,但缺少io_uring_submit提交请求的步骤,也没有等待请求完成的逻辑(如io_uring_wait_cqe)。请求未提交,自然不会触发任何IO操作,更不可能产生相关线程。O_DIRECT与线程创建无关联
用O_DIRECT打开文件仅作用于跳过页缓存、直接与磁盘交互,该标志不影响io_uring的线程创建逻辑。
验证与调整建议
- 补全IO请求的提交与等待逻辑:
// 提交请求 int ret = io_uring_submit(&ring); if (ret < 0) { perror("io_uring_submit failed"); // 错误处理逻辑 } // 等待IO完成事件 struct io_uring_cqe *cqe; ret = io_uring_wait_cqe(&ring, &cqe); if (ret < 0) { perror("io_uring_wait_cqe failed"); // 错误处理逻辑 } // 标记完成事件已处理 io_uring_cqe_seen(&ring, cqe); - 若需启用内核辅助线程(如SQPOLL模式),可修改初始化参数:
此时用struct io_uring params; memset(¶ms, 0, sizeof(params)); params.flags = IORING_SETUP_SQPOLL; // 启用SQPOLL,内核将创建poll线程 params.sq_thread_idle = 1000; // 线程空闲超时时间(毫秒) int ret = io_uring_queue_init_params(128, &ring, ¶ms); if (ret < 0) { perror("io_uring_queue_init_params failed"); // 错误处理逻辑 }top -H -p <pid_of_process>可观测到内核创建的SQPOLL线程,该线程名称通常带有kworker前缀,而非io-wrk。
内容的提问来源于stack exchange,提问作者Priyanshu Yadav
相关产品推荐
相关产品推荐

