问题不在快,而在失控
很多 io_uring 服务在压测里吞吐漂亮,线上却出现尾延迟飙升。根因通常是提交队列无限推进,完成队列消费跟不上。
背压触发条件
- SQ ring 使用率超过 80%。
- CQ backlog 持续增长。
- 业务层处理耗时超过 IO 完成速率。
建议的三层背压
- 提交层:限制 in-flight 请求上限。
- 协程层:队列超阈值时暂停新任务调度。
- 入口层:对上游返回 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_latencycq_backloginflightshed_count
小结
io_uring 的上限很高,但系统稳定性的上限由背压机制决定。先把“慢下来也不爆炸”做对,再追求“快”。