Linux-Kernel

如何在 Linux 中啟用和驗證 ECC RAM 清理?

  • June 24, 2020

我購買了我的第一個帶有 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 中最接近的可能值。

引用自:https://unix.stackexchange.com/questions/593060