linux 負(fù)有盛名的特點(diǎn)之一是其非凡的穩(wěn)定性。然而,假如您的硬件有缺陷或配置不正確,即使是世界上最穩(wěn)定的操作系統(tǒng)也不會(huì)對(duì)您有什么幫助。本文中,Daniel Robbins 將告訴您如何診斷和修復(fù) CPU 問題,并告訴您如何測(cè)試 RAM 缺陷。通過學(xué)習(xí)本文,您將學(xué)會(huì)確保您的 Linux 系統(tǒng)達(dá)到盡可能好的的穩(wěn)定性。
在 Linux 世界中,我們中的許多人已遭受過令人深惡痛絕的硬件問題之苦。許多人曾經(jīng)配置了一臺(tái) Linux 機(jī)器、安裝了最喜歡的分發(fā)軟件、編譯并安裝了一些附加應(yīng)用程序并且使各個(gè)部件都運(yùn)行順利,到最后發(fā)現(xiàn)新系統(tǒng)中有一個(gè)致命的硬件錯(cuò)誤?無論是隨機(jī)分段錯(cuò)誤、數(shù)據(jù)毀壞、硬鎖定、還是丟失數(shù)據(jù)其結(jié)果都是一樣的 -- 硬件故障使通常情況下可靠的 Linux 操作系統(tǒng)幾乎無法順利運(yùn)行。本文中,我們將深入探討如何檢測(cè) CPU 和 RAM 問題 -- 在缺陷部件造成一些嚴(yán)重的破壞之前就答應(yīng)更換它們。
假如您正遭遇不穩(wěn)定問題并且猜測(cè)該問題與硬件有關(guān),我鼓勵(lì)您測(cè)試 CPU 和內(nèi)存以確保它們工作正常。但是,即使您尚未碰到這些問題,執(zhí)行 CPU 和內(nèi)存測(cè)試仍不失為一個(gè)好主意。在測(cè)試 CPU 和內(nèi)存中,您可能會(huì)檢測(cè)到硬件問題,它可能會(huì)在某個(gè)不適當(dāng)?shù)臅r(shí)候給您帶來麻煩,并可能已經(jīng)造成了數(shù)據(jù)丟失或讓您花了數(shù)小時(shí)卻搜索不到問題的根源。正確地,前瞻性地應(yīng)用這些技術(shù)可幫助您避開這些令人頭疼的問題,并且假如系統(tǒng)通過了測(cè)試,您即可放心,系統(tǒng)是符合規(guī)范的。
CPU 問題 假如您有一個(gè)非常糟糕的 CPU,您的機(jī)器可能無法引導(dǎo) Linux 或僅運(yùn)行幾分鐘便被鎖定。由于癥狀非常明顯,所以輕易診斷出這種不良狀態(tài)下的 CPU 是有缺陷的。但更多的是一些不易檢測(cè)到的細(xì)微的 CPU 缺陷;一般情況下,不太明顯的錯(cuò)誤能引起機(jī)器無明顯原因的不時(shí)鎖定,或?qū)е履承┻M(jìn)程意外死掉。多數(shù) CPU 不穩(wěn)定問題可通過“考驗(yàn)”CPU 來觸發(fā) -- 給 CPU 分配大量的工作,促使其變熱,甚至在可能的情況下使它休眠。讓我們看一下壓力測(cè)試 CPU 的一些方法。
當(dāng)聽說測(cè)試 CPU 穩(wěn)定性的最好方法之一是 Linux 內(nèi)建的 -- 內(nèi)核編譯,您可能會(huì)感到希奇。gcc 編譯器是測(cè)試一般 CPU 穩(wěn)定性的一個(gè)很好的工具,內(nèi)核編譯將充分使用 gcc。通過在 /usr/src/linux 目錄創(chuàng)建并運(yùn)行下面的腳本可以對(duì)您的機(jī)器進(jìn)行 industrial-strength 內(nèi)核編譯壓力測(cè)試:
cpubuild 腳本
#!/bin/bash make dep while [ "foo" = "foo" ] do make clean make -j2 bzImage if [ $? -ne 0 ] then echo OUCH OUCH OUCH OUCH exit 1 fi done
您將注重到此腳本重復(fù)編譯內(nèi)核。原因很簡(jiǎn)單 -- 一些 CPU 有斷斷續(xù)續(xù)的小故障,使得它們?cè)?95% 的時(shí)間里順利地編譯內(nèi)核,但又不時(shí)地使內(nèi)核編譯崩潰。通常情況下,這是因?yàn)樵谔幚砥骷訜岬揭欢囟龋ㄔ谠摐囟认绿幚砥髯兊貌环€(wěn)定)之前可能進(jìn)行了 5 個(gè)或更多內(nèi)核編譯。
在上面的腳本中,注重調(diào)整 -j 選項(xiàng),使緊跟它的數(shù)字等于系統(tǒng)中 CPU 的數(shù)目加 1;換句話說,若是單處理器使用 "2",雙處理器使用 "3",依此類推。-j 選項(xiàng)告訴 make 程序行平行編譯內(nèi)核,確保在編譯每個(gè)源文件后總有至少一個(gè) gcc 進(jìn)程預(yù)備就緒 -- 確保 CPU 承受的壓力達(dá)到最大。假如下午不預(yù)備使用 Linux 機(jī)器,請(qǐng)繼續(xù)運(yùn)行此腳本并讓機(jī)器重新編譯內(nèi)核幾個(gè)小時(shí)。
可能的 CPU 問題 假如腳本持續(xù)幾個(gè)小時(shí)運(yùn)行順利,祝賀您!您的 CPU 已經(jīng)通過了第一個(gè)測(cè)試。但是,上述腳本可能會(huì)意外死掉。如何知道是 CPU 有問題而不是其它的問題呢?假如 gcc 發(fā)出與下面類似的錯(cuò)誤,則很有可能是 CPU 有問題:
gcc: Internal compiler error: PRogram cc1 got fatal signal 11
這時(shí),CPU 有三種可能的狀態(tài):
假如您輸入 "make bzImage" 重新進(jìn)行內(nèi)核編譯,并且編譯器死在同一文件上,請(qǐng)繼續(xù)一遍遍輸入 "make bzImage"。假如試了大約十次之后,編譯進(jìn)程繼續(xù)死在此特定文件上,那么問題很可能是由(很少)gcc 編譯器錯(cuò)誤引起的,該錯(cuò)誤是由此特定的源文件而不是有問題的 CPU 觸發(fā)的。但是,這些天 gcc 很穩(wěn)定,那么這種情況發(fā)生的可能性很小。 假如您輸入 "make bzImage" 重新進(jìn)行內(nèi)核編譯,并且稍后得到另一個(gè)信號(hào) 11,那么您的 CPU 很可能快要無法使用了。
假如您輸入 "make bzImage" 重新進(jìn)行內(nèi)核編譯并且內(nèi)核編譯成功,那也不意味著您的 CPU 是好的。通常這意味著僅當(dāng) CPU 升到一定的溫度以上(CPU 使用超過一定時(shí)間后會(huì)變熱,可能進(jìn)行過幾次內(nèi)核編譯后能達(dá)到此臨界點(diǎn)),CPU 故障才不時(shí)地顯露出來。
搶救 CPU 假如您的 CPU 在重負(fù)載之下正發(fā)生隨機(jī)的斷斷續(xù)續(xù)的錯(cuò)誤,可能您的 CPU 根本沒什么問題 -- 可能只是冷卻不當(dāng)。您可以檢查下列內(nèi)容:
您的 CPU 風(fēng)扇是否已插上? 它是否能相對(duì)地避免灰塵? 通電時(shí)風(fēng)扇確實(shí)旋轉(zhuǎn)(并以適當(dāng)?shù)乃俣刃D(zhuǎn))嗎? 散熱片在 CPU 上固定好了嗎? 在 CPU 和散熱片之間有導(dǎo)熱膠嗎? 您的機(jī)器通風(fēng)情況足夠好嗎?
假如一切正常,您可能希望讓此打開的機(jī)器返回到內(nèi)核編譯測(cè)試。請(qǐng)讓內(nèi)核編譯進(jìn)行大約五分鐘時(shí)間,然后將手放到這個(gè)正在運(yùn)行的機(jī)器中并觸摸四周的供電設(shè)備的外部金屬保護(hù)外套。然后,用指尖小心地測(cè)試散熱片的溫度。假如異常地?zé)幔敲春芸赡苣纳崞L(fēng)扇組合相對(duì)于您的特定 CPU 來說不夠強(qiáng)勁。在這種情況下,升級(jí)您的系統(tǒng)冷卻硬件 -- CPU 尚未遭受任何永久性損壞并且仍然可發(fā)揮作用。
最終 CPU 測(cè)試 內(nèi)核編譯測(cè)試是測(cè)試 CPU 穩(wěn)定性的一個(gè)很好的方法,但還有一個(gè)更極端的 CPU 測(cè)試方法,或許您希望使用。我將這種方法保留到最后,是因?yàn)榧偃?CPU 只粗略地冷卻過,這種非凡的測(cè)試可能會(huì)真的使其過熱,理論上會(huì)對(duì) CPU 造成永久性損壞。這種測(cè)試傾向于那些通過內(nèi)核測(cè)試,沒有什么問題的系統(tǒng) -- 那些您希望確保即使 CPU 負(fù)載達(dá)到極限也能輕松處理的系統(tǒng)。假如您的 CPU 已經(jīng)過適當(dāng)?shù)乩鋮s,將會(huì)通過這個(gè)測(cè)試,假如沒通過,則需要進(jìn)一步冷卻。
要執(zhí)行 "最終" CPU 測(cè)試,所做的第一件事是轉(zhuǎn)到 Lm_sensors 頁(yè)(請(qǐng)參閱參考資料)并下載 lm_sensors 軟件包。源 tarball 包含各種內(nèi)核模塊,這些模塊結(jié)合了幾乎已內(nèi)建在所有當(dāng)今主板上的健康監(jiān)視功能。一旦正確安裝了軟件包并且裝載(使用 prog/detect/sensors-detect 腳本指出裝入哪些模塊)合適的模塊,您將看到一些新文件和目錄出現(xiàn)在 /proc/sys/dev/sensors 下。這些文件包含方便的信息如 CPU 風(fēng)扇速度、CPU 和主板溫度讀數(shù)以及主板電壓讀數(shù),所有這些信息都會(huì)實(shí)時(shí)更新。由于我配置此軟件包收到了較好的效果,所以我推薦您配置此軟件包作為模塊編譯并使用 sensors-detect 腳本來指出引導(dǎo)時(shí)裝入哪些模塊。
一旦裝入了 lm_sensors 模塊,我推薦您安裝一個(gè)圖形 CPU/傳感器監(jiān)視器,它使您能夠?qū)崟r(shí)觀察 CPU 負(fù)載和溫度而無須重復(fù)地在 /proc/sys/dev/sensors 中 "cat" 文件。出于這個(gè)目的,我使用一個(gè)稱為 gkrellm (請(qǐng)參閱參考資料)的很小的程序。這是我的 gkrellm 應(yīng)用程序的快照,用來監(jiān)視 CPU 使用情況、主板溫度設(shè)置和其它一些事情:
現(xiàn)在,等待測(cè)試。我通常啟動(dòng)我的圖形傳感器監(jiān)視器,然后作為 root 啟動(dòng) cpuburn 程序。然后,觀察 CPU 溫度讀數(shù)上升并變穩(wěn),讓 cpuburn 保持運(yùn)行大約一個(gè)小時(shí)。假如重復(fù)這些步驟而且 CPU 溫度持續(xù)上升到異常高的溫度(160 華氏度左右將被認(rèn)為是“異常”高),那么您的 CPU 冷卻系統(tǒng)需要大的調(diào)整。假如機(jī)器崩潰或鎖定,或 cpuburn 進(jìn)程死掉,那么您的 CPU 冷卻需要改進(jìn) -- 或者可能您的特定 CPU 只是簡(jiǎn)單地不符合“規(guī)范”。您可以使用 CPU 溫度讀數(shù)作出判定。但假如一切順利,那么您的系統(tǒng)將可應(yīng)付所有的挑戰(zhàn)。大約一小時(shí)后,您可以繼續(xù)進(jìn)行并殺死 cpuburn 程序,恢復(fù)正常操作。