如何在 Linux 中啟用和驗證 ECC RAM 清理?
我購買了我的第一個帶有 ECC RAM 的系統,並試圖了解它在 Linux 中警報和維護的可能性。具體來說,是Super Micro H8SGL主機板上的Debian Linux ,配備AMD Opteron 6386 SE CPU 和三星 M393B2G70QH0-YK0 DDR3 ECC RAM。
我了解到可以擦洗ECC RAM,這聽起來是個好主意。ECC RAM 可以正常修復1 位錯誤和檢測2 位錯誤。清理涉及定期讀取 RAM 以在 1 位錯誤結束之前搶先修復 2 位錯誤。
我還了解到 Linux 支持這一點,但是我在使用它時遇到了問題,所以我需要一些幫助才能開始並弄清楚設置。
Linux EDAC 驅動程序
據我了解,Linux 使用稱為 EDAC 的子系統處理 ECC RAM,其控制項在
/sys/devices/system/edac/
. 我可以在這裡看到我的兩個記憶體控制器(2 個節點 NUMA):# ls /sys/devices/system/edac/mc/ mc0 mc1 power subsystem uevent
我還可以看到 EDAC 驅動程序以某種方式載入:
# edac-util --status edac-util: EDAC drivers are loaded. 2 MCs detected # lsmod | grep edac amd64_edac_mod 36864 0 edac_mce_amd 28672 1 amd64_edac_mod
現在我想啟用擦洗。根據Linux ABI 文件,清理率通過
/sys/devices/system/edac/mc/mc*/sdram_scrub_rate
文件公開,記錄如下:記憶體控制器使用的清理速率是通過將最小頻寬(以字節/秒為單位)寫入屬性文件來設置的。該比率將被轉換為一個至少給出指定比率的內部值。讀取文件將返回實際使用的清理率。如果配置失敗或沒有執行記憶體清理,則屬性文件的值為-1。
但是當我這樣做時,什麼也沒有發生。將一個合理的值(在檢查原始碼和CPU 文件時位於中間的某個位置)寫入文件似乎可行,但
0
在讀取文件時它總是返回:# cat /sys/devices/system/edac/mc/mc0/sdram_scrub_rate 0 # echo 1000000 >/sys/devices/system/edac/mc/mc0/sdram_scrub_rate # echo $? 0 # cat /sys/devices/system/edac/mc/mc0/sdram_scrub_rate 0
在深入探勘之後,我錯過了什麼?
BIOS ECC 配置
我還嘗試了 BIOS 中的不同設置。BIOS 中有一個用於 ECC 配置的選項,但它們都對從 linux 可見的清理率沒有任何影響:
現在我正在嘗試
User
設置,但我真的看不出它們之間有什麼區別。
這是一個核心錯誤
這正是控制設置的方式,但核心中存在一個錯誤,導致硬體的讀數始終為該 CPU 返回 0。
修復它的更新檔已經排隊,但我不知道它什麼時候會滲透到主核心中。當它發生時,我可能會更新答案。
應用更新檔後,問題中使用的命令的輸出為:
# echo 1000000 >/sys/devices/system/edac/mc/mc0/sdram_scrub_rate # echo $? 0 # cat /sys/devices/system/edac/mc/mc0/sdram_scrub_rate 781440
781440 是記憶體控制器
mc0
每秒清理的字節數,量化為請求的 1000000 中最接近的可能值。