引言
利用碎片時間看書和各種資料小結的一些HDD和SSD磁盤的核心要點,最後LINUX檔案系統對于磁盤讀寫的優化尤為重要,當然在固态硬碟成本大幅度降低的今天,這些内容作為了解和梳理即可。
HDD磁盤介紹
機械磁盤從邏輯結構了解為類似一個同心圓的多個圈,從外層到内層進行編号,磁盤通過順時針順序編号,逆時針轉動磁盤,這樣處理是考慮查找磁盤的時候可以直接按照順序掃描過去,磁頭前進方向就是編号遞增方向。
在每一個環上按照一定大小劃分磁道,磁頭在磁道上滑動掃描資料按照上面的圖表所示,一個編号對應一個扇區,而劃線的部分就是磁道,注意這是磁盤的俯視圖,也就是說線的部分是實體磁盤上的“溝壑”,而扇區就是編号内的塊。
注意在HDD磁盤中一個扇區就是最小機關的一次讀寫,為512位元組,而且每一個扇區都是512位元組,不管扇區是在外層還是内層。
在最早的磁盤當中可以通過下面的公式計算出整個磁盤的大小,因為磁道和扇區的數量是一一對應的:
存儲容量=磁頭數磁道(柱面)數每道扇區數*每扇區位元組數
但是這樣的設計有一個顯而易見的問題,那就是無論扇區面積大還是小都是固定大小的外層的扇區資料顯然被浪費了。
針對這樣的問題後續的機械磁盤出現了改進,這項技術叫做ZBR(Zoned Bit Recording,區位記錄)技術,這項技術根據一圈的扇區來劃分大小,通一個圈内的扇區分布和大小相同,這意味着越是外層的扇區數量越多,而内圈則較少,在劃分之後密度均勻分布。
因為磁盤扇區存儲形式的改進,如今的硬碟大多使用[[ LBA(Logical Block Addressing)邏輯塊尋址模式]],了解這個尋址模式才能了解磁盤的大小的計算方式。
然而現在HDD的磁盤讀寫受限在随機讀寫速度上,過去HDD磁盤比較流行的轉速為7200轉和5400轉等等,差別的話是跑的快和跑的慢一點的螞蟻,雖然有SAS硬碟能突破15000轉,但是還是有研究團隊研究尋找不同材料或者其他方式突破磁盤實體轉速的限制(比如雙磁盤轉動的方式加快旋轉),然而始終無法突破機械磁盤的設計的實體限制。
市面上為什麼主流販賣7200轉的磁盤和5400的轉速的磁盤而不是别的磁盤,一方面是7200的随機讀寫性能經過測試是最佳的,同時讨論一塊磁盤的性能不能看順序讀寫的速度而是要看随機讀寫的速度。
針對機械磁盤存在一些實體壁壘,自東芝公司在1984年研究出閃存之後,閃存技術不斷進步,又經過了5年之後SSD磁盤逐漸走進曆史舞台。
為什麼是7200轉和5400轉等等奇怪數字?
這兩個數字都要從3600說起,
計算機的前十年幾乎所有的硬碟都是3600轉的,這個3600又是從哪裡來的呢?因為美國的交流電是60Hz的!于是就有了下面的公式
另外還有一個原因是專利争奪,你會發現轉速有15000卻沒有10000,9000,8000這種數字,其實都是因為整數和500的倍數轉速都被專利注冊了,但是專利注冊者估計沒想到轉速能破萬把。
- 60Hz × 1轉/Hz ×60秒/分鐘 = 3600轉/分鐘
- 5400 RPM = 3600 RPM × 1.5
- 7200 RPM = 3600 RPM × 2
資料讀取方式
HDD的磁盤讀取資料順序:
- 裝置将需要讀寫的扇區和裝置号碼以及掃描多少個扇區告訴磁盤
- 移動磁頭和轉動盤片找到對應扇區
- 讀取資料,把資料寫入緩沖
- 如果所有的扇區掃描完成,讀取的操作則完成了
HDD磁盤讀寫的要點:
從邏輯上來看計算扇區掃描位置和掃描數量計算處理速度是很快的,将扇區内的資料讀取或者寫入的資料也是相對較快的,然而我們知道因為轉速限制的和磁頭和盤片實體掃描是非常慢的,整個讀寫的性能瓶頸是磁頭扇區尋址和掃描磁盤所需的實體磁盤開銷以及最後帶來的随機讀寫性能的權衡。
讀寫方式
磁盤掃描的幾種情況磁盤掃描的方式直接決定了資料處理讀寫速度:
- 順序掃描:順序掃描就是在一個磁道上直接劃過連續的幾個扇區,一次掃描就可以擷取資料,非常快
- 多次連續順序掃描:連續順序掃描值得是針對連續的幾個扇區進行多次掃描,這個時間開銷主要是在盤片的轉動上,雖然依然比較快但是盤片轉動依然會有資料影響。
- 随機讀寫:随機讀寫的開銷主要在磁盤和磁道尋址上,此時不但可能會産生磁盤轉動,磁頭還需要尋找扇區,随機讀寫的效率是非常低的
另外,對于單次IO的通路如果擷取的資料量超過磁盤請求資料量的上限,則會講請求由單次的順序讀寫,拆分為多次的順序掃描。
影響硬碟性能的因素
- 磁盤尋道時間:磁盤的平均尋道時間一般在3-15ms。
- 磁盤轉速:轉速越快
- 磁盤本身的讀寫性能:和磁盤的設計廠商也有關系,随機讀寫強的HDD硬碟通常具備更好的IO性能,同時磁盤資料傳輸的越快傳輸量越大效果越好(廢話)。
SSD磁盤介紹
SSD 的硬碟分為兩種,一種是基于閃存顆粒的閃存固态硬碟,另一種是由于曆史原因出現在SSD和HDD之間的DRAM存儲媒體的硬碟。
閃存顆粒的硬碟也就是我們現代筆記本電腦以及移動固态多數使用的硬碟,這種磁盤的最大優點是可以移動,同時資料的保護不依賴電源就可以存儲,在閃存顆粒中通常被分為 QLC,MLC,TLC,QLC,哪怕是壽命最短的QLC硬碟也有5-6年的壽命,而MLC壽命最長,往往可以十幾年正常工作。
在伺服器使用的固态中通常以MLC為主。SSD磁盤的最大特點是不像是HDD一樣受到實體沖擊有可能造成整塊磁盤不可用,但是SSD一旦損壞資料的修複成本很高或者說根本無法修複。雖然對于現在來看 SSD已經非常便宜了,但是HDD的大資料低成本存儲依然很受一些使用者歡迎。
DRAM是介于機械磁盤和固态硬碟中間的形式,其采用DRAM作為存儲單元,它效仿傳統硬碟的設計,可被絕大部分作業系統的檔案系統工具進行卷設定和管理,并提供工業标準的PCI和FC接口用于連接配接主機或者伺服器,但是最大問題應用範圍相對較窄。
Linux和裝置的互動流程
這一個流程圖有很多細節可以了解,這裡我們以簡單了解通用塊層,IO排程器和磁盤預讀機機制為主。
通用塊層
通用塊層指的是在Linux系統對于HDD和SSD的抽象,HDD和SDD它們被稱為塊裝置。塊裝置的通路方式有兩種,第一種是直接通過挂載的方式通過裝置檔案直接進行讀寫,第二種是根據檔案系統對于磁盤進行封裝以及提供引導入口,當然大部分的軟體使用第二種方式。
由于不同類型的塊裝置處理方式不同,這些裝置的處理的需要依賴驅動程式的控制才能實作通路,但是以我們日常使用Windows系統的經驗,不可能是一個塊裝置一個驅動程式,不然我們每一次加入新硬碟都要裝一遍驅動。
是以這些裝置的處理最終被放到通用塊層實作:
IO排程器和預讀機制
在hdd中還有兩個十分影響性能的機制,IO排程器和預讀機制,但是注意針對hdd的預讀要比ssd的預讀效果要好很多,因為有時候因為排序和預讀導緻ssd的負面優化。
IO排程器:
IO排程器是針對塊裝置通路的時候将請求積攢到一定的時間之後在進行一次請求,是以針對IO排程器主要有下面兩個重要的工作:
- 合并:把對于多個扇區的通路IO請求合并為一個請求
- 排序:因為每個扇區都有編号,IO排程器會把連續的扇區通路多IO進行排序之後再進行通路,使得磁盤掃描趨近順序掃描。
參考資料
- 磁盤I/O那些事
- 為什麼硬碟轉速是5400或者7200這麼奇怪的數字?7200轉的硬碟一定比5400快嗎?