HDD
- 當應用程序發出硬盤 IO 請求後,這個請求就會進入硬盤的 IO 隊列。如果前面有其他 IO,那麼這個請求可能需要排隊等待
- HDD對於隨機訪問和順序訪問速度差距很大
- 主要因素是尋道時間
- 使用 HDD 的應用程序通常會進行各種優化,以執行不需要尋址的就地更新,比如只在文件的後面append
SSD
-
SSD 的特點是,對 SSD 單元的每次擦除,都會降低單元的壽命,因此每一個單元只能承受一定數量的擦除
-
一個頁面包括很多單元,是讀寫的最小存儲單位
- HDD 可以直接對任何字節重寫和覆蓋;但是對 SSD 而言,不能直接進行上述的“覆蓋”操作。SSD 的一個頁面裏面的所有單元,一旦寫入內容後就不能進行重寫,必須和其它相鄰頁面一起,被整體擦除、重置
-
IO 寫入的延遲,具體取決於磁盤的歷史狀態
- 因爲如果 SSD 已經存儲了許多數據,那麼對頁的寫入,有時需要移動已有的數據,這種情況下寫入延遲就比較大
- 因此需要避免SSD存儲太滿
-
擦除是以塊爲單位。擦除速度相對很慢,通常爲幾毫秒
- 對同步的 IO 請求,發出 IO 的應用程序,可能會因爲塊的擦除而經歷很大的寫入延遲。爲了儘量地減少這樣的場景發生,一塊 SSD 最好保持一定數量的空閒塊,這樣可以保證 SSD 的寫入速度足夠快
-
SSD 內部有垃圾回收(GC)機制,它的目的就是不斷回收不用的塊,進行擦除,從而產生新的空閒塊來備用。這樣可以確保以後的頁寫入能快速分配到一個全新的頁
-
寫入放大
- 實際寫入 SSD 的物理數據量,有可能是應用層寫入數據量的多倍
- 一方面頁級別的寫入需要移動已有的數據來騰空頁面來寫入;另一方面,GC 的操作,也會移動用戶數據來進行塊級別的擦除
- 寫入放大效用會縮短 SSD 的壽命
-
損耗平衡
- 對每一個塊而言,一旦擦除造成的損耗達到最大數量,該塊就會“死亡”,再也不能存儲數據了
- 爲了確保整塊 SSD 的容量、性能和可靠性,SSD 內部需要時長對整個 SSD 的各塊做平衡,儘量在擦除次數上保持類似
- 是這種機制也有害處,就是會對前面講的寫入放大推波助瀾
- 併發IO
- 利用到了SSD內部的並行性質
- 對於HDD無用,因爲HDD 只有一個磁頭,所以用多個 I/O 線程,並不能提高舊系統的吞吐量
- SSD 的隨機訪問與順序訪問具有相同的性能,就地更新反而導致 SSD 性能下降的
- 因爲包含數據的 SSD 頁面無法直接重寫,因此在更新存儲的數據時,必須先將相應的 SSD 頁面讀入 SSD 緩衝區,然後將數據寫入乾淨的頁面