深刻淺出計算機組成原理學習筆記:第四十七講

1、引子

一、爲何Windows操做系統、用了SSD的系統盤,就不能用磁盤碎篇整理功能?node

若是你平時用的是Windows電腦,你會發現,用了SSD的系統盤,就不能用磁盤碎片整理功能。這是由於,一旦主動去運行磁盤碎片整理功能,就會發生一次塊的擦除,
對應塊的壽命就少了一點點。這個SSD的擦除壽命的問題,不只會影響像磁盤碎片整理這樣的功能,其實也很影響咱們的平常使用。算法

二、讀多的場景數據庫

咱們的操做系統上,並無SSD硬盤上各個塊紙目前已經擦寫的狀況和壽命,因此它對待SSD硬盤和普通的機械硬盤沒有什麼區別。網絡

咱們平常使用PC進行軟件開發的時候,會先在硬盤上裝上操做系統和經常使用軟件,好比Office,或者工程師們會裝上VS Code、WebStorm這樣的集成開發環境。
這些軟件所在的塊,寫入一次以後,就不太會擦除了,因此就只有讀的需求。ide

三、寫多的場景性能

一旦開始開發,咱們就會不斷添加新的代碼文件,還會不斷修改已經有的代碼文件。由於SSD硬盤沒有覆寫(Override)的功能,因此,這個過程當中,其實咱們是在反覆地寫入新的文件,而後再把原來的文件標記成邏輯上刪除的狀態。等SSD裏面空的塊少了,
咱們會用「垃圾回收」的方式,進行擦除。這樣,咱們的擦除會反覆發如今這些用來存放數據的地方。優化

 

有一天,這些塊的擦除次數到了,變成了壞塊。可是,咱們安裝操做系統和軟件的地方尚未壞,而這塊硬盤的能夠用的容量卻變小了。spa

2、磨損均衡

一、磨損均衡

那麼,咱們有沒有什麼辦法,不讓這些壞塊那麼早就出現呢?咱們能不能,勻出一些存放操做系統的塊的擦寫次數,給到這些存放數據的地方呢?操作系統

相信你必定想到了,其實咱們要的就是想一個辦法,讓SSD硬盤各個塊的擦除次數,均勻分攤到各個塊上。這個策略呢,就叫做 磨損均衡(Wear-Leveling)。實現這個技術的核心辦法,和咱們前面講過的虛擬內存同樣,就是添加一個間接層。這個間接層,就是咱們上面講給你賣的那個關子,就是FTL這個閃存轉換層設計

 

就像在管理內存的時候,咱們經過一個頁表映射虛擬內存頁和物理頁同樣,在FTL裏面,存放了 邏輯塊地址(Logical Block Address,簡稱LBA)到 物理塊地址(Physical Block Address,簡稱PBA)的映射。

二、FTL閃存轉換層

操做系統訪問的硬盤地址,其實都是邏輯地址。只有經過FTL轉換以後,纔會變成實際的物理地址,找到對應的塊進行訪問。操做系統自己,不須要去考慮塊的磨損程度,只要和操做機械硬盤同樣來讀寫數據就行了。

操做系統全部對於SSD硬盤的讀寫請求,都要通過FTL。FTL裏面有邏輯塊對應的物理塊,因此FTL可以記個擦寫次數少的物理塊上。

這也是咱們在設計⼤型系統中的一個典型思路,也就是各層之間是隔離的,操做系統不須要考慮底層的硬件是什麼,徹底交由硬件的控制電路里面的FTL,來管理對於實際物理硬件的寫入。

3、TRIM指令的支持

一、在SSD硬盤的使用上會存在什麼問題?

不過,操做系統不去關注實際底層的硬件是什麼,在SSD硬盤的使用上,也會帶來一個問題。這個問題就是,操做系統的邏輯層和SSD的邏輯層裏的塊狀態,是不匹配的

二、平常的文件刪除,都只是一個操做系統層面的邏輯刪除

咱們在操做系統裏面去刪除一個文件,其實並無真的在物理層面去刪除這個文件,只是在文件系統裏面,把對應的inode裏面的元信息清理掉,
這表明這個inode還能夠繼續使用,能夠寫入新的數據。這個時候,實際物理層面的對應的存儲空間,在操做系統裏面被標記成能夠寫入了。

