可靠性、可用性和可維護性 (RAS)

本文件介紹了核心中 RAS 功能的不同方面。

RAS 概念

可靠性、可用性和可維護性 (RAS) 是伺服器上用於衡量其健壯性的概念。

可靠性

是指系統產生正確輸出的機率。

  • 通常以平均故障間隔時間 (MTBF) 衡量

  • 透過有助於避免、檢測和修復硬體故障的功能來增強

可用性

是指系統在給定時間處於執行狀態的機率

  • 通常以每單位時間的停機時間百分比衡量

  • 通常使用機制在執行時檢測和糾正硬體故障;

可服務性(或可維護性)

是指系統可以被修復或維護的簡單性和速度

  • 通常以平均修復時間 (MTBR) 衡量

改進 RAS

為了減少系統停機時間,系統應該能夠檢測硬體錯誤,並在可能的情況下在執行時糾正它們。它還應該提供機制來檢測硬體退化,以便在元件導致資料丟失或系統停機之前警告系統管理員採取更換元件的行動。

在監控措施中,最常見的包括

  • CPU – 檢測指令執行和 L1/L2/L3 快取中的錯誤;

  • 記憶體 – 新增錯誤糾正邏輯 (ECC) 來檢測和糾正錯誤;

  • I/O – 為傳輸的資料新增 CRC 校驗和;

  • 儲存 – RAID、日誌檔案系統、校驗和、自我監測、分析與報告技術 (SMART)。

透過監控錯誤檢測的發生次數,可以識別硬體錯誤的機率是否正在增加,在這種情況下,進行預防性維護以在這些錯誤可糾正時更換退化的元件。

錯誤型別

現代系統中使用的大多數機制都使用漢明碼等技術,這些技術允許在位包中的錯誤數量低於閾值時進行錯誤糾正。如果錯誤數量超過閾值,這些機制可以高度確信地指示發生了錯誤,但它們無法糾正。

此外,有時錯誤會發生在未使用的元件上。例如,當前未分配的記憶體部分。

這定義了一些錯誤類別

  • 可糾正錯誤 (CE) - 錯誤檢測機制檢測並糾正了錯誤。此類錯誤通常不是致命的,儘管某些核心機制允許系統管理員將其視為致命錯誤。

  • 不可糾正錯誤 (UE) - 發生的錯誤數量超過錯誤糾正閾值,系統無法自動糾正。

  • 致命錯誤 - 當系統關鍵元件(例如,核心的一部分被 UE 破壞)發生 UE 錯誤時,避免資料損壞的唯一可靠方法是掛起或重啟機器。

  • 非致命錯誤 - 當未使用元件(如處於斷電狀態的 CPU 或未使用的記憶體組)發生 UE 錯誤時,系統可能仍能執行,並在可用時最終用熱備件替換受影響的硬體。

    此外,當用戶空間程序發生錯誤時,也可以終止該程序並讓使用者空間重新啟動它。

處理非致命錯誤的機制通常很複雜,可能需要一些使用者空間應用程式的幫助,以便應用系統管理員所需的策略。

識別故障硬體元件

僅僅檢測硬體缺陷通常是不夠的,因為系統需要精確定位應該更換的最小可替換單元 (MRU),以使硬體再次可靠。

因此,它不僅需要錯誤日誌設施,還需要將錯誤訊息轉換為 MRU 的絲印或元件標籤的機制。

通常,這對於記憶體來說非常複雜,因為現代 CPU 交錯來自不同記憶體模組的記憶體,以提供更好的效能。DMI BIOS 通常有一個記憶體模組標籤列表,可以使用 dmidecode 工具獲取。例如,在臺式機上,它顯示

Memory Device
        Total Width: 64 bits
        Data Width: 64 bits
        Size: 16384 MB
        Form Factor: SODIMM
        Set: None
        Locator: ChannelA-DIMM0
        Bank Locator: BANK 0
        Type: DDR4
        Type Detail: Synchronous
        Speed: 2133 MHz
        Rank: 2
        Configured Clock Speed: 2133 MHz

在上面的示例中,DDR4 SO-DIMM 記憶體模組位於系統記憶體中,標記為“BANK 0”,如bank 定位器欄位所示。請注意,在此類系統中,總寬度等於資料寬度。這意味著此類記憶體模組沒有錯誤檢測/糾正機制。

不幸的是,並非所有系統都使用相同的欄位來指定記憶體組。在此示例中,來自一臺舊伺服器,dmidecode 顯示

Memory Device
        Array Handle: 0x1000
        Error Information Handle: Not Provided
        Total Width: 72 bits
        Data Width: 64 bits
        Size: 8192 MB
        Form Factor: DIMM
        Set: 1
        Locator: DIMM_A1
        Bank Locator: Not Specified
        Type: DDR3
        Type Detail: Synchronous Registered (Buffered)
        Speed: 1600 MHz
        Rank: 2
        Configured Clock Speed: 1600 MHz

