问题不在快,而在失控

很多 io_uring 服务在压测里吞吐漂亮,线上却出现尾延迟飙升。根因通常是提交队列无限推进,完成队列消费跟不上。

背压触发条件

  • SQ ring 使用率超过 80%。
  • CQ backlog 持续增长。
  • 业务层处理耗时超过 IO 完成速率。

建议的三层背压

  1. 提交层:限制 in-flight 请求上限。
  2. 协程层:队列超阈值时暂停新任务调度。
  3. 入口层:对上游返回 retry-after 或降级响应。

伪代码

if (inflight > max_inflight || cq_backlog > cq_limit) {
    pause_accept();
    shed_low_priority();
}

while (io_uring_peek_cqe(&ring, &cqe) == 0) {
    handle_cqe(cqe);
    io_uring_cqe_seen(&ring, cqe);
}

关键指标

  • submit_to_complete_latency
  • cq_backlog
  • inflight
  • shed_count

小结

io_uring 的上限很高,但系统稳定性的上限由背压机制决定。先把“慢下来也不爆炸”做对,再追求“快”。