因此,其實咱們平常的文件刪除,都只是一個操做系統層面的邏輯刪除。這也是爲何,不少時候咱們不當心刪除了對應的文件,咱們能夠經過各類恢復軟件,
把數據找回來。一樣的,這也是爲何,若是咱們想要刪除乾淨數據,須要用各類「粉件粉碎」的功能才行。

三、SSD硬盤上刪除數據的流程是怎樣的

這個刪除的邏輯在機械硬盤層面沒有問題,由於文件被標記成能夠寫入,後續的寫入能夠直接覆寫這個位置。可是,在SSD硬盤上就不同了。
我在這裏放了一張詳細的示意圖。咱們一塊兒來看看具體是怎麼回事兒。

 

一開始,操做系統裏面有好幾個文件,不一樣的文件我用不一樣的顏色標記出來了。下面的SSD的邏輯塊裏面佔用的頁,咱們也用一樣的顏色標記出來文件佔用的對應頁。

當咱們在操做系統裏面,刪除掉一個剛剛下載的文件,好比標記成黃色openjdk.exe這樣一個jdk的安裝文件,在操做系統裏面,對應的inode裏面,就沒有文件的元信息。

可是,這個時候,咱們的SSD的邏輯塊層面,其實並不知道這個事情。因此在,邏輯塊層面,openjdk.exe仍然是佔用了對應的空間。對應的物理頁,也仍然被認爲是被佔用了的。

四、操做系統對於文件的刪除,SSD硬盤其實並不知道

因此,在使用SSD的硬盤狀況下,你會發現,操做系統對於文件的刪除,SSD硬盤其實並不知道。這就致使,咱們爲了磨損均衡,
不少時候在都在搬運不少已經刪除了的數據。這就會產⽣不少沒必要要的數據讀寫和擦除,既消耗了SSD的性能,也縮短了SSD的使⽤壽命。

五、TRIM命令是作什麼用的?

爲了解決這個問題,如今的操做系統和SSD的主控芯⽚,都⽀持 TRIM命令。這個命令能夠在⽂件被刪除的時候,讓操做系統去通知SSD硬盤,
對應的邏輯塊已經標記成已刪除了。如今的SSD硬盤都已經⽀持了TRIM命令。⽆論是Linux、Windows仍是MacOS,這些操做系統也都已經⽀持了TRIM命令了。

4、寫放大效應

其實,TRIM命令的發明,也反應了一個使用SSD硬盤的問題,那就是,SSD硬盤容易越用越慢。

當SSD硬盤的存儲空間被佔用得愈來愈多,每一次寫入新數據,咱們均可能沒有足夠的空間。咱們可能不得不去進行垃圾回收,合併一些塊裏面的頁,
才能勻出一些空間來

這個時候,從應用層或者操做系統層面來看,咱們可能只是寫入了一個4KB或者4MB的數據。可是,實際經過FTL以後,咱們可能要去搬運8MB、16MB甚至更多的數據。
一、如何解決寫入放大

咱們經過「 實際的閃存寫⼊的數據量/系統經過FTL寫⼊的數據量=寫入放大」,能夠獲得,寫入放大的倍數越多,意味着實際的SSD性能也就越差,會遠遠⽐不上實際SSD硬盤標稱的指標。

而解決寫入放大,須要咱們在後臺定時進行垃圾回收,在硬盤比較空閒的時候,就把搬運數據、擦除數據、留出空白的塊的工做作完,而不是等實際數據寫入的時候,再進行這樣的操做

5、AeroSpike:如何最大化SSD的使用效率?

講到這裏,相信你也發現了,想要把SSD硬盤用好,其實沒有那麼簡單。若是咱們只是簡單地拿⼀塊SSD硬盤替換掉原來的HDD硬盤,而不是從應用層面考慮任何SSD硬盤特性的話,咱們多半仍是無法得到想要的性能提高。

不過,既然清楚了SSD硬盤的各類特性,咱們就能夠依據這些特性,來設計咱們的應用。接下來,我就帶你一塊兒看一看,AeroSpike這個專欄針對SSD硬盤特性設計的Key-Value數據庫(鍵值對數據庫),是怎麼利用這些物理特性的。

