無(wú)論是作為個(gè)人電腦的數(shù)據(jù)盤,還是在數(shù)據(jù)中心里面用作海量數(shù)據(jù)的存儲(chǔ),機(jī)械硬盤仍然在被大量使用。隨著成本下降,機(jī)械硬盤還替代掉了很多傳統(tǒng)的存儲(chǔ)設(shè)備,如以前常用來備份冷數(shù)據(jù)的磁帶。
拆解機(jī)械硬盤
機(jī)械硬盤的IOPS大概只能做到每秒100次左右。機(jī)械硬盤拆開,自然知道為什么它的IOPS是100左右了。
硬盤的構(gòu)造,里面有接口,有對(duì)應(yīng)的控制電路版,以及實(shí)際的I/O設(shè)備(也就是我們的機(jī)械硬盤)。
一塊機(jī)械硬盤是由盤面、磁頭和懸臂三個(gè)部件組成的。
盤面(Disk Platter)
實(shí)際存儲(chǔ)數(shù)據(jù)的盤片。
本身通常是用的鋁、玻璃或者陶瓷這樣的材質(zhì)做成的光滑盤片。有層磁性涂層。數(shù)據(jù)就存儲(chǔ)在這個(gè)磁性的涂層上。
中間有個(gè)受電機(jī)控制的轉(zhuǎn)軸。控制盤面去旋轉(zhuǎn)。
硬盤的轉(zhuǎn)速5400轉(zhuǎn)的、7200轉(zhuǎn),指的就是盤面中間電機(jī)控制的轉(zhuǎn)軸的旋轉(zhuǎn)速度,英文單位叫RPM,也就是每分鐘的旋轉(zhuǎn)圈數(shù)(Rotations Per Minute)。所謂7200轉(zhuǎn),其實(shí)更準(zhǔn)確地說是7200RPM,指的就是一旦電腦開機(jī)供電之后,我們的硬盤就可以一直做到每分鐘轉(zhuǎn)上7200圈。如果折算到每一秒鐘,就是120圈。
磁頭(Drive Head)
數(shù)據(jù)并不能直接從盤面?zhèn)鬏數(shù)娇偩€上,而是通過磁頭,從盤面上讀取到,然后再通過電路信號(hào)傳輸給控制電路、接口,再到總線。
一個(gè)盤面有兩個(gè)磁頭,分別在盤面的正反面。盤面在正反兩面都有對(duì)應(yīng)的磁性涂層來存儲(chǔ)數(shù)據(jù),而且一塊硬盤也不是只有一個(gè)盤面,而是上下堆疊了很多個(gè)盤面,各個(gè)盤面之間是平行的。每個(gè)盤面的正反兩面都有對(duì)應(yīng)的磁頭。
懸臂(Actutor Arm)
懸臂鏈接在磁頭上,并且在一定范圍內(nèi)會(huì)去把磁頭定位到盤面的某個(gè)特定的磁道(Track)。
磁道
一個(gè)盤面通常圓形,由很多同心圓,每個(gè)“甜甜圈”就是個(gè)磁道。每個(gè)磁道都有自己的編號(hào)。
懸臂只是控制到底讀最里面那個(gè)“甜甜圈”,還是最外面的“甜甜圈”數(shù)據(jù)。
扇區(qū)(Sector)
一個(gè)磁道,會(huì)分成一個(gè)個(gè)扇區(qū)。
柱面(Cylinder)
上下平行的一個(gè)個(gè)盤面的相同扇區(qū)叫一個(gè)柱面。
讀取數(shù)據(jù)
兩個(gè)步驟:
把盤面旋轉(zhuǎn)到某個(gè)位置
在這個(gè)位置,懸臂可定位到整個(gè)盤面的某個(gè)子區(qū)間。該子區(qū)間像塊披薩餅,叫幾何扇區(qū)(Geometrical Sector),即“幾何位置上”,所有這些扇區(qū)都可以被懸臂訪問到。
把懸臂移動(dòng)到特定磁道的特定扇區(qū),即在這個(gè)“幾何扇區(qū)”里,找到實(shí)際扇區(qū)。找到后,磁頭會(huì)落下,即可讀取到正對(duì)著扇區(qū)的數(shù)據(jù)。
一次硬盤的隨機(jī)訪問所需時(shí)間
平均延時(shí)(Average Latency)
盤面旋轉(zhuǎn),把幾何扇區(qū)對(duì)準(zhǔn)懸臂位置的時(shí)間。
和機(jī)械硬盤轉(zhuǎn)速相關(guān)。隨機(jī)情況下,平均找到一個(gè)幾何扇區(qū),需旋轉(zhuǎn)半圈盤面。
7200r硬盤,1s可旋轉(zhuǎn)240個(gè)半圈,平均延時(shí):
1s / 240 = 4.17ms
平均尋道時(shí)間(Average Seek Time)
盤面選轉(zhuǎn)之后,我們的懸臂定位到扇區(qū)的的時(shí)間。我們現(xiàn)在用的HDD硬盤的平均尋道時(shí)間一般在4-10ms。
若隨機(jī)在硬盤找個(gè)數(shù)據(jù),需 8~14 ms。硬盤只有一個(gè)電機(jī)轉(zhuǎn)軸,也只有一個(gè)懸臂,所以無(wú)法并行定位或讀數(shù)據(jù)。那一塊7200r硬盤,1s隨機(jī)的I/O訪問次數(shù)就是:
1s / 8 ms = 125 IOPS或1s / 14ms = 70 IOPS
若不是隨機(jī)的數(shù)據(jù)訪問,而是順序的數(shù)據(jù)讀寫,應(yīng)如何最大化讀取效率?
順序存放的數(shù)據(jù),盡可能存放在同一柱面。這就只需旋轉(zhuǎn)一次盤面,進(jìn)行一次尋道,就可寫或讀,同一個(gè)垂直空間上的多個(gè)盤面的數(shù)據(jù)。
若一個(gè)柱面上的數(shù)據(jù)不夠,也不要去動(dòng)懸臂,而是通過電機(jī)轉(zhuǎn)動(dòng)盤面,即可順序讀完一個(gè)磁道上的所有數(shù)據(jù)。所以,對(duì)HDD的順序數(shù)據(jù)讀寫,吞吐率還不錯(cuò),約200MB/s。
Partial Stroking:根據(jù)場(chǎng)景提升性能
100 IOPS,難以滿足現(xiàn)在互聯(lián)網(wǎng)海量高并發(fā)請(qǐng)求。所以,DB都會(huì)將數(shù)據(jù)存在SSD。
但20年前,沒有現(xiàn)在這么便宜的SSD硬盤。DB數(shù)據(jù)只能存放在HDD。
即便如今數(shù)據(jù)中心用的HDD,也是7200r,要更快隨機(jī)訪問速度,會(huì)選擇SSD。但當(dāng)時(shí),SSD非常貴,還沒能商業(yè)化。硬盤廠商們?cè)诓粩嘌邪l(fā)轉(zhuǎn)得更快的硬盤。數(shù)據(jù)中心往往用10000轉(zhuǎn),乃至15000轉(zhuǎn)的硬盤。
直到2010年,SSD開始逐步進(jìn)入市場(chǎng),西數(shù)還在嘗試研發(fā)20000轉(zhuǎn)硬盤。轉(zhuǎn)速更高、尋道時(shí)間更短的機(jī)械硬盤,才能滿足實(shí)際DB需求。
但10000r,乃至15000r硬盤也更貴,想節(jié)約成本,提高性價(jià)比,就得想它法。Google早年用家用PC乃至二手硬件,通過軟件層面設(shè)計(jì)解決了可靠性和性能。那有辦法提高機(jī)械硬盤的IOPS嗎?這就是Partial Stroking或者Short Stroking,“縮短行程”技術(shù)。
既然訪問一次數(shù)據(jù)的時(shí)間:“平均延時(shí)+尋道時(shí)間”,只要能縮短其一,就能提升IOPS!
一般 硬盤的尋道時(shí)間 > 平均延時(shí)硬盤的尋道時(shí)間>平均延時(shí),如何縮短平均尋道時(shí)間?
最極端的:不需要尋道,即將所有數(shù)據(jù)都放在一個(gè)磁道。比如始終把磁頭放在最外道磁道。尋道時(shí)間就基本為0,訪問時(shí)間就只剩平均延時(shí)。
IOPS就變成:
1s / 4ms = 250 IOPS
但只用一個(gè)磁道,能存的數(shù)據(jù)就很有限了!可能我們還不如把這些數(shù)據(jù)直接都放到內(nèi)存呢!
所以,實(shí)踐可只用1/21/2或1/41/4磁道,即最外面1/4或1/2的磁道。
如此,硬盤可使用的容量可能變成1/2或1/4。但尋道時(shí)間也變成1/4或1/2,因?yàn)閼冶坌枰苿?dòng)的“行程”也變成原來1/2或者1/4,IOPS大幅提升!
比如7200r硬盤,正常平均延時(shí)4.17ms,尋道時(shí)間9ms。原本IOPS:
1s / (4.17ms + 9ms) = 75.9 IOPS
若只用其中1/4磁道,則IOPS變成:
1s / (4.17ms + 9ms/4) = 155.8 IOPS
IOPS提升一倍,和塊15000r硬盤性能差不多。但這時(shí)硬盤可用空間也只有原1/4。所以,這樣通過軟件去格式化硬盤,只保留部分磁道讓系統(tǒng)可用的情況,可大大提升硬件性價(jià)比。
總結(jié)
機(jī)械硬盤的硬件主要由:盤面、磁頭和懸臂組成。
數(shù)據(jù)在盤面上的位置,可通過磁道、扇區(qū)和柱面來定位。
實(shí)際的一次對(duì)于硬盤的訪問,需要把盤面旋轉(zhuǎn)到某一個(gè)“幾何扇區(qū)”,對(duì)準(zhǔn)懸臂的位置。然后,懸臂通過尋道,把磁頭放到我們實(shí)際要讀取的扇區(qū)上。
受制于機(jī)械硬盤的結(jié)構(gòu),對(duì)隨機(jī)數(shù)據(jù)的訪問速度,就要包含旋轉(zhuǎn)盤面的平均延時(shí)和移動(dòng)懸臂的尋道時(shí)間。通過這倆時(shí)間,能計(jì)得機(jī)械硬盤IOPS。
7200轉(zhuǎn)機(jī)械硬盤的IOPS,只能做到100。早期沒有SSD,所以想出Partial Stroking這個(gè)浪費(fèi)存儲(chǔ)空間,但能縮短尋道時(shí)間以提高硬盤IOPS的方案。