Searching for the cause of hung tasks in the Linux kernel
a year ago
- #Kernel
- #Linux
- #Debugging
- 当进程在不可中断状态(TASK_UNINTERRUPTIBLE)中阻塞时间过长时,Linux内核会产生hung task警告
- hung task警告由khungtaskd守护进程触发,该进程会检查处于D状态(TASK_UNINTERRUPTIBLE)的进程
- 处于D状态的进程不能被信号中断,可能表明存在系统资源问题或子系统过载
- 引入TASK_KILLABLE状态是为了允许通过致命信号终止进程,同时仍保护进程内存
- 示例1:由于缺少no_read_workqueue/no_write_workqueue标志导致XFS文件系统变慢,引发hung task警告
- 示例2:生成核心转储的进程可能触发hung task警告,因为内核会以D状态保护内存
- 示例3:内核网络子系统中的rtnl_mutex锁导致多个进程挂起,通过BPF追踪技术发现该问题
- 调试hung task需要分析堆栈跟踪、检查系统指标,并使用bpftrace和drgn等工具
- hung task警告对于识别系统问题很有价值,但可能指向的是受害者而非根本原因