1.現(xiàn)在已經(jīng)證實(shí)這是rhels的一個(gè)bug,將這個(gè)bug進(jìn)行較為深入的分析后,發(fā)現(xiàn)這個(gè)bug很有意思:
事情的來(lái)龍去脈估計(jì)是這樣的:
先要從MCE說(shuō)起。MCE(Machine Check Exception)是一類計(jì)算機(jī)硬件錯(cuò)誤,它發(fā)生在當(dāng)計(jì)算機(jī)的CPU偵測(cè)到硬件問(wèn)題時(shí)。MicroSoft 的windows通常會(huì)以藍(lán)屏來(lái)顯示這類錯(cuò)誤:
STOP: 0x0000009C (0x00000004, 0x00000000, 0xB2000000, 0x00020151) "MACHINE_CHECK_EXCEPTION
在Linux上,cpu通常會(huì)將這些信息寫(xiě)到kernel log中,有些時(shí)候如果這些硬件問(wèn)題不能得到修復(fù)的話也會(huì)將信息寫(xiě)到控制臺(tái)上(console screen)如:
CPU 0: Machine Check Exception: 0000000000000004 Bank 2: f200200000000863 Kernel panic: CPU context corrupt
以上顯示的這類信息都是一些16進(jìn)制的地址,并不能給我們直觀的認(rèn)識(shí)。怎樣對(duì)這信息解碼是一個(gè)很大的問(wèn)題,當(dāng)然我們可以去咨詢CPU廠商,或是閱讀他們的 文檔。
在Linux下有一款軟件mcelog(軟件地址為/usr/sbin/mcelog,日志地址為/var/log/mcelog)是專門(mén)用來(lái)對(duì)以上的錯(cuò) 誤代碼進(jìn)行解碼的(decode)。
接下來(lái)就說(shuō)到問(wèn)題的正題上了。我們知道rhels也是有可能運(yùn)行在Xen虛擬環(huán)境下的,即作為DomainU來(lái)運(yùn)行,這時(shí)就不需要去運(yùn)行mcelog了, 因?yàn)樗旧砭驮谔摂M的硬件環(huán)境上,出了問(wèn)題也是軟件虛擬的問(wèn)題。從/etc/cron.hourly/mcelog.cron中可以看見(jiàn)系統(tǒng)開(kāi)發(fā)者的意 圖:
#!/bin/bash
if [ -e /proc/xen ] && [ `cat /sys/hypervisor/uuid` != "00000000-0000-0000-0000-000000000000" ]; then
# this is a PV Xen guest. Do not run mcelog.
exit 1;
else
/usr/sbin/mcelog --ignorenodev --filter >> /var/log/mcelog
fi
系統(tǒng)開(kāi)發(fā)者的意圖是好的。但是,在全部默認(rèn)安裝rhels的時(shí)候,我們會(huì)將帶有xen的kernel安裝到機(jī)器上,而且此時(shí)的xend是不會(huì)自動(dòng)啟動(dòng)的, 即后面的`cat /sys/hypervisor/uuid`會(huì)阻塞。又由于這段代碼是寫(xiě)在/etc/cron.hourly中所以就會(huì)出現(xiàn)大量的`cat /sys/hypervisor/uuid`阻塞,而這時(shí)系統(tǒng)的負(fù)載(根據(jù)負(fù)載的定義)自然就上去了。
2.問(wèn)題解決辦法
看完上面的分析,就知道怎么解決了。你可以將上面的關(guān)于PV Guest的監(jiān)測(cè)代碼刪掉(現(xiàn)在的系統(tǒng)就是這么干的)。或是添加更加嚴(yán)格的監(jiān)測(cè)代碼:
#!/bin/sh
xendstatus=`service xend status`
if [ "$xendstatus"="xend is running" ]; then
if [ -e /proc/xen ] && [ `cat /sys/hypervisor/uuid` != "00000000-0000-0000-0000-000000000000" ]; then
# this is a PV Xen guest. Do not run mcelog.
exit 1;
else
/usr/sbin/mcelog --ignorenodev --filter >> /var/log/mcelog
fi
else
exit 1;
fi
或是有這樣的解決(基于半虛擬化的特點(diǎn)):
if [ -e /proc/xen/capabilities ]; then
#xen
grep control_d /proc/xen/capabilities > & /dev/null
if [$? -ne 0 ]; then
#domU -- do not run on xen PV guest
exit 1
fi
fi
或者你不用帶用Xen的kernel來(lái)啟動(dòng)系統(tǒng)。
方法很多,任由你選吧。
參考目錄:
http://en.wikipedia.org/wiki/Machine_Check_Exceptionhttps://bugzilla.redhat.com/show_bug.cgi?id=225203