我們現在討論內部根本原因,主要是韌體錯誤和裝置錯誤/磨損。我們根據硬體型別(SSD、磁碟、記憶體、網路和處理器)組織討論。
4.1 SSD
韌體錯誤和NAND快閃記憶體管理複雜性可能會觸發SSD的亞健康故障。
韌體錯誤:我們收到了三份關於SSD韌體錯誤的報告,供應商承認了這一點。首先,許多本應只需要幾十微秒的單個IOs被精確地限制在250微秒的倍數,高達2-3毫秒。更糟糕的是,在另一份報告中,一批壞的SSD在幾秒鐘內停止響應,然後恢復。如前所述,操作員發現一些SSD從系統中“消失”,隨後又重新出現。經供應商檢查,SSD正在執行一些內部元資料寫入,觸發硬體斷言故障並重新啟動裝置。在所有這些情況下,沒有解釋韌體行為如此的原因(專有原因)。然而,下面的其他事件顯示了更多的潛在問題。
使用不同電壓進行讀取重試:為了讀取快閃記憶體頁,SSD控制器必須設定特定的電壓閾值。隨著快閃記憶體晶片的磨損,氧化物柵極中的電荷減弱,使得預設電壓閾值的讀取操作失敗,迫使控制器繼續以不同的電壓閾值重試讀取[10,11]。我們在現場觀察到高達4次重試。
基於RAIN/奇偶校驗的讀取重建:此外,如果資料無法讀取(即完全損壞且未透過ECC檢查),SSD必須使用RAIN(NAND級RAID)重建頁面[1,41]。有三個因素會使情況變得更糟。首先,如果RAIN寬度為N,N−1必須生成其他讀取以重建損壞的頁面。第二,N−1如上所述,讀取也可能會經歷讀取重試。第三,較新的基於TLC的SSD使用LDPC碼[40],這需要較長的時間來重建錯誤頁面。我們觀察到,這種重建問題經常發生在接近壽命結束的裝置中。此外,SSD工程師發現位翻轉的數量是上一次寫入時間、上一次寫入後的讀取次數、快閃記憶體溫度和快閃記憶體磨損量的複雜函式。
部分失敗的SSD中存在嚴重的GC:NAND快閃記憶體頁的垃圾收集(GC)已知是違反使用者SLA的主要原因[23、28、41]。然而,在現代資料中心SSD中,更高階的韌體成功地減少了對使用者的GC影響。實際上,有些SSD附帶了“壞”晶片。我們看到,隨著更多晶片死亡,過度配置區域的大小會減小,從而更頻繁地觸發GC,產生無法隱藏的影響。
透過次優磨損均衡破壞並行性:理想情況下,大型IO對映到並行通道/晶片,從而提高IO並行性。但是,磨損均衡(熱/冷頁面遷移到熱/冷塊)會導致LPN到PPN的對映始終發生變化。已經觀察到,一些罕見的工作負載行為可能會使磨損均衡演算法不理想,從而使順序LPN對映到相同的通道/晶片後面(並行性較低)。此外,上述不良頁面/晶片的問題還迫使磨損均衡演算法進行次優、並行性較差的頁面/塊對映。
高溫導致磨損、重複擦除和空間減少:高溫可歸因於外部原因(§5.1),但可導致SSD內部發生連鎖反應[31]。我們還觀察到,隨著溫度的升高,SSD頁面磨損更快,並且當SSD在更高溫度下執行時,存在電壓閾值建模失效的情況。因此,在塊擦除後,位沒有正確復位(並非所有位都變為“1”)。因此,某些塊必須多次擦除。請注意,擦除時間已經很長(例如,高達6毫秒),因此重複擦除會導致明顯的亞健康緩慢行為。更糟糕的是,由於一些塊在多次嘗試後無法正確重置,韌體將這些塊標記為不可用,從而減少了過度配置的空間,並隨後增加了GCs的頻率,如上所述。
寫放大:更快的磨損和更頻繁的GCs可導致更高的寫放大。值得報告的是,我們觀察到了不同程度的放大(例如,模型“A”為5倍,模型“B”為600倍,由於過早磨損,某些工作負載為“無法衡量”)。
並非所有晶片都是平等的:總之,上述大多數問題都是由於並非所有晶片都是平等的。壞晶片仍然透過供應商的測試,每個晶片都有一個質量值,只要透過質量控制標準,高質量晶片就會與低質量晶片混合。因此,給定SSD,存在不同的質量[10,36]。一些工作負載可能會導致低質量晶片出現更明顯的磨損,從而導致上述所有問題。
4.2 磁碟
與SSD類似,亞健康故障的磁碟也可能由韌體錯誤和裝置錯誤/磨損引起。
韌體錯誤:我們收集了三份與導致速度減慢的磁碟韌體錯誤相關的報告。磁碟控制器將I/O請求延遲了四分之一秒。在另一個問題中,磁碟每隔幾秒鐘就會“抖動”,造成難以除錯的問題。在一個大型測試臺上,主節點上的RAID控制器暫停,但在重新啟動後,控制器工作,依然偶爾會超時和重試。最後,發生了一個事件,單個壞磁碟耗盡了RAID卡資源,導致許多IO超時(壞磁碟遮蔽的失敗案例)。
裝置錯誤:由大量磁碟損壞觸發,RAID控制器在執行時啟動頻繁的RAID重建;修復程式重新格式化了檔案系統,以便收集壞扇區,而不在儲存堆疊中使用。磁碟錯誤可能反覆出現;在一種情況下,具有“壞”狀態的磁碟會自動從儲存池中刪除,但當其狀態更改為“好”時,會重新新增,但好-壞連續轉換會導致影響使用者使用。一些運營商還觀察到媒體故障,這些故障迫使磁碟在返回作業系統之前多次重試每個讀取操作。最近的一項提案主張磁碟自動禁用壞盤並繼續部分工作(頻寬減少)[9]。
弱磁頭:磁碟“弱”磁頭的問題在故障排除討論中很常見[17,38],但根本原因尚不清楚。我們研究中的一份報告指出,從致動器元件溢位並在磁頭和碟片之間積聚的黏液會導致磁頭緩慢移動。隨著磁碟變得“更薄”,被截留的黏液的可能性增加。這個問題可以透過執行隨機IOs使磁頭“掃地”來解決。
其他原因:磁碟故障也可能由環境條件(例如,風扇以最大速度執行時產生的噪音和振動)或溫度(例如,磁碟在較冷的環境中寫入後進入讀取模式[19])引起,這將在後面討論(§5)。
4.3 記憶體
記憶體系統被認為是相當健壯的,但我們設法收集了一些證據,表明記憶體硬體也可能出現故障緩慢的故障。
裝置錯誤:在部分記憶體錯誤的情況下,有報告稱定製晶片掩蓋了錯誤並且沒有暴露錯誤地址。在這裡,隨著時間的推移,錯誤增多,可用記憶體大小減小,從而導致更高的快取未命中率。與磁碟/SSD使用不同的是,當空間用完時會丟擲空間不足錯誤,記憶體使用情況不同;只要滿足最小記憶體空間要求,應用程式仍然可以執行,儘管由於減小的快取大小導致更頻繁的頁面交換,效能會降低。
外部原因:有兩種情況下,由於環境條件(特別是記憶體高水位,引入更多嚴重事件,導致頻繁的多位混亂)和人為錯誤,記憶體速度減慢(操作員匆忙插入新的NVDIMM卡,由於連線鬆動,該卡仍能正常工作,但效能較慢)。
未知原因:存在其他未知原因導致的記憶體亞健康故障事件。在HBase部署中,記憶體的執行速度僅為正常速度的25%。在另一個不確定的情況下,在某個基準下觀察到了低記憶體頻寬,但在不同的基準下沒有觀察到。
SRAM錯誤:人們非常關注DRAM錯誤[37],可以說DRAM可靠性在很大程度上是一個已解決的問題——大多數錯誤可以透過ECC(犧牲可預測的延遲)來掩蓋,或者導致受影響程式的故障停止行為。除了DRAM,SRAM的使用在裝置控制器(如FPGA、網絡卡和儲存介面卡)中非常普遍。與DRAM不同,SRAM的工作原理是將每個儲存單元的電壓保持在所需的水平;它不包含可能導致讀/寫暫停的重新整理週期。它最常用於不能在RAM和使用資料的組合邏輯之間產生暫停或緩衝資料的電路。
資料路徑上的SRAM錯誤通常被透明遮蔽;它們最終導致CRC驗證錯誤,只需重試網路資料包或磁碟I/O。然而,SRAM也包含在控制路徑中。我們觀察到SRAM錯誤導致裝置偶爾從中斷的控制路徑重新啟動(以及許多其他問題),從而導致瞬態停止症狀(如§3.3所述)。遺憾的是,SRAM的每位元錯誤率沒有改善[8]。因此,在實踐中,SRAM錯誤在大型基礎設施中經常發生,是服務中斷的主要原因。
4.4 網路
網路效能可變性是一個眾所周知的問題,通常由負載波動引起。本文強調,網路亞健康故障可能是導致網路效能下降的主要原因。
韌體錯誤:我們收集了三份關於交換機韌體中“壞”路由演算法的報告。在一種情況下,由於庫存驅動程式/韌體上的動態路由演算法沒有“按照供應商的承諾”工作,網路效能下降到最大效能的一半。由於對韌體中發生的事情缺乏可見性,操作員必須進入核心以在交換機之間執行ping,這需要很長時間。在另一個故事中,MAC學習沒有響應,特殊型別的流量(如多播)沒有很好地工作,造成了流量氾濫。第三個故事與第一個相似。
NIC驅動程式錯誤:報告了四個NIC驅動程式錯誤例項,丟棄了許多資料包並破壞了TCP效能。在一個故事中,5%的包丟失導致許多虛擬機器進入“死亡藍色畫面”。另一個NIC驅動程式錯誤導致“非常差”的吞吐量,操作員必須禁用TCP offload來解決該問題。在另一個案例中,開發人員在Linux中發現了一個不確定的網路驅動程式錯誤,該錯誤只出現在一臺機器上,使得1Gbps網絡卡只能以1kbps的速度傳輸。最後,一個bug導致NIC和TOR交換機之間發生意外的自動協商,從而限制了它們之間的頻寬,使可用頻寬利用不足。
裝置錯誤:在一個有趣的故事中,網絡卡的物理實現與設計規範不符——晶片的一個遙遠角落缺電,無法全速執行;供應商生產網絡卡,這是一種非常昂貴的衍生產品。同樣,壞的VSCEL鐳射器會降低開關間的效能;這種糟糕的設計影響了數百條電纜。在一次部署中,路由器的內部緩衝記憶體在資料包中偶爾引入位錯誤,導致端到端校驗和失敗,隨後TCP重試。
外部原因:一些亞健康的網路元件也是由環境條件(例如,鬆散的網路電纜、擠壓的光纖)、配置問題(例如,交換機環境不支援巨型幀,因此MTU大小必須配置為1500位元組)和溫度(例如,空氣過濾器堵塞,主機板設計不好,導致NIC落後於CPU)引起的。
未知原因:有其他報告稱,硬體級別的吞吐量下降或嚴重的丟失率,但沒有已知的根本原因。例如,7 Gbps光纖通道崩潰為2 Kbps,1 Gbps吞吐量降級為150 Mbps,丟失率僅為1%,40%的大資料包丟失(但沒有小資料包丟失),一些觀察到的錯誤/丟失率高達50%。TCP效能對丟失率非常敏感。
4.5 處理器
我們發現處理器是相當可靠的,不會自我造成亞健康故障。大多數的CPU亞健康狀態是由外部因素引起的,我們將在下面簡要討論,但將在下一節(§5)中詳細介紹。