軟錯誤(soft error)
我們想像的故障大多是永久的——一條線斷了、一顆晶片燒了,就一直壞著。軟錯誤是那詭異的反面:硬體完好無損,但在某一瞬間,一個儲存的位元悄悄從 0 翻成 1 或反過來,值錯了,然而只要你把那個位元重寫一次,它此後就永遠正常運作。沒有任何東西被實體損壞。就像一本書裡的某個字母在一夜之間自己變了,然後又安安靜靜地當回普通的墨水。因為零件沒壞,軟錯誤也叫暫態故障或單事件翻轉。
它們從哪來?多半來自被丟進微小記憶體格裡的雜散電荷。一顆高能粒子——宇宙射線簇射撞上大氣層產生的中子,或晶片封裝本身微量放射性雜質放出的阿伐粒子——擊中矽,沉積的電荷足以把一個儲存節點推過門檻,翻轉它所持的位元。一個 DRAM 格或 SRAM 格用一小撮電荷代表「1」;打進或打掉夠多電荷,它現在就讀成「0」。隨著電晶體縮小,每個格子持有的電荷更少,於是翻轉所需的雜散能量更小——這讓軟錯誤成為日益嚴重、而非緩解的問題。
誠實而略令人不安的真相是:在大型系統裡,軟錯誤時時刻刻都在發生,而你無法阻止那些粒子。所以架構不去阻止翻轉;它設法抓住翻轉。同位位元能偵測單一翻轉;錯誤更正碼(ECC)則同時偵測並更正,把一個本會釀禍的錯誤化為無事(見 error-correcting-code 與 ecc-memory)。這就是為什麼伺服器與太空船用 ECC 記憶體、而便宜玩具可能不用:在資料中心規模下,數百萬個記憶體格運轉數年,悄悄的位元翻轉不是稀奇的趣聞,而是你必須設計去因應的家常事件。
2003 年比利時一場著名選舉,某位候選人記錄到不可能的票數;調查人員追查到投票機記憶體裡的單一位元翻轉——一個軟錯誤,極可能來自宇宙射線粒子——它恰好多加了 4096(2^12)票。硬體毫髮無傷;只有那一個儲存位元曾錯了一瞬間。
單一高位位元的翻轉多加了 2^12 票——正是 ECC 存在要攔下的那種無聲毀損。
重跑程式並不會「修好」軟錯誤,重開機也不代表硬體真的壞了——零件好得很。真正的危險是沒人察覺的無聲資料毀損,這正是為什麼偵測碼比表面上更重要。