知乎

都說固態硬盤壽命短,那麼有誰把使用壽命用完了嗎?


北極,請勿付費諮詢
閱讀原文

我的工作是做操作系統存儲驅動相關的東西,包括文件系統、存儲驅動、USB 都接觸過,把盤寫壞了的事情還是遇到過不少次的。

如果把寫壞的盤做一個匯總,可以總結以下幾個特點:

1. 基本上都是不出名的小廠的盤,大廠尤其是Intel 的盤在壓力測試下也沒出過問題,Intel 的盤不僅耐用,並且掉電丟數據的情況也很少。

2. 新產品更容易壞,比如NVMe 剛出來的時候,各種雜牌子的盤很多,壞的也多,但過了一段時間以後,NVMe 的穩定性比第一批盤要好。這個規則也適用於SATA-SSD(以下簡稱SSD),但是因為SSD 已經比較成熟了,所以SSD 的問題相對於NVMe 來說要少一些。

3. 操作系統上層操作很難寫壞一個盤,因為盤自身帶緩存,解決方法是發送硬件的flush(SYNC)命令,並且不要使用TRIM 命令。

早年(大概8 年前)SSD 剛開始普及的時候,雜牌子的SSD 比較多,國外客戶更是什麼樣的盤都有,寄過來一些故障盤,發現在持續烤機一段時間(大概一個月)以後,性能開始下降,文件系統(RTOS 上的)性能從200MB/s 左右下降到不到100MB/s,這個時候盤已經快要壞了,大版本release 測試的時候發現性能有下降,會用不同的盤測一下,如果是某個特定的盤的問題,那麼就會把這個盤從測試環境裡取出來,不再繼續使用。這些盤年代久遠,印像不太深刻。

我印象深刻的是兩年前我寫壞過一個NVMe 盤,盤不是我買的,但是因為我們文件系統的性能距離官方數據有一定差距,並且想研究一下TRIM(DISCARD)的影響,我就拿過來研究了一下(順便說一下,有幾個回答裡有人提到過這個品牌,這個品牌名聲一般)。為了避免硬件緩存的影響,我每次測試之前,會全盤寫一遍0x55,再寫一遍0xAA,每寫一段就發一個SYNC 命令,這樣能迫使硬件緩存完全失效,並且會完全消耗一次PE 次數。寫完一遍55/AA 之後,再進行後續性能測試(以每次256KB 的數據塊寫2GB 的內容)。

這個NVMe 盤(PCI-E)裸寫的速度大概是700-800MB/s,在我反复擦寫0x55/0xAA 大概5 次左右的時候,盤的寫速度突然掉到200MB/s,之後一直就保持在這個速度上了。

基本上可以認為這個盤已經壞了。

評論有人說SSD 跟NVMe 是一種東西,不應該這麼比,我回答裡的SSD 特指SATA-SSD,二者的主控並不一樣,NVMe 剛流行的那兩年,因為主控問題導致NVMe 掛掉的盤很多,第一批NVMe 的主控技術並不好。主控對閃存的性能和壽命影響是很大的。


所以,要問固態盤快要壞了的時候是什麼現象,那麼首先可能遇到的是掉速問題,頻繁擦寫(尤其是寫一輪55/AA)可能會導致固態盤的負載均衡算法失靈;也可能會零碎的丟失一些數據,但考慮到盤本身很大,如果不是像Chia 那樣P 盤的話,未必能發現異常的數據塊。

正常使用,尤其是用大廠的盤,一般不會有什麼問題,我手頭的Intel SSD 730 Series 240GB,是2014 年買的,作為系統盤使用至今沒有任何問題。但另外一塊SanDisk 的1T SSD,用了不到4 年,已經有好幾塊壞快了(但還能用)。但是大廠的東西,貴是真的貴,一分錢一分貨,十分錢兩分貨


寫廢盤的測試流程(注:繞過文件系統,直接操作驅動):

1. 申請256KB 的固定緩存;

2. 緩存填充0x55,從第一個扇區寫到最後一個扇區;

2.1. 每寫完1G,發送一次硬件Flush 命令(NVMe:Flush Cmd 0x00,SATA:ATA_CMD_FLUSH 0xE7/0xEA)

3. 緩存填充0xAA,從第一個扇區寫到最後一個扇區;

3.1. 每寫完1G,發送一次硬件Flush 命令(同上)

4. 準備1-2GB 的內存,按偏移量對0x100 求餘填充數據

5. 計時,寫入數據,計算性能

6. 計時,讀取數據,計算性能,校驗

7. 發送Flush 命令,並重複4-6 步驟多次(>5)求平均數