linux 假死分析

所谓假死,就是能ping通,但是ssh不上去;任何其他操作也都没反应,包括上面部署的apache也打不开页面。

作为一个多任务操作系统,要把系统忙死,忙到ssh都连不上去,也不是那么容易的。尤其是现在还有fd保护、进程数保护、最大内存保护之类的机制。你可以fork很多进程,系统会变得很慢,但是ssh还是能连上去;你可以分配很多内存,但是内存多到一定程度oom killer就会把你的进程杀掉,于是ssh又能工作了。

有一个确定可以把系统搞成假死的办法是:主进程分配500MB内存,然后不停的fork,并且在子进程里面sleep(100)。

这是什么原理?这是swap、copy on write、allocate on write、oom killer一起作用的结果。当主进程不停fork的时候,很快会把系统的物理内存用完,然后开始swap;在swap的时候触发了fork的copy on write属性;此时会需要分配真正的内存给之前copy on write的子进程,由于内存不足,这将触发oom killer开始杀进程;当oom killer杀掉了子进程,主进程立刻又fork了新的子进程,并再次导致内存用完,再次触发oom killer;于是死循环,而且oom killer是系统底层优先级很高的内核线程,也在参与死循环。

此时机器可以ping通,但是无法ssh上去。这是由于ping是在系统底层处理的,没有参与进程调度;sshd要参与进程调度,但是优先级没oom killer高,总得不到调度。

为什么要费那么大的力气把机器搞死?因为所有人都会遇到机器假死的情况。知道假死是怎么产生的,就可以针对假死的原因进行预防。
其实建议使用nice将sshd的进程优先级调高。这样当系统内存吃紧,还能勉强登陆sshd,进入调试。然后分析故障。

原文地址:https://www.cnblogs.com/baozexu/p/11415459.html