天天看點

資料的存儲媒體-磁盤的硬體特性

在本章,我們稍微涉及一些硬體和作業系統層面的事情。

計算機是由硬體和軟體組成的, 而所有軟體的唯一目标就是盡可能最大化的利用下層硬體能夠提供的特性,完成上層的功能。

是以才會有人說,硬體是骨頭,軟體是血肉,骨頭決定生物的形态,軟體決定生物的神态。不過,依然請放心,我們不會讨論複雜的東西, 作為一個軟體工程師,也沒有人會要求我們去寫一個磁盤存儲器的硬體驅動代碼~在這裡,我們隻讨論那些為了後面我們了解軟體存儲而鎖需要掌握的硬體知識。

好了,直入主題 ,硬碟

=== 硬碟構造介紹===

所謂的資料存儲,就是把一串很普通的由0和1組成的位元組流按照他原來的順序寫入到一種媒體裡面去。那麼自然而然,使用電驅動的磁鐵小針快速的改變可磁化媒體進而記錄下這些資料就必然是一種很好的選擇。

那麼,下面就請大家跟我一起來看看磁盤的基本構造:

磁盤的先祖其實就是錄音帶機,相信閱讀本文的讀者應該都使用過錄音機的(95後無辜的看着我。。。)

資料的存儲媒體-磁盤的硬體特性

從很小的用來聽音樂的卡片式錄音帶機到很大的用來存資料的錄音帶卷兒,其實樣子一直都是這樣的(笑)。

在使用的過程中,一般是由一個小電機帶着這個錄音帶向着一個方向轉動,然後有一個磁頭以很近的距離來讀取磁場的微妙變化,進而能夠讀取到上面記錄的資料的。

這裡就出現了磁盤中所需要用到的第一個關鍵的元件,電機,他的主要作用在于給予帶動含磁媒體向着一個固定的方向轉動,進而可以保證資料能夠被“順序”的讀出和讀入。

然而,當我們嘗試把這種磁技術應用于計算機的時候,就立刻發現了一個很重要的問題需要解決:

在計算機的應用場景中,資料的讀取可能不完全是順序的,有可能先讀一下開始位置的資料,然後又讀一下結果位置的資料,最後又需要讀中間位置的資料。并且,這種讀取的跳躍過程是無法提前預測的。

是以就有一個問題急需要解決,如何能夠讓磁媒體支援随機通路。

讓我們回想一下磁媒體寫入和讀取過程中需要的關鍵元件: 1. 磁媒體。2.磁頭。3.步進電機。

而随機通路則需要能夠讓磁頭與磁媒體的特定區段進行接觸,進而才能讀取到對應的資料。

那麼,一種選擇是讓媒體移動到指定位置,磁頭不動。一種是讓磁頭移動到媒體的位置上。

明顯的,把存儲媒體移動起來的控制難度要遠遠大于讓磁頭移動。

是以,計算機需要的新的磁存儲模型就出現了:

磁盤使用步進電機保持勻速運動,然後讓磁頭移動來讀取或寫入資料!

資料的存儲媒體-磁盤的硬體特性

不過,雖然磁頭移動已經是裡面最輕量的玩意兒了,但他仍然需要一個電機帶動磁頭在磁盤上做尋道操作。

=== 硬碟塊與原子操作 ===

然後我們再來看另外一個問題,如果你每次寫入隻寫一個bit,那麼因為磁盤在高速旋轉,有大量的資料傳遞性工作,導緻磁盤需要頻繁的等待新的指令,這樣會造成磁盤效率非常低下。是以,一次寫一批資料就成了合理的選擇,是以磁盤一般是按照磁盤塊的方式來組織資料的。

常用的塊大小是512byte 。但因為磁盤的磁頭一次隻能寫一個bit,是以依然會面臨斷電了資料寫一半兒怎麼辦的問題。。

解決的方法也不會超出大家的預期,這也是計算機能夠做出的最大保證了:

如果告訴你寫成功了,那一定是寫成功了。那失敗怎麼辦? 好問題,我們來分析一下:

一台計算機,其實隻有三個狀态,要麼給電機器運轉,要麼正常關機,要麼異常關機。在正常運轉狀态和正常關機狀态的時候,作業系統都可以保證資料的所有操作都是原子的,因為隻需要在關機hook上做完該做的事情,同時不允許有新的請求進來就可以了。

