进程死后还有 I/O 吗?——io_uring 在进程被回收后的“遗骸写盘”
来源:blog.ydb.tech — blog.ydb.tech · 24 分 · by porridgeraisin
📋 概述
YDB 工程师实测发现:进程被 kill 并 waitpid() 回收后,普通 io_uring 已提交的写请求可能仍在内核中存活并稍后抵达设备——这意味着对“快速失败”应用而言,waitpid() 并不能当作 I/O 屏障。作者给出极简解法:让写入方先 open + flock 独占锁,替换进程必须抢到同一把锁才能继续,用锁语义把“陈旧写请求”挡在门外。
🔑 核心要点
- 普通 io_uring 中,进程死亡回收后已提交的写可能仍在飞向设备。
- 对比之下,原生 AIO 与 SQPOLL 会让进程退出等待请求排空。
- 若把 waitpid() 当作 I/O 屏障,故障切换进程可能读到或覆盖旧写。
- 解法是让写入方持有flock 独占锁,替换进程须抢锁成功才继续。
💡 金句
Linux 6.6.79 上可复现的实测结论,而不是对每个内核、文件系统与设备的普适保证。
👍 0
👎 0
← 返回 Hacker News 首页