1. 工具rasdaemon
1.1. 流程分析
Rasdaemon無論是(shi)以(yi)后臺(tai)服(fu)務啟(qi)動,還是(shi)以(yi)前臺(tai)方(fang)式運行,其核(he)心處理流程都是(shi)函數handle_ras_events,該函數通過ftrace機制監聽(ting)每個cpu上的(de)ras事件(jian)。
對應(ying)的(de)監控路徑是/sys/kernel/debug/tracing/instances/rasdaemon/events/。
監控范圍包括ras/mc_event、ras/aer_event、ras/non_standard_event、ras/arm_event、mce/mce_record、ras/extlog_mem_event、net/net_dev_xmit_timeout、devlink/devlink_health_report、block/block_rq_error or k/block_rq_complete、ras/memory_failure_event。
以ras/mce_record為例,rasdaemon監聽到的,實(shi)際上是內核mce_early_notifier通知處理流程(cheng)輸出的trace數據。
當監聽到期望的ras事件后,會基于ftrace的輸出格式,自動對數(shu)(shu)據進(jin)行解(jie)析并(bing)輸出,同時(shi)支持保存到數(shu)(shu)據庫文件(對應(ying)-r啟動參數(shu)(shu))。
命令”ras-mc-ctl --errors”,可用于查看保存(cun)在數(shu)據庫中的ras事件,示(shi)例如下。

新版本Rasdaemon還支持,基于針對同(tong)一地 址在一定周期(qi)內,連續(xu)出現CE錯誤并超過一定閾值(zhi)時,主動(dong)對該CE內存進行隔離處理。
相關(guan)配置信(xin)息,可通過PAGE_CE_THRESHOLD、PAGE_CE_REFRESH_CYCLE環境變量,在啟動時(shi)傳遞(di)給rasdaemon進程,默(mo)認配置(zhi)閾值每天50次。
2. 工(gong)具edac-util
2.1. 流程分析
Edac-util -r命令可用(yong)于查詢內(nei)核記錄(lu)的(de)內(nei)存(cun)故(gu)(gu)障(zhang)(zhang)(zhang)統計信(xin)息(xi),但只(zhi)能精確到那根DIMM存(cun)在(zai)故(gu)(gu)障(zhang)(zhang)(zhang)以及故(gu)(gu)障(zhang)(zhang)(zhang)的(de)次數,無(wu)法(fa)確認具(ju)體的(de)故(gu)(gu)障(zhang)(zhang)(zhang)位置。
由于(yu)這部分數據未被持(chi)久化,因此edac-util只能查詢,自設備啟動以后發生的內存故障信息。
執行流(liu)程直接遍(bian)歷并讀取(qu)內(nei)核提供(gong)的/sys/devices/system/edac/mc/mcx/*文件,進而獲取(qu)并輸(shu)出內存(cun)故障的ce/uce統計值。
雖然edac-util命令只(zhi)能查(cha)看內存故障的統計值(zhi),但是內核edac機制(zhi)會基于不同的硬(ying)件實現(xian),提供更加詳細的內存故障解碼(ma)信息,并(bing)輸(shu)出到日志文件。
同時內核edac機制還會(hui)通過(guo)trace_mc_event事件,將解碼后的故障信息上報出去,這些(xie)信息會(hui)被(bei)rasdaemon監(jian)控并保存。
3. 工具mcelog
3.1. 流程分析
Mcelog可用于直接查看或(huo)后臺監控設(she)備的(de)mce問題(ti),其監控信息(xi)可通過日志的(de)方式(shi)輸出到syslog或(huo)指定文件。
除(chu)此之外還支持用戶態(tai)自定(ding)義mce故障(zhang)處理,例(li)如內存隔離、關(guan)閉cpu等,詳見/etc/mcelog/mcelog.conf及相關(guan)trigger處理文(wen)件。
Mcelog通過/dev/mcelog和(he)內(nei)核(he)交互,/dev/mcelog內(nei)部維護了(le)一個(ge)緩存(cun)區,用于緩存(cun)已發生的mce信息,并且在(zai)讀(du)取后會(hui)被立即(ji)清理(li)。
Mcelog的(de)數據來源和(he)前面提(ti)到的(de)trace_mce_record、trace_mc_event基(ji)本一樣,都是來源于mce_register_decode_chain通(tong)知鏈。
由(you)于(yu)該(gai)通(tong)知(zhi)鏈由(you)異步work執(zhi)行,再通過(guo)trace或(huo)緩存(cun)區(qu)傳遞(di)到用戶態(tai),因此其執(zhi)行過(guo)程(cheng)不會影響mce的(de)(de)中斷處理(li)流程(cheng)。同時在嚴重的(de)(de)mce場(chang)景,也可能(neng)還沒執(zhi)行設(she)備就復(fu)位了,因此記錄的(de)(de)信息(xi)可能(neng)存(cun)在缺失(shi)。
除(chu)此之前(qian)mcelog還支持從bios erst中讀取mce信(xin)息(xi),這部(bu)分(fen)信(xin)息(xi)通常(chang)在mce發生后,在內(nei)核的mce_panic流(liu)程中,被(bei)保存到bios erst區域。
同時(shi)mcelog支持通過(guo)軟(ruan)件模擬mce錯誤,但本質上是基于mce-inject.ko的功(gong)能,而(er)mce-inject.ko自身就提供了debugfs注(zhu)入接口。其故(gu)障注(zhu)入原理是通過(guo)nmi觸發對應的cpu進入特(te)定處(chu)理流(liu)程,并(bing)調用do_machine_check處(chu)理注(zhu)入的軟(ruan)件mce故(gu)障信息(xi)。
4. 分析總結
在mce領域rasdaemon、edac-util、mcelog獲(huo)取的數據同源,都來自內核(he)mce解碼通知鏈。
其中rasdaemon監控范圍最(zui)全,包括(kuo)除mce外的多種硬件故障,同時還支持數據(ju)持久化(hua)功能。
其中edac-util只能查看內核edac機制保存的mce故(gu)障統計(ji)信息,且(qie)該(gai)功能已被rasdaemon涵(han)蓋。
其中mcelog支(zhi)持自定(ding)義(yi)(yi)(yi)mce故(gu)障(zhang)(zhang)處(chu)理(li),但未看到(dao)自定(ding)義(yi)(yi)(yi)處(chu)理(li)的明顯必要(yao)性,且現有自定(ding)義(yi)(yi)(yi)處(chu)理(li)功能已被rasdaemon涵蓋。同(tong)時mcelog還支(zhi)持從(cong)bios erst中讀取mce故(gu)障(zhang)(zhang)信息,可考慮移植該(gai)功能到(dao)rasdaemon。
z上所述(shu),建議選型rasdaemon作為(wei)系(xi)統默認ras監控(kong)服務,同時這也(ye)是(shi)業界(jie)的(de)演進趨(qu)勢。