在那裡,DDR3 RDIMM 記憶體模組位於系統記憶體中,標記為“DIMM_A1”,如locator欄位所示。請注意,此記憶體模組的資料寬度為 64 位,總寬度為 72 位。因此,它有 8 個額外的位用於錯誤檢測和糾正機制。這種記憶體被稱為糾錯碼記憶體 (ECC 記憶體)。

更糟糕的是,系統板上標籤不同但使用完全相同的 BIOS 的情況並不少見,這意味著 BIOS 提供的標籤與實際標籤不符。

ECC 記憶體

如前一節所述,ECC 記憶體有額外的位用於錯誤糾正。在上面的示例中,一個記憶體模組的資料寬度為 64 位,總寬度為 72 位。用於錯誤檢測和糾正機制的額外 8 位被稱為校驗字[1][2]

因此,當 CPU 請求記憶體控制器寫入一個具有資料寬度的字時,記憶體控制器使用漢明碼或其他錯誤糾正碼(如 SECDED+)即時計算校驗字,生成一個具有總寬度大小的程式碼。然後將該程式碼寫入記憶體模組。

在讀取時,總寬度位程式碼使用與寫入時相同的 ECC 程式碼轉換回來,生成一個具有資料寬度的字和一個校驗字。即使發生錯誤,具有資料寬度的字也會發送到 CPU。

記憶體控制器還會檢視校驗字以檢查是否發生了錯誤,以及 ECC 程式碼是否能夠修復該錯誤。如果錯誤被糾正,則發生了可糾正錯誤 (CE)。如果不能,則發生了不可糾正錯誤 (UE)。

關於 CE/UE 錯誤的資訊儲存在記憶體控制器的一些特殊暫存器中,可以透過讀取這些暫存器來訪問,無論是透過 BIOS、透過某些特殊 CPU 還是透過 Linux EDAC 驅動程式。在 x86 64 位 CPU 上,這些錯誤也可以透過機器檢查架構 (MCA) 檢索[3]

EDAC - 錯誤檢測和糾正

注意

“bluesmoke”是此裝置驅動子系統“樹外”並在 http://bluesmoke.sourceforge.net 維護時的名稱。該網站現在大部分已過時,只能用於歷史目的。

當該子系統首次在核心 2.6.16 中推送到上游時,它被重新命名為 EDAC

目的

edac 核心模組的目標是檢測並報告在 Linux 下執行的計算機系統中發生的硬體錯誤。

記憶體

記憶體可糾正錯誤 (CE) 和不可糾正錯誤 (UE) 是主要收集的錯誤。這些型別的錯誤由 edac_mc 裝置收集。

檢測 CE 事件,然後收集並報告這些事件,**可以**但不一定預測未來的 UE 事件。僅有 CE 事件時,系統可以並且將繼續執行,因為資料尚未損壞。

但是,對出現 CE 的記憶體模組進行預防性維護和主動部件更換可以降低發生可怕的 UE 事件和系統崩潰的可能性。

其他硬體元素

EDAC 的一項新功能,edac_device 裝置類,在核心 2.6.23 版本中新增。

這種新裝置型別允許非記憶體型別的 ECC 硬體檢測器將其狀態收集並透過 sysfs 介面呈現給使用者空間。

一些架構具有用於 L1、L2 和 L3 快取的 ECC 檢測器,以及 DMA 引擎、互連開關、主資料路徑開關、互連和其他各種硬體資料路徑。如果硬體報告了它,那麼很可能可以構建一個 edac_device 裝置來收集並將其呈現給使用者空間。

PCI 匯流排掃描

此外,PCI 裝置會掃描 PCI 匯流排奇偶校驗和 SERR 錯誤,以確定資料傳輸期間是否發生錯誤。

PCI 奇偶校驗錯誤的存在必須謹慎對待。有一些附加介面卡在奇偶校驗生成和報告方面**不**遵循 PCI 規範。該規範指出,如果供應商不打算生成奇偶校驗,則應將奇偶校驗狀態位設為 0。一些供應商不這樣做,因此奇偶校驗位可能會“浮動”,產生誤報。

sysfs 中有一個 PCI 裝置屬性,由 EDAC PCI 掃描程式碼檢查。如果該屬性已設定,則該裝置的 PCI 奇偶校驗/錯誤掃描將被跳過。該屬性是

broken_parity_status

它位於 PCI 裝置的 /sys/devices/pci<XXX>/0000:XX:YY.Z 目錄中。

版本控制

EDAC 由一個“核心”模組 (edac_core.ko) 和幾個記憶體控制器 (MC) 驅動模組組成。在給定系統上,CORE 將被載入,並且一個 MC 驅動程式將被載入。CORE 和 MC 驅動程式(或 edac_device 驅動程式)都具有反映各自模組當前釋出級別的單獨版本。

