記憶體技術:DRAM、DDR 與新興記憶體

ECC 記憶體(ECC memory)

/ ee-see-see /

想像你要用郵寄寄一個重要的數字,但你擔心途中一個污點可能把某個位數翻掉。於是你聰明地多寄幾個由這個數字算出來的檢查位數——多到足以讓收件人在某一位數寄錯時,不只能偵測到錯誤,還能算出是哪一位翻了並把它更正。ECC 記憶體對存在 DRAM 裡的資料做的正是這件事:它保有額外的檢查位元,讓偶發的位元翻轉被抓到並悄悄修好。

具體來說,ECC 記憶體在資料旁邊存了額外的冗餘位元——常見的方案是每 64 個資料位元加 8 個檢查位元(這正是為何 ECC DIMM 是 72 位元寬、而非 64)。檢查位元用一種錯誤更正碼算出(常是 SECDED 碼:單錯更正、雙錯偵測)。每次讀取時,記憶體控制器重算這個碼並比對:若有單一位元翻了,數學會即時找出並更正它;若有兩個位元翻了,它至少能偵測到出了問題、發出錯誤,而不是默默交回已損壞的資料。

為何重要:位元翻轉不是疑神疑鬼——宇宙射線、雜散輻射與電氣雜訊偶爾會把某個存著的位元翻掉(軟錯誤)。在一台筆電上那是罕見的小煩惱;但在一台有數 TB RAM、跑了好幾年的伺服器上,或一個科學計算、或一本財務帳冊中,一次無聲的翻轉可能毀掉結果或讓系統當掉,而記憶體越大、運轉越久,這類事件就越是必然。誠實的取捨:ECC 多花一點記憶體、一點錢,與一丁點延遲,這正是為何消費機器常省略它——但對於伺服器,以及任何無法接受無聲損壞的系統,ECC 是標準配備、而且值得。

一道宇宙射線把一個 64 位元字組裡的某一位元翻掉。在沒有 ECC 的機器上,程式就拿到一個錯的值、而且永遠不知道。在有 ECC 的機器上,那 8 個檢查位元讓控制器在資料被使用前找出並更正翻掉的位元——錯誤被記錄下來,但無害。

ECC 把一次無聲、無法察覺的損壞,變成一次被更正(並記錄)的無事件。

標準的 SECDED ECC 每個字組更正一位元、偵測兩位元——它不是無上限的。一次翻掉三個或更多位元的突發可以打敗它,這正是為何密集、關鍵的系統會在其上再加更強的方案(如 chipkill)。

又稱
error-correcting code memoryECC RAM錯誤更正碼記憶體