Linux 假死现象

看到一篇好文章就转载来了

Posted by TL on November 19, 2018

什么是假死现象

所谓假死现象,是指 Linux 内核 Alive,但是其上的某个或所有操作的响应变得很慢的现象。

具体比较常见的现象有如下几种:

  1. 能 Ping 通访问的服务器。

  2. 系统负载非常的高。

  3. SSH 不能登陆或者登陆比较慢。

  4. 服务器上提供的服务都不能正常响应,比如:不能访问系统上部署的 Web 服务器所提供的页面。

  5. 在系统上做任何其它操作都没有反应或者反应较慢。



假死现象并不是经常出现

Linux 作为一个多任务操作系统,要把系统忙死,忙到 SSH 都连不上去也不是那么容易的。尤其是现在的系统还有 FD 保护、进程数保护、最大内存保护之类的机制。

你可以尝试 Fork 很多进程,系统会变得很慢,但是 SSH 通常还是能连上去的;你可以尝试分配很多内存,但是内存多到一定程度 Linux 的 OOM 机制的 Killer 进程就会杀掉你的进程,来保证其它服务能正常工作。



假死现象是如何出现的

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

也就是说,当主进程不停 Fork 的时候,很快会把系统的物理内存用完。当物理内存不足时候,系统会开始使用 Swap。那么当 Swap 不足时会触发 OOM 机制的 Killer 进程来杀掉多余进程。

当 OOM 机制的 Killer 进程杀掉了子进程,主进程会立刻 Fork 新的子进程,并再次导致内存用完并再次触发 OOM 机制的 Killer 进程杀掉子进程,于是就进入死循环。而且 OOM Killer 进程是系统底层优先级很高的内核线程,此时也参与到这个死循环中,长此以往系统资源就会被消耗殆尽。假死现象是如何出现的



系统出现假死现象后,为何还能 Ping 通但又无法建立新的网络连接

系统出现假死现象后,服务器还可以 Ping 通,但是无法建立新的网络连接。比如:SSH 无法连上去。这是由于 Ping 是在 Linux 系统底层 ( Kernel )处理的,并没有参与进程调度。而 SSHD 是要参与进程调度,但是优先级没 OOM 机制的 Killer 进程高。这样就会一直得不到系统调度,从而始终无法正确的提供服务来与 SSH 客户端建立新的连接。



Linux 出现假死现象,我们应该怎么办?

为什么要费那么大的力气把服务器搞死呢?我们知道假死是怎么产生的即可,这样可以针对假死的原因进行预防。 其实假死的情况很少发生,通常只有代码出现 Bug 很多的情况或者某个服务进程未正确配置的情况下才会出现。

建议使用 nice 命令将 SSHD 的进程优先级调高,这样当系统内存紧张时,还能勉强登陆服务器进行调试,然后分析故障。