因此,要“報告”系統正在執行的版本,必須同時報告 CORE 和 MC 驅動程式的版本。

載入

如果 edac 是與核心靜態連結的,則無需載入。如果 edac 作為模組構建,則只需 modprobe 你需要的 edac 元件即可。你應該能夠 modprobe 硬體特定的模組,並讓依賴項載入必要的核心模組。

示例

$ modprobe amd76x_edac

載入 amd76x_edac.ko 記憶體控制器模組和 edac_mc.ko 核心模組。

Sysfs 介面

EDAC 提供一個 sysfs 介面用於控制和報告目的。它位於 /sys/devices/system/edac 目錄中。

此目錄中目前包含 2 個元件

mc

記憶體控制器系統

pci

PCI 控制和狀態系統

記憶體控制器 (mc) 模型

每個 mc 裝置控制一組記憶體模組[4]。這些模組以晶片選擇行 (csrowX) 和通道表 (chX) 的形式佈局。可以有多個 csrow 和多個通道。

記憶體控制器允許使用多個 csrow,其中 8 個 csrow 是典型值。然而,csrow 的實際數量取決於給定主機板、記憶體控制器和記憶體模組特性的佈局。

雙通道允許雙資料長度(例如,在 64 位系統上為 128 位)資料在 CPU 和記憶體之間傳輸。一些較新的晶片組允許超過 2 個通道,例如全緩衝 DIMM (FB-DIMM) 記憶體控制器。以下示例將假設 2 個通道

CS 行

通道

ch0

ch1

DIMM_A0

DIMM_B0

csrow0

rank0

rank0

csrow1

rank1

rank1

DIMM_A1

DIMM_B1

csrow2

rank0

rank0

csrow3

rank1

rank1

在上述示例中,主機板上有 4 個用於記憶體 DIMM 的物理插槽

DIMM_A0

DIMM_B0

DIMM_A1

DIMM_B1

這些插槽的標籤通常在主機板上絲印。在此示例中,標記為 A 的插槽是通道 0。標記為 B 的插槽是通道 1。請注意,一個物理 DIMM 上可能有兩個 csrow。這些 csrow 根據記憶體 DIMM 插入的插槽分配其 csrow 編號。因此,當每個通道放置一個 DIMM 時,csrow 跨越兩個 DIMM。

記憶體 DIMM 有單“邏輯行”或雙“邏輯行”之分。邏輯行是已填充的 csrow。在上述示例中,兩個雙邏輯行 DIMM 以類似方式放置。因此,csrow0 和 csrow1 都已填充。另一方面,當兩個單邏輯行 DIMM 放置在插槽 DIMM_A0 和 DIMM_B0 中時,它們將只有一個 csrow (csrow0),而 csrow1 將為空。此模式對 csrow2 和 csrow3 重複。另請注意,某些記憶體控制器沒有任何邏輯來識別記憶體模組,請參閱下面的 rankX 目錄。

上述表示反映在 EDAC 的 sysfs 介面中的目錄樹中。從目錄 /sys/devices/system/edac/mc 開始,每個記憶體控制器將由其自己的 mcX 目錄表示,其中 X 是 MC 的索引

..../edac/mc/
           |
           |->mc0
           |->mc1
           |->mc2
           ....

在每個 mcX 目錄下,每個 csrowX 再次由 csrowX 表示,其中 X 是 csrow 索引

.../mc/mc0/
        |
        |->csrow0
        |->csrow2
        |->csrow3
        ....

請注意,沒有 csrow1,這表明 csrow0 由單個邏輯行 DIMM 組成。這也應該適用於兩個通道,以使雙通道模式正常執行。由於 csrow2 和 csrow3 都已填充,這表明通道 0 和 1 具有雙邏輯行 DIMM 組。

在每個 mcXcsrowX 目錄中都有幾個 EDAC 控制和屬性檔案。

mcX 目錄

mcX 目錄中是此記憶體控制器 X 例項的 EDAC 控制和屬性檔案。

有關 sysfs API 的說明,請參閱

dimmXrankX 目錄

使用 EDAC 子系統的推薦方法是檢視 dimmXrankX 目錄提供的資訊[5]

一個典型的 EDAC 系統在 /sys/devices/system/edac/ 下具有以下結構[6]

