天天看點

linux程序假死的原因_談談 Linux 假死現象

原标題:談談 Linux 假死現象

linux程式假死的原因_談談 Linux 假死現象

什麼是假死現象

所謂假死現象,是指 Linux 核心 Alive,但是其上的某個或所有操作的響應變得很慢的現象。

具體比較常見的現象有如下幾種:

能 Ping 通通路的伺服器。

系統負載非常的高。

SSH 不能登陸或者登陸比較慢。

伺服器上提供的服務都不能正常響應,比如:不能通路系統上部署的 Web 伺服器所提供的頁面。

在系統上做任何其它操作都沒有反應或者反應較慢。

假死現象并不是經常出現

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 的程序優先級調高,這樣當系統記憶體緊張時,還能勉強登陸伺服器進行調試,然後分析故障。

來源:徐亮偉架構師之路

原文:http://t.cn/Eo8fJ6A

題圖:來自谷歌圖檔搜尋

版權:本文版權歸原作者所有

投稿:歡迎投稿,投稿郵箱: [email protected]

The meaning of life is that it stops.

生命之是以有意義是因為它會停止。

責任編輯: