架構安全與可靠性

故障、錯誤與失效(faults, errors, and failures)

這三個詞常被混用,但可靠度工程師把它們分得很清楚,而這個區分確實有用。想像橋纜裡形成一道微小的裂縫(故障,fault)。它可能無害地待在那裡好幾年。某天在重載下,一股鋼絲真的斷了(錯誤,error——系統現在處於錯誤的內部狀態)。若斷的股數夠多,橋就再也承載不了車流(失效,failure——使用者仰賴的服務不再被提供)。故障是起因,錯誤是錯誤的狀態,失效是看得見的正確服務喪失。

在硬體裡:故障是一個缺陷或擾動——卡住的電晶體、製造瑕疵,或擊中記憶體格的宇宙射線。故障在被觸發前只是潛伏的。當故障在某個暫存器、快取列或記憶體字組裡產生了一個真正錯誤的值,系統就持有了一個錯誤:它的內部狀態不再是該有的樣子。只有當那個錯誤一路傳播出去、影響到使用者所觀察到的服務——當機、回傳錯誤答案、畫面凍結——才發生失效。這條鏈是故障導致錯誤、錯誤導致失效,而關鍵在於每一個箭頭都可以被打斷。

為什麼要執著於這個區分?因為可靠的設計正是靠在每一環打斷這條鏈。你可以預防故障(更好的製程、屏蔽),可以容忍錯誤讓它永遠變不成失效(默默修好翻轉位元的錯誤更正碼、靠表決剔除錯誤副本的冗餘),或者把失效圍堵在局部(隔離、優雅降級)。一個翻轉的位元(變成錯誤的故障)只要被 ECC 抓到並更正,就不必傳到使用者面前(見 error-correcting-code)。架構安全與可靠的大部分內容,就是在故障浮現為失效之前把它攔住的藝術。

一道宇宙射線翻轉了某個 DRAM 格裡的位元(故障)。當 CPU 讀那個字組時,載入了錯誤的值(錯誤)。若記憶體有 ECC,編碼會偵測並更正這次翻轉,程式根本看不到任何異常——鏈在「錯誤」這一段就被打斷,不會發生失效。沒有 ECC 的話,那個錯誤值可能讓程式當機或弄壞檔案(失效)。

故障到錯誤到失效——ECC 在中間打斷鏈,讓翻轉的位元永遠不會變成看得見的失效。

並非每個故障都會變成失效,而這道落差正是整場較量的所在。把三者當同義詞,會恰好遮蔽掉真正贏得可靠度的地方——錯誤的偵測與更正。

又稱
fault-error-failure chain故障-錯誤-失效鏈