/sys/devices/system/edac/
├── mc
│   ├── mc0
│   │   ├── ce_count
│   │   ├── ce_noinfo_count
│   │   ├── dimm0
│   │   │   ├── dimm_ce_count
│   │   │   ├── dimm_dev_type
│   │   │   ├── dimm_edac_mode
│   │   │   ├── dimm_label
│   │   │   ├── dimm_location
│   │   │   ├── dimm_mem_type
│   │   │   ├── dimm_ue_count
│   │   │   ├── size
│   │   │   └── uevent
│   │   ├── max_location
│   │   ├── mc_name
│   │   ├── reset_counters
│   │   ├── seconds_since_reset
│   │   ├── size_mb
│   │   ├── ue_count
│   │   ├── ue_noinfo_count
│   │   └── uevent
│   ├── mc1
│   │   ├── ce_count
│   │   ├── ce_noinfo_count
│   │   ├── dimm0
│   │   │   ├── dimm_ce_count
│   │   │   ├── dimm_dev_type
│   │   │   ├── dimm_edac_mode
│   │   │   ├── dimm_label
│   │   │   ├── dimm_location
│   │   │   ├── dimm_mem_type
│   │   │   ├── dimm_ue_count
│   │   │   ├── size
│   │   │   └── uevent
│   │   ├── max_location
│   │   ├── mc_name
│   │   ├── reset_counters
│   │   ├── seconds_since_reset
│   │   ├── size_mb
│   │   ├── ue_count
│   │   ├── ue_noinfo_count
│   │   └── uevent
│   └── uevent
└── uevent

dimmX 目錄中是此 X 記憶體模組的 EDAC 控制和屬性檔案

  • size - 此 csrow 屬性檔案管理的記憶體總大小

    此屬性檔案以兆位元組為單位顯示此 csrow 包含的記憶體大小。

  • dimm_ue_count - 不可糾正錯誤計數屬性檔案

    此屬性檔案顯示此 DIMM 上發生不可糾正錯誤的總計數。如果設定了 panic_on_ue,則此計數器將沒有機會遞增,因為 EDAC 會使系統崩潰。

  • dimm_ce_count - 可糾正錯誤計數屬性檔案

    此屬性檔案顯示此 DIMM 上發生可糾正錯誤的總計數。此計數檢查非常重要。CEs 提供了 DIMM 開始出現故障的早期跡象。此計數字段應監控非零值並向系統管理員報告此類資訊。

  • dimm_dev_type - 裝置型別屬性檔案

    此屬性檔案將顯示此 DIMM 上正在使用的 DRAM 裝置型別。示例

    • x1

    • x2

    • x4

    • x8

  • dimm_edac_mode - EDAC 執行模式屬性檔案

    此屬性檔案將顯示正在使用的錯誤檢測和糾正型別。

  • dimm_label - 記憶體模組標籤控制檔案

    此控制檔案允許為此 DIMM 分配一個標籤。有了模組中的此標籤,當發生錯誤時,輸出可以在系統日誌中提供 DIMM 標籤。這對於恐慌事件隔離 UE 事件的原因至關重要。

    DIMM 標籤必須在啟動後分配,並帶有正確標識物理插槽及其絲印標籤的資訊。此資訊目前非常依賴於主機板,並且此資訊的確定必須在此刻在使用者空間中進行。

  • dimm_location - 記憶體模組位置

    位置可以有最多 3 個級別,並描述記憶體控制器如何識別記憶體模組的位置。根據記憶體和記憶體控制器的型別,它可以是

    • csrowchannel - 當記憶體控制器無法識別單個 DIMM 時使用 - 例如在 rankX 目錄中;

    • branch, channel, slot - 通常用於 FB-DIMM 記憶體控制器;

    • channel, slot - 用於 Nehalem 和更新的 Intel 驅動程式。

  • dimm_mem_type - 記憶體型別屬性檔案

    此屬性檔案將顯示此 csrow 上當前的記憶體型別。通常是緩衝或非緩衝記憶體。示例

    • 註冊式 DDR

    • 非緩衝式 DDR

csrowX 目錄

當 CONFIG_EDAC_LEGACY_SYSFS 啟用時,sysfs 將包含 csrowX 目錄。由於此 API 對 Rambus、FB-DIMM 和現代 Intel 記憶體控制器不能正常工作,因此正在棄用,轉而使用 dimmX 目錄。

