ARTICLE · 1014455
Linux 6.12 源码深度剖析: do_exit
Linux 6.12 源码深度剖析: do_exit
前阵子排查内核线程卡死,发现个坑:别在内核线程里直接调 do_exit()。
那驱动里有个异步刷盘线程,遇到致命错误,程序员直接写了 do_exit(1) 退出。结果卸载模块时,rmmod 进程直接卡死在 D 状态。
根因就在这。kthread_stop() 会发信号等线程收尾。可线程直接调用 do_exit(),绕过了框架里的收尾逻辑。那个 complete 信号永远等不到,系统就死锁了。
后来又碰上个更憋屈的。数据库服务退出要耗 30 多秒,CPU 一个核心跑满。用 ftrace 一抓,全耗在 io_uring_files_cancel 上。
原来底层块设备驱动有大块 I/O 超时机制。进程退出时,内核只能硬等这些未决请求超时。要是驱动没实现高效的 cancel 回调,这等待根本躲不掉。
现在排查这类退出瓶颈,我直接用 bpftrace 挂个 kprobe 盯 do_exit。耗时卡在哪,一目了然。
原文Linux 6.12 源码深度剖析: do_exit
收录于linux短文
作者提示: 个人观点,仅供参考
四川,52分钟前,