1. 程式人生 > >生產案例、Linux出現假死,怎麽回事?

生產案例、Linux出現假死,怎麽回事?

其他 怎麽 linu ping 由於 子進程 觸發 使用 實現

1.什麽是假死
所謂假死,就是能ping通,但是ssh不上去;任何其他操作也都沒反應,包括上面部署的nginx也打不開頁面。

2.假死其實很難出現一次
作為一個多任務操作系統,要把系統忙死,忙到ssh都連不上去,也不是那麽容易的。尤其是現在還有fd保護、進程數保護、最大內存保護之類的機制。
你可以fork很多進程,系統會變得很慢,但是ssh還是能連上去;你可以分配很多內存,但是內存多到一定程度oom killer就會把你的進程殺掉,於是ssh又能工作了。

3.假死是如何實現的
有一個確定可以把系統搞成假死的辦法是:主進程分配固定內存,然後不停的fork,並且在子進程裏面sleep(100)。
也就是說,當主進程不停fork的時候,很快會把系統的物理內存用完,當物理內存不足時候,系統會開始使用swap;那麽當swap不足時會觸發oom killer進程;

當oom killer殺掉了子進程,主進程會立刻fork新的子進程,並再次導致內存用完,再次觸發oom killer進程,於是進入死循環。而且oom killer是系統底層優先級很高的內核線程,也在參與死循環。

4.系統假死為何能ping同無法連接
此時機器可以ping通,但是無法ssh上去。這是由於ping是在系統底層處理的,沒有參與進程調度;sshd要參與進程調度,但是優先級沒oom killer高,總得不到調度。

5.出現假死怎麽辦?
為什麽要費那麽大的力氣把機器搞死?我們知道假死是怎麽產生的即可,這樣可以針對假死的原因進行預防。 (其實假死的情況很少發生,只有當代碼寫的bug很多的情況下會出現。)

其實建議使用nice將sshd的進程優先級調高。這樣當系統內存吃緊,還能勉強登陸sshd,進入調試。然後分析故障。

生產案例、Linux出現假死,怎麽回事?