csrowX 目錄中是此 csrow X 例項的 EDAC 控制和屬性檔案

  • ue_count - 不可糾正錯誤總數屬性檔案

    此屬性檔案顯示此 csrow 上發生的不可糾正錯誤的總計數。如果設定了 panic_on_ue,則此計數器將沒有機會遞增,因為 EDAC 會使系統崩潰。

  • ce_count - 可糾正錯誤總數屬性檔案

    此屬性檔案顯示此 csrow 上發生的可糾正錯誤的總計數。此計數檢查非常重要。CEs 提供了 DIMM 開始出現故障的早期跡象。此計數字段應監控非零值並向系統管理員報告此類資訊。

  • size_mb - 此 csrow 屬性檔案管理的記憶體總大小

    此屬性檔案以兆位元組為單位顯示此 csrow 包含的記憶體大小。

  • mem_type - 記憶體型別屬性檔案

    此屬性檔案將顯示此 csrow 上當前的記憶體型別。通常是緩衝或非緩衝記憶體。示例

    • 註冊式 DDR

    • 非緩衝式 DDR

  • edac_mode - EDAC 執行模式屬性檔案

    此屬性檔案將顯示正在使用的錯誤檢測和糾正型別。

  • dev_type - 裝置型別屬性檔案

    此屬性檔案將顯示此 DIMM 上正在使用的 DRAM 裝置型別。示例

    • x1

    • x2

    • x4

    • x8

  • ch0_ce_count - 通道 0 CE 計數屬性檔案

    此屬性檔案將顯示通道 0 中此 DIMM 上的 CE 計數。

  • ch0_ue_count - 通道 0 UE 計數屬性檔案

    此屬性檔案將顯示通道 0 中此 DIMM 上的 UE 計數。

  • ch0_dimm_label - 通道 0 DIMM 標籤控制檔案

    此控制檔案允許為此 DIMM 分配一個標籤。有了模組中的此標籤,當發生錯誤時,輸出可以在系統日誌中提供 DIMM 標籤。這對於恐慌事件隔離 UE 事件的原因至關重要。

    DIMM 標籤必須在啟動後分配,並帶有正確標識物理插槽及其絲印標籤的資訊。此資訊目前非常依賴於主機板,並且此資訊的確定必須在此刻在使用者空間中進行。

  • ch1_ce_count - 通道 1 CE 計數屬性檔案

    此屬性檔案將顯示通道 1 中此 DIMM 上的 CE 計數。

  • ch1_ue_count - 通道 1 UE 計數屬性檔案

    此屬性檔案將顯示通道 0 中此 DIMM 上的 UE 計數。

  • ch1_dimm_label - 通道 1 DIMM 標籤控制檔案

    此控制檔案允許為此 DIMM 分配一個標籤。有了模組中的此標籤,當發生錯誤時,輸出可以在系統日誌中提供 DIMM 標籤。這對於恐慌事件隔離 UE 事件的原因至關重要。

    DIMM 標籤必須在啟動後分配,並帶有正確標識物理插槽及其絲印標籤的資訊。此資訊目前非常依賴於主機板,並且此資訊的確定必須在此刻在使用者空間中進行。

系統日誌

如果啟用了 UE 和 CE 的日誌記錄,則系統日誌將包含指示已檢測到錯誤的資訊

EDAC MC0: CE page 0x283, offset 0xce0, grain 8, syndrome 0x6ec3, row 0, channel 1 "DIMM_B1": amd76x_edac
EDAC MC0: CE page 0x1e5, offset 0xfb0, grain 8, syndrome 0xb741, row 0, channel 1 "DIMM_B1": amd76x_edac

訊息結構為

內容

示例

記憶體控制器

MC0

錯誤型別

CE

記憶體頁

0x283

頁內偏移

0xce0

錯誤的位元組粒度或解析度

粒度 8

錯誤校驗字

0xb741

記憶體行

行 0

記憶體通道

通道 1

DIMM 標籤(如果已設定)

DIMM B1

然後是一個可選的、驅動程式特定的訊息,可能包含額外資訊。

UE 和 CE 如果沒有資訊,將僅缺少記憶體控制器、錯誤型別、“無資訊”通知以及可選的、驅動程式特定的錯誤訊息。

PCI 匯流排奇偶校驗檢測

對於報頭型別 00 裝置,無論裝置是否啟用了奇偶校驗,都會檢查主狀態是否存在任何奇偶校驗錯誤。(規範表明在某些情況下會生成奇偶校驗)。對於報頭型別 01 網橋,還會檢查次狀態暫存器,以檢視橋另一側的總線上是否發生了奇偶校驗。

Sysfs 配置

/sys/devices/system/edac/pci 下是控制和屬性檔案,如下所示

  • check_pci_parity - 啟用/停用 PCI 奇偶校驗檢查控制檔案

    此控制檔案啟用或停用 PCI 匯流排奇偶校驗掃描操作。向此檔案寫入 1 啟用掃描。向此檔案寫入 0 停用掃描。

    啟用

    echo "1" >/sys/devices/system/edac/pci/check_pci_parity
    

    停用

    echo "0" >/sys/devices/system/edac/pci/check_pci_parity
    
  • pci_parity_count - 奇偶校驗計數

    此屬性檔案將顯示已檢測到的奇偶校驗錯誤數。

