生產案例、Linux出現假死,怎麽回事?
1.什麽是假死
所謂假死,就是能ping通,但是ssh不上去;任何其他操作也都沒反應,包括上面部署的nginx也打不開頁面。
2.假死其實很難出現一次
作為一個多任務操作系統,要把系統忙死,忙到ssh都連不上去,也不是那麽容易的。尤其是現在還有fd保護、進程數保護、最大內存保護之類的機制。
你可以fork很多進程,系統會變得很慢,但是ssh還是能連上去;你可以分配很多內存,但是內存多到一定程度oom killer就會把你的進程殺掉,於是ssh又能工作了。
3.假死是如何實現的
有一個確定可以把系統搞成假死的辦法是:主進程分配固定內存,然後不停的fork,並且在子進程裏面sleep(100)。
也就是說,當主進程不停fork的時候,很快會把系統的物理內存用完,當物理內存不足時候,系統會開始使用swap;那麽當swap不足時會觸發oom killer進程;
4.系統假死為何能ping同無法連接
此時機器可以ping通,但是無法ssh上去。這是由於ping是在系統底層處理的,沒有參與進程調度;sshd要參與進程調度,但是優先級沒oom killer高,總得不到調度。
5.出現假死怎麽辦?
為什麽要費那麽大的力氣把機器搞死?我們知道假死是怎麽產生的即可,這樣可以針對假死的原因進行預防。 (其實假死的情況很少發生,只有當代碼寫的bug很多的情況下會出現。)
生產案例、Linux出現假死,怎麽回事?