linux可以使用看门狗来监控系统调度是否正常。
但是如果看门狗复位了,怎么找到凶手呢?
我们先看一下狗复位的场景:
CPU的某个核挂死了;
CPU发生RR死锁;
CPU某些高优先级的进程或者线程一直不释放(例如在死循环);
中断/软中断/定时器挂死???
我们看一下第三种场景:
看门狗的进程是普通进程,这样得不到调度,里面即使增加调测信息也无法打印。
一种方法可以参考:
普通进程挂接信号定时通过信号(例如1秒))挂接一个信号处理函数;
信号处理函数通过ioctl在内核态增加原子变量W;
内核态启动一个定时器(阿猫阿狗线程都抢占不过它),定时器判断,如果原子变量W大于0,则做减一操作,喂一次狗;
如果W第一次等于零,则主动喂一次狗,打印调测信息;
如果W继续等于零,那么在喂一次狗,再打印一次调测信息;
事不过三,第三次就等死吧。
打印什么调测信息呢:
第一:看门狗进程是否处于running状态;
第二:cpu核是否OK;
第三:调用dump_stack打印进程的内核态调用轨迹;
第四:调用sysrq_timer_list_show打印每个核的调度队列情况,包括当前正在执行哪个进程/线程
本文探讨了Linux系统中看门狗复位的原因及排查方法,重点介绍了如何通过信号处理和内核态定时器机制来监测系统调度异常,并提供具体的调试步骤。
4785

被折叠的 条评论
为什么被折叠?