模組引數

  • edac_mc_panic_on_ue - 在 UE 時恐慌控制檔案

    不可糾正的錯誤將導致機器恐慌。這通常是可取的。當發生不可糾正的錯誤時繼續執行不是一個好主意——無法確定什麼未被糾正,並且作業系統上下文可能被嚴重破壞,導致進一步損壞。如果核心配置了 MCE,則 EDAC 將永遠不會注意到 UE。

    載入時

    module/kernel parameter: edac_mc_panic_on_ue=[0|1]
    

    執行時

    echo "1" > /sys/module/edac_core/parameters/edac_mc_panic_on_ue
    
  • edac_mc_log_ue - 記錄 UE 控制檔案

    生成描述不可糾正錯誤的核心訊息。這些錯誤透過系統訊息日誌系統報告。即使停用 UE 日誌記錄,UE 統計資訊也會累積。

    載入時

    module/kernel parameter: edac_mc_log_ue=[0|1]
    

    執行時

    echo "1" > /sys/module/edac_core/parameters/edac_mc_log_ue
    
  • edac_mc_log_ce - 記錄 CE 控制檔案

    生成描述可糾正錯誤的核心訊息。這些錯誤透過系統訊息日誌系統報告。即使停用 CE 日誌記錄,CE 統計資訊也會累積。

    載入時

    module/kernel parameter: edac_mc_log_ce=[0|1]
    

    執行時

    echo "1" > /sys/module/edac_core/parameters/edac_mc_log_ce
    
  • edac_mc_poll_msec - 輪詢週期控制檔案

    輪詢錯誤資訊的時間週期(以毫秒為單位)。過小的值會浪費資源。過大的值可能會延遲必要的錯誤處理,並可能丟失定位錯誤的有價值資訊。當前預設值為 1000 毫秒(每秒一次)。需要所有可用頻寬的系統可以增加此值。

    載入時

    module/kernel parameter: edac_mc_poll_msec=[0|1]
    

    執行時

    echo "1000" > /sys/module/edac_core/parameters/edac_mc_poll_msec
    
  • panic_on_pci_parity - 在 PCI 奇偶校驗錯誤時恐慌

    此控制檔案啟用或停用在檢測到奇偶校驗錯誤時進行恐慌。

    模組/核心引數

    edac_panic_on_pci_pe=[0|1]
    

    啟用

    echo "1" > /sys/module/edac_core/parameters/edac_panic_on_pci_pe
    

    停用

    echo "0" > /sys/module/edac_core/parameters/edac_panic_on_pci_pe
    

EDAC 裝置型別

在標頭檔案 edac_pci.h 中,有一系列用於 EDAC_DEVICE 的 edac_device 結構和 API。

使用者空間透過 sysfs 介面訪問 edac_device。

在位置 /sys/devices/system/edac (sysfs) 將出現新的 edac_device 裝置。

