linux程序假死的原因 linux 假死分析

2021-10-17 06:02:51 字數 821 閱讀 8594

所謂假死,就是能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,進入除錯。然後分析故障。

Linux程序KILL不掉的原因

做過linux開發的人通常遇到過乙個程序不能kill掉的情況,即使使用的是kill 9方式,而一般的教課書都只說kill 9能殺死任何程序,遇到這種情況時就會感覺到很矛盾,其它這也是正常的,通常有兩種情況是不能kill掉的 一是程序已經成為僵死程序,當它的父程序將它 或將它的父程序kill掉即可在p...

引起程序排程的原因

引起程序排程的原因 2008 11 26 22 27 引起程序排程的原因有以下幾類,1 正在執行的程序執行完畢。這時,如果不選擇新的就緒程序執行,將浪費處理機資源。2 執行中程序自己呼叫阻塞原語將自己阻塞起來進入睡眠等狀態。3 執行中程序呼叫了p原語操作,從而因資源不足而被阻塞 或呼叫了v原語操作啟...

殭屍程序的產生原因

在linux系統中,殭屍程序是已經執行完畢,但是沒有被父程序 的子程序。判斷殭屍程序的乙個方法是使用ps命令檢視程序狀態。如果程序狀態是z,說明這是乙個殭屍程序。在多程序的程式中,父程序會啟動若干個子程序來處理任務。當子程序退出後,除了在程序表中占用的乙個程序表項,子程序所使用的資源 檔案描述符 記...