Linux系統(tǒng)死機(jī)情況分析與處理方案介紹
Linux系統(tǒng)死機(jī)有很多種情況,最常見(jiàn)的是系統(tǒng)負(fù)載過(guò)高導(dǎo)致的。如上次介紹的fork炸彈就是這個(gè)原理,此外還可以運(yùn)行內(nèi)存耗用極大的程序(如虛擬機(jī)),也會(huì)迅速提升系統(tǒng)負(fù)載。由于系統(tǒng)負(fù)載過(guò)高導(dǎo)致的卡死,一定是解決的越快越好!此時(shí)必須記住的是,不能再試圖依賴任何圖形界面的東西,如 Gnome 的系統(tǒng)監(jiān)視器(這是我從 Windows 遺留下來(lái)的愚昧習(xí)慣……),這只會(huì)繼續(xù)加重這種卡死的局面。那怎么辦?
不要怕,Linux系統(tǒng)最初就是不需要圖形界面的,因?yàn)橛幸粋€(gè)很強(qiáng)大的文字界面。按 Ctrl-Alt-F1(F1-F6 一般來(lái)說(shuō)都可以),然后等一會(huì)兒,就會(huì)切換到 tty,也就是所謂的文字界面。這個(gè)時(shí)候需要用用戶名密碼登入。注意,可能鍵盤(pán)輸入的速度比較慢,不過(guò)應(yīng)該還是可以忍受的。下面在提示符后面輸入 top 回車(chē),這時(shí)會(huì)看到一張動(dòng)態(tài)的表,上面列出了耗用資源最多的進(jìn)程。觀察它刷新一兩次,按q退出,然后輸入 kill ,其中的 PID 你可以在 top 里面看到。這個(gè)時(shí)候應(yīng)該會(huì)快了不少,如果你發(fā)現(xiàn)沒(méi)有成功結(jié)束掉,就再輸入 kill -KILL ,這次基本上就沒(méi)問(wèn)題了。
除了上面這種情況外,一些底層軟件的 bug 也可能導(dǎo)致一些奇怪的死機(jī)問(wèn)題。我某位同學(xué)近日就因?yàn)槟涿畹乃罊C(jī)強(qiáng)制重啟把 ext4 的分區(qū)給傷了。(最后是 sysreccd 修復(fù)了,貌似是分區(qū)表部分損壞)據(jù)其說(shuō),死機(jī)是鍵鼠均無(wú)反應(yīng)。一般來(lái)說(shuō),系統(tǒng)負(fù)載高導(dǎo)致的死機(jī),在可怕鍵盤(pán)也會(huì)有反應(yīng),有人說(shuō)如果死機(jī)到鍵盤(pán)無(wú)響應(yīng)“負(fù)載都無(wú)限大了”,亦有人說(shuō)這可能是 X Server 與驅(qū)動(dòng)配合有問(wèn)題導(dǎo)致的。不過(guò)我們考慮一下遇到這種情況怎么辦?
OK,這是今天才學(xué)到的方法,叫做 reisub,這個(gè)方法可以在各種情況下安全地重啟計(jì)算機(jī)。大家在鍵盤(pán)上找,可以找到一個(gè)叫做“Sys Rq”的鍵,在臺(tái)機(jī)的鍵盤(pán)上通常與 Prt Sc 共鍵,在筆記本可能在其他位置,如 Delete。以臺(tái)機(jī)為例,要使用這種方法需要按住 Alt-Print(Sys Rq),然后依次按下 reisub 這幾個(gè)鍵,按完 b 系統(tǒng)就會(huì)重啟。
下面解釋一下這個(gè)方法:其實(shí) Sys Rq 是一種叫做系統(tǒng)請(qǐng)求的東西,按住 Alt-Print 的時(shí)候就相當(dāng)于按住了 Sys Rq 鍵,這個(gè)時(shí)候輸入的一切都會(huì)直接由Linux內(nèi)核來(lái)處理,它可以進(jìn)行許多低級(jí)操作。這個(gè)時(shí)候 reisub 中的每一個(gè)字母都是一個(gè)獨(dú)立操作,他們分別表示:
R:unRaw 將鍵盤(pán)控制從 X Server 那里搶回來(lái)
E:tErminate 給所有進(jìn)程發(fā)送 SIGTERM 信號(hào),讓他們自己解決善后
I:kIll 給所有進(jìn)程發(fā)送 SIGKILL 信號(hào),強(qiáng)制他們馬上關(guān)閉
S:Sync 將所有數(shù)據(jù)同步至磁盤(pán)
U:Unmount 將所有分區(qū)掛載為只讀模式
B:reBoot 重啟
這6個(gè)字母的順序是不可以記錯(cuò)的。那怎么記呢?這里提供一個(gè)個(gè)人認(rèn)為比較好的方法:?jiǎn)卧~ busier(busy 的比較級(jí),更忙)倒過(guò)來(lái)就是了。
死機(jī)?不合適吧。真死機(jī)了除了hard reset還能干什么?叫失去響應(yīng)或者無(wú)響應(yīng)更合適吧?
另外服務(wù)器一般都是遠(yuǎn)程操作的,sysrq怎么用呢?
X掛掉,通常psuedo console就能搞定。通常大家也會(huì)開(kāi)ssh,絕大多數(shù)情況下都能連上去殺進(jìn)程,做重啟前的收尾比如sync來(lái)commit。
關(guān)于sysrq,通常RHEL/OEL等EnterpriseLinux系統(tǒng)默認(rèn)都是關(guān)閉的需要事先開(kāi)啟才可以用。
cat /proc/sys/kernel/sysrq,看了手頭的幾個(gè)桌面發(fā)行版本,只有Ubuntu默認(rèn)是開(kāi)的,Arch是關(guān)閉的。
對(duì)于桌面用戶而言,當(dāng)桌面僵死時(shí),用這個(gè)來(lái)搞一下,還是很方便的。