在上述 edac 目錄下有三層樹。例如,test_device_edac 裝置(可在 http://bluesmoke.sourceforget.net 網站找到)將自身安裝為

/sys/devices/system/edac/test-instance

此目錄中有各種控制元件、一個符號連結和一個或多個 instance 目錄。

標準預設控制元件是

log_ce

記錄 CE 事件的布林值

log_ue

記錄 UE 事件的布林值

panic_on_ue

如果遇到 UE,則使系統 panic 的布林值(預設關閉,可透過啟動指令碼設定為 true)

poll_msec

事件輪詢週期

test_device_edac 裝置至少添加了一個自己的自定義控制元件

test_bits

在當前測試驅動程式中,它什麼也不做,只是展示了它是如何安裝的。移植的驅動程式可以新增一個或多個此類控制元件和/或屬性以供特定用途。一個樹外驅動程式使用這裡的控制元件允許對硬體注入暫存器進行錯誤注入操作

符號連結指向為此 edac_device 註冊的“struct dev”。

例項

存在一個或多個例項目錄。對於 test_device_edac 情況

test-instance0

此目錄中有兩個預設計數器屬性,它們是更深層子目錄中計數器的總和。

ce_count

子目錄的 CE 事件總數

ue_count

子目錄的 UE 事件總數

最低目錄級別是 block 目錄。每個例項中可以指定 0、1 或更多塊

test-block0

此目錄中的預設屬性是

ce_count

這是此受監控硬體 block 的 CE 事件計數器

ue_count

這是此受監控硬體 block 的 UE 事件計數器

test_device_edac 裝置添加了 4 個屬性和 1 個控制

test-block-bits-0

每個輪詢週期此計數器遞增

test-block-bits-1

每 10 個週期,此計數器遞增一次,test-block-bits-0 設定為 0

test-block-bits-2

每 100 個週期,此計數器遞增一次,test-block-bits-1 設定為 0

test-block-bits-3

每 1000 個週期,此計數器遞增一次,test-block-bits-2 設定為 0

reset-counters

向此控制元件寫入任何內容都將重置所有上述計數器。

使用 test_device_edac 驅動程式應該使其他人能夠為他們的硬體系統建立自己的獨特驅動程式。

test_device_edac 示例驅動程式位於 EDAC 專案網站 http://bluesmoke.sourceforge.net

在 Nehalem 和更新的 Intel CPU 上使用 EDAC API

在較舊的 Intel 架構上,記憶體控制器是北橋晶片組的一部分。Nehalem、Sandy Bridge、Ivy Bridge、Haswell、Sky Lake 和更新的 Intel 架構將增強版記憶體控制器 (MC) 整合到 CPU 內部。

本章將介紹在較新 Intel CPU 上發現的增強型記憶體控制器(例如 i7core_edacsb_edacsbx_edac 驅動程式)的差異。

注意

Xeon E7 處理器系列使用獨立的晶片作為記憶體控制器,稱為 Intel 可擴充套件記憶體緩衝區。本節不適用於此類系列。

  1. 每個快速補丁互連 (QPI) 有一個記憶體控制器。在驅動程式中,“socket”表示一個 QPI。這與物理 CPU 插槽相關聯。

    每個 MC 有 3 個物理讀取通道、3 個物理寫入通道和 3 個邏輯通道。驅動程式目前將其視為只有 3 個通道。每個通道最多可以有 3 個 DIMM。

    已知的最小單元是 DIMM。沒有關於 csrow 的資訊。由於 EDAC API 將最小單元對映為 csrow,驅動程式將通道/DIMM 順序對映到不同的 csrow 中。

    例如,假設以下佈局

    Ch0 phy rd0, wr0 (0x063f4031): 2 ranks, UDIMMs
      dimm 0 1024 Mb offset: 0, bank: 8, rank: 1, row: 0x4000, col: 0x400
      dimm 1 1024 Mb offset: 4, bank: 8, rank: 1, row: 0x4000, col: 0x400
    Ch1 phy rd1, wr1 (0x063f4031): 2 ranks, UDIMMs
      dimm 0 1024 Mb offset: 0, bank: 8, rank: 1, row: 0x4000, col: 0x400
    Ch2 phy rd3, wr3 (0x063f4031): 2 ranks, UDIMMs
      dimm 0 1024 Mb offset: 0, bank: 8, rank: 1, row: 0x4000, col: 0x400
    

    驅動程式將它對映為

    csrow0: channel 0, dimm0
    csrow1: channel 0, dimm1
    csrow2: channel 1, dimm0
    csrow3: channel 2, dimm0
    

    每個 csrow 匯出一個 DIMM。

    每個 QPI 都作為不同的記憶體控制器匯出。

  2. MC 具有注入錯誤以測試驅動程式的能力。驅動程式透過一些錯誤注入節點實現此功能

    為了注入記憶體錯誤,在 /sys/devices/system/edac/mc/mc?/ 下有一些 sysfs 節點

    • inject_addrmatch/*:

      控制錯誤注入掩碼暫存器。可以指定要匹配錯誤程式碼的地址的幾個特性

      dimm = the affected dimm. Numbers are relative to a channel;
      rank = the memory rank;
      channel = the channel that will generate an error;
      bank = the affected bank;
      page = the page address;
      column (or col) = the address column.
      

      上述每個值都可以設定為“any”以匹配任何有效值。

      在驅動程式初始化時,所有值都設定為 any。

      例如,要在 DIMM 2 的邏輯行 1 上生成錯誤,適用於任何通道、任何 bank、任何頁、任何列

              echo 2 >/sys/devices/system/edac/mc/mc0/inject_addrmatch/dimm
              echo 1 >/sys/devices/system/edac/mc/mc0/inject_addrmatch/rank
      
      To return to the default behaviour of matching any, you can do::
      
              echo any >/sys/devices/system/edac/mc/mc0/inject_addrmatch/dimm
              echo any >/sys/devices/system/edac/mc/mc0/inject_addrmatch/rank
      
    • inject_eccmask:

      指定哪些位將出現問題,

    • inject_section:

      指定哪個 ECC 快取區將出現錯誤

      3 for both
      2 for the highest
      1 for the lowest
      
    • inject_type:

      指定錯誤型別,是以下位的組合

      bit 0 - repeat
      bit 1 - ecc
      bit 2 - parity
      
    • inject_enable:

      當寫入非 0 值時開始錯誤生成。

    所有注入變數都可以讀取。寫入需要 root 許可權。

    資料手冊指出,錯誤只會在寫入與 inject_addrmatch 匹配的地址後生成。但是,看起來讀取也會產生錯誤。

    例如,以下程式碼將在 socket 0 上任何寫入訪問通道 2 上的任何 DIMM/地址時生成錯誤

    echo 2 >/sys/devices/system/edac/mc/mc0/inject_addrmatch/channel
    echo 2 >/sys/devices/system/edac/mc/mc0/inject_type
    echo 64 >/sys/devices/system/edac/mc/mc0/inject_eccmask
    echo 3 >/sys/devices/system/edac/mc/mc0/inject_section
    echo 1 >/sys/devices/system/edac/mc/mc0/inject_enable
    dd if=/dev/mem of=/dev/null seek=16k bs=4k count=1 >& /dev/null
    

    對於 socket 1,需要將上述命令中的“mc0”替換為“mc1”。

    生成的錯誤訊息將如下所示

    EDAC MC0: UE row 0, channel-a= 0 channel-b= 0 labels "-": NON_FATAL (addr = 0x0075b980, socket=0, Dimm=0, Channel=2, syndrome=0x00000040, count=1, Err=8c0000400001009f:4000080482 (read error: read ECC error))
    
  3. 可糾正錯誤記憶體暫存器計數器

    這些較新的 MC 具有一些計數記憶體錯誤的暫存器。驅動程式使用這些暫存器來報告具有註冊式 DIMM 的裝置上的可糾正錯誤。

    然而,這些計數器不適用於非註冊式 DIMM。由於晶片組提供了一些也適用於 UDIMM 的計數器(但粒度級別比預設計數器差),因此驅動程式為 UDIMM 記憶體公開了這些暫存器。

    可以透過檢視 all_channel_counts/ 的內容來讀取它們

    $ for i in /sys/devices/system/edac/mc/mc0/all_channel_counts/*; do echo $i; cat $i; done
       /sys/devices/system/edac/mc/mc0/all_channel_counts/udimm0
       0
       /sys/devices/system/edac/mc/mc0/all_channel_counts/udimm1
       0
       /sys/devices/system/edac/mc/mc0/all_channel_counts/udimm2
       0
    

    這裡發生的情況是,不同 csrow 但相同 dimm 編號的錯誤將使相同的計數器遞增。因此,在此記憶體對映中

    csrow0: channel 0, dimm0
    csrow1: channel 0, dimm1
    csrow2: channel 1, dimm0
    csrow3: channel 2, dimm0
    

    硬體將對 csrow0、csrow2 或 csrow3 中第一個 dimm 上的錯誤遞增 udimm0;

    硬體將對 csrow0、csrow2 或 csrow3 中第二個 dimm 上的錯誤遞增 udimm1;

    硬體將對 csrow0、csrow2 或 csrow3 中第三個 dimm 上的錯誤遞增 udimm2;

  4. 標準錯誤計數器

    當驅動程式收到 mcelog 錯誤時,會生成標準錯誤計數器。由於使用 UDIMM 時,這是由軟體計數的,因此可能會丟失一些錯誤。對於 RDIMM,它們顯示暫存器的內容

amd64_edac 中使用的參考文件

amd64_edac 模組基於以下文件(可從 http://support.amd.com/en-us/search/tech-docs 獲取)

  1. 標題:

    AMD Athlon 64 和 AMD Opteron 處理器 BIOS 和核心開發者指南

    AMD 出版號:

    26094

    修訂版:

    3.26

    連結:

    http://support.amd.com/TechDocs/26094.PDF

  2. 標題:

    AMD NPT Family 0Fh 處理器 BIOS 和核心開發者指南

    AMD 出版號:

    32559

    修訂版:

    3.00

    釋出日期:

    2006 年 5 月

    連結:

    http://support.amd.com/TechDocs/32559.pdf

  3. 標題:

    AMD Family 10h 處理器 BIOS 和核心開發者指南 (BKDG)

    AMD 出版號:

    31116

    修訂版:

    3.00

    釋出日期:

    2007 年 9 月 7 日

    連結:

    http://support.amd.com/TechDocs/31116.pdf

  4. 標題:

    AMD Family 15h Models 30h-3Fh 處理器 BIOS 和核心開發者指南 (BKDG)

    AMD 出版號:

    49125

    修訂版:

    3.06

    釋出日期:

    2015/2/12(最新版本)

    連結:

    http://support.amd.com/TechDocs/49125_15h_Models_30h-3Fh_BKDG.pdf

  5. 標題:

    AMD Family 15h Models 60h-6Fh 處理器 BIOS 和核心開發者指南 (BKDG)

    AMD 出版號:

    50742

    修訂版:

    3.01

    釋出日期:

    2015/7/23(最新版本)

    連結:

    http://support.amd.com/TechDocs/50742_15h_Models_60h-6Fh_BKDG.pdf

  6. 標題:

    AMD Family 16h Models 00h-0Fh 處理器 BIOS 和核心開發者指南 (BKDG)

    AMD 出版號:

    48751

    修訂版:

    3.03

    釋出日期:

    2015/2/23(最新版本)

    連結:

    http://support.amd.com/TechDocs/48751_16h_bkdg.pdf

致謝

  • 撰寫者:Doug Thompson <dougthompson@xmission.com>

    • 2005 年 12 月 7 日

    • 2007 年 7 月 17 日更新

  • © Mauro Carvalho Chehab

    • 2009 年 8 月 5 日 Nehalem 介面

    • 2016 年 10 月 26 日 轉換為 ReST 並清理 Nehalem 部分

  • EDAC 作者/維護者

    • Doug Thompson, Dave Jiang, Dave Peterson 等人,

    • Mauro Carvalho Chehab

    • Borislav Petkov

    • 原始作者: Thayne Harbaugh