You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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的线程创建逻辑。

验证与调整建议

  1. 补全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);
    
  2. 若需启用内核辅助线程(如SQPOLL模式),可修改初始化参数:
    struct io_uring params;
    memset(&params, 0, sizeof(params));
    params.flags = IORING_SETUP_SQPOLL; // 启用SQPOLL,内核将创建poll线程
    params.sq_thread_idle = 1000; // 线程空闲超时时间(毫秒)
    int ret = io_uring_queue_init_params(128, &ring, &params);
    if (ret < 0) {
        perror("io_uring_queue_init_params failed");
        // 错误处理逻辑
    }
    
    此时用top -H -p <pid_of_process>可观测到内核创建的SQPOLL线程,该线程名称通常带有kworker前缀,而非io-wrk。

内容的提问来源于stack exchange,提问作者Priyanshu Yadav

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 03:02:28