隻有異常關機的狀态略微有點麻煩,首先,因為無論計算機是正常關機還是異常斷點的關機,這台計算機在下次給電啟動之前都是不可能服務的,是以就算是有個磁盤塊隻寫了一半兒也沒什麼問題。 是以問題就轉化成,能否在下次啟動并能提供讀寫服務之前,先把那些寫了一半的資料塊删掉?(因為沒有給請求方回報過成功,是以這些未完成的塊本來就不應該存在)

那下一步如何做就很容易可以想到了。在每次開機的時候判斷一下是否是一次正常的關機,如果不是正常關機,那麼将那些未被标記為完整寫入的塊全部删掉。

嗯 ,這個模式也是貫穿單機有狀态存儲保證資料一緻性的主要方法,可以複用到單機所有需要原子性操作的地方哦~

=== 讀寫iops與讀寫吞吐量(mbps) 與 延遲的關系 ===

這個概念我估計大部分人都會搞混,包括我在内。

是以我也把目前我的了解給到大家

首先

先來界定什麼叫做一次io . 簡單來說,一次io就是應用層發起一次寫入或查詢的請求

那麼這個請求對應到磁盤上面來說呢就是以下幾個操作的集合:

1.       磁頭移動到這次請求所對應的磁道

2.       等待硬碟旋轉到資料所在的位置

3.       讀取資料

自然的,如果想增加磁盤的iops數,就需要讓磁盤在一秒内盡可能多的完成使用者的請求,那麼最理想狀态下應該是: 減少磁頭的移動,減少硬碟轉到資料所在位置的時間,減少一次請求所要讀寫的資料塊個數。

不過這是個理想狀态,因為請求無法預測,是以一般來說也隻能是追求盡可能減少随機尋道時間(因為這個是幾個iops的參數中影響最大的一個)。

這個名額是面向小資料随機或順序讀寫應用時候比較看重,比如資料庫。

再來看吞吐量(mb per second)

這個名額是磁盤相對比較擅長的名額,他衡量的是資料在機關時間内傳出+傳入這塊磁盤的總數量。

是以如果想增加磁盤的吞吐量名額,就需要讓磁盤在一秒内盡可能多的寫入或讀出資料,那麼最理想的狀态下應該是: 減少磁頭的移動,減少磁盤轉到資料所在位置的時間,增加一次請求所需要讀寫的資料塊的個數。

比如,如果使用者隻有一個請求,并且這個請求是要求順序的将1t的資料寫入到磁盤内。這種情況就能發揮出磁盤吞吐量的極限了。

這個名額對于一般的資料庫意義不大,但對于視訊、搜尋引擎、或大檔案存儲這類順序讀寫的應用則比較看重。

延遲

基本上來說,延遲和iops是個正比例關系。

為什麼這麼說呢? 原因是更大延遲可以允許計算機做這麼一件事,批量處理:

就好比100個旅客要從北京坐飛機到杭州,飛機是個稀缺資源,我們假定北京飛杭州要1個小時。

那麼如果一架飛機上隻有一個旅客,那麼要飛100次才能夠把這批旅客運到目的地,運送100個旅客的總時間是100個小時, 每小時運送旅客數是100/ 100 = 1 ,而如果要是讓先來的旅客等一等,等到100人都做上飛機以後再起飛呢?那麼每小時運送的旅客數就是 100/ 乘客的等待時間+ 1 / 1 約等于100

這樣略微增加延遲就可以提升整體的tps 量了。 不過需要注意的是,這個提升是有上限的,當每架飛機都坐滿了人的時候,那麼飛機的運力就是最終瓶頸,其他乘客隻能等待。

是以一個常見的延遲與請求數的圖示往往是這樣的:

資料的存儲媒體-磁盤的硬體特性

請求數超過伐值後,就隻剩下排隊了,系統的運力不可能再有提升了。

==== 小結 ===

總結一下磁盤的優勢和劣勢:

優勢:

技術比較成熟,是以價格相對較低

順序讀寫因為不涉及到大量的機械尋道,是以吞吐量隻和磁盤轉速正相關。

劣勢:

隻要操作需要大量尋道,畢竟尋道是個機械操作,那麼磁盤的iops和吞吐量會立刻下降很多。

讀取和寫入是按照塊來進行的,一般塊的大小是512 bytes,是以一次操作必須一次性的寫入這個數量的資料。

嗯 下一篇來介紹磁盤raid與陣列