首先,AeroSpike操做SSD硬盤,並無經過操做系統的文件系統。而是直接操做SSD硬盤的塊和頁。由於操做系統裏面的文件系統,對於KV數據庫來講,只是讓咱們多了一層間接層,只會下降性能,對咱們沒有什麼實際的做用。

一、AeroSpike在讀寫數據的時候,作了兩個優化

其次,AeroSpike在讀寫數據的時候,作了兩個優化。在寫入數據的時候,AeroSpike儘量去寫一個較大的數據塊,而不是頻繁地去寫不少小的數據塊。
這樣,硬盤就不太容易頻繁出現磁盤碎片。而且,一次性寫入一個大的數據塊,也更容易利用好順序寫入的性能優點。AeroSpike寫入的一個數據塊,是128KB,遠比一個頁的4KB要大得多。

另外,在讀取數據的時候,AeroSpike卻是能夠讀取512字節(Bytes)這樣的小數據。由於SSD的隨機讀取性能很好,也不像寫入數據那樣有擦除壽命問題。並且,
不少時候咱們讀取的數據是鍵值對裏面的值的數據,這些數據要在網絡上傳輸。若是一次性必須讀出比較大的數據,就會致使咱們的網絡帶寬不夠用。

二、如何提升響應時間

由於AeroSpike是一個對於響應時間要求很高的實時KV數據庫,若是出現了嚴重的寫放大效應,會致使寫入數據的響應時間大幅度變長。因此AeroSpike作了這樣幾個動做:

第一個是持續地進行磁盤碎片整理。AeroSpike用了所謂的高水位(High?Watermark)算法。其實這個算法很簡單,就是一旦一個物理塊裏面的數據碎片超過50%,
就把這個物理塊搬運壓縮,而後進行數據擦除,確保磁盤始終有足夠的空間能夠寫入。

第二個是在AeroSpike給出的最佳實踐中,爲了保障數據庫的性能,建議你只⽤到SSD硬盤標定容量的⼀半。也就是說,咱們人爲地給SSD硬盤預留了50%的預留空間,以確保SSD硬盤的寫放大效應儘量小,不會影響數據庫的訪問性能。

正是由於作了這種種的優化,在NoSQL數據庫剛剛興起的時候,AeroSpike的性能把Cassandra、MongoDB這些數據庫遠遠甩在身後,和這些數據庫之間的性能差距
,有時候會到達一個數量級。這也讓AeroSpike成爲了當時高性能KV數據庫的標杆。你能夠看一看InfoQ出的這個Benchmark,裏面有2013年的時候,這幾個NoSQL數據庫巨⼤的性能差別

6、總結延伸

好了,如今讓咱們一塊兒來總結一下今天的內容。

由於SSD硬盤的使用壽命,受限於塊的擦除次數,因此咱們須要經過一個磨損均衡的策略,來管理SSD硬盤
的各個塊的擦除次數。咱們經過在邏輯塊地址和物理塊地址之間,引入FTL這個映射層,使得操做系統無需
關心物理塊的擦寫次數,而是由FTL裏的軟件算法,來協調到底每一次寫入應該磨損哪一塊。

除了磨損均衡以外,操做系統和SSD硬件的特性還有一個不匹配的地方。那就是,操做系統在刪除數據的時
候,並無真的刪除物理層⾯的數據,而只是修改了inode裏面的數據。這個「僞刪除」,使得SSD硬盤在
邏輯和物理層面,都沒有意識到有些塊其實已經被刪除了。這就致使在垃圾回收的時候,會浪費不少沒必要要
的讀寫資源。

SSD這個須要進行垃圾回收的特性,使得咱們在寫⼊數據的時候,會遇到寫⼊放⼤。明明咱們只是寫⼊了
4MB的數據,可能在SSD的硬件層面,實際寫入了8MB、16MB乃至更多的數據。

針對這些特性,AeroSpike,這個專門針對SSD硬盤特性的KV數據庫,設計了不少的優化點,包括跳過文件
系統直寫硬盤、寫大塊讀小塊、用高水位算法持續進行磁盤碎片整理,以及只使用SSD硬盤的一半空間。這
些策略,使得AeroSpike的性能,在早年間遠遠超過了Cassandra等其餘NoSQL數據庫。

能夠看到,針對硬件特性設計的軟件,才能最大化發揮咱們的硬件性能

相關文章
相關標籤/搜索