本文為《大話存儲》的讀書筆記。
計算機的IO世界
總線
總線的概念
計算機中所有的IO都通過共享總線的方式來實現。
總線實際上就是一條或多條的物理導線。密密麻麻的印到電路板上,而且為了避免高頻振盪的干擾,一般都會分組印刷到不同的電路板上,然后壓合起來。
總線的分類
PCI總線是目前x86服務器普遍使用的南橋與外設連接的總線技術。
PCI總線的地址總線和數據總線是分時復用的,這樣可以節省管腳數量。
在數據傳輸時,PCI協議上有三種不同的角色
- 主,也就是發起者
- 從,Target或者Slave
- 仲裁者Arbiter
CPU、內存、磁盤交互過程
下面我們來介紹一下CPU、內存、磁盤交互過程
CPU、內存、磁盤通過總線相互連接,所以通路的因素具備了。
然后需要上通路上的設備有不同的標識,這樣才可以區分開。所以每個IO設備在啟動的時候,都需要向物理機的內存中映射一個地址。
接下來是發的過程。
CPU首先將IO地址放到系統總線上,接下來傳三條指令
- 是想讀還是想寫,是否開磁盤緩存等。
- 從哪兒讀:磁盤的LBA地址
- 讀到地址放到內存那里?
通過總線傳到磁盤控制器上。
接着磁盤控制器
主要做:
- 查找並尋道
- 通過
DMA
技術,也就是磁盤控制器可以直接對內存尋址並進行寫操作。(這樣可以解放CPU)
上述所說的過程均為CPU對磁盤發送某種指令的信息,告訴磁盤控制器應該怎么操作。而這一類的指令可以分為SCSI指令集和ATA指令集。SCSI指令集更高效。
所以所謂SCSI指令集
其實就是CPU告訴磁盤控制器到底是想讀還是想寫,從磁盤的那個位置開始,有多長等關鍵信息的規范
磁盤原理
本章所提到的磁盤主要指的是機械磁盤。
要了解磁盤主要需要通過如下幾個方面;
- 磁盤的結構
- 數據的組織方式
- 高層技術:隊列、無序存儲、磁盤緩存
- 磁盤接口技術
- 磁盤驅動程序
為什么需要磁盤
CPU的速度比內存塊100倍,比硬盤快100萬倍,也就是說磁盤速度是相當的慢的,有人說整個系統的速度就是被磁盤拖慢的。確實如此,但是為什么還需要磁盤呢?
內存的速度雖然快,但是斷電了怎么辦,而且硬盤是以TB甚至TB計算的,內存如果達到這么大的容量,價格將不可想象。
我們可以憧憬一下,人類如果造出一個能斷電存儲、容量還得大、訪問速度快最關鍵的要便宜的硬盤來,CPU就可以直接訪問硬盤了。但是在這之間,我們還是必須容忍CPU-內存-硬盤速度不匹配的問題,這才引出了諸多的解決方案,比如用緩存、DMA、多線程等
磁盤的結構
磁盤主要由盤片、磁頭、步進電機構成
- 硬盤一般是多個盤片固定在一個公共的轉軸上
- 主軸電機帶動盤片組高速旋轉產生高速氣流,將磁頭浮起;
- 磁頭組在電機的帶動下作徑向運動
通俗的說來,盤片上布滿磁性介質,類似於一張白紙,如果想在上面記錄的話,一般需要划格子,格子就是所謂的磁道。
因為盤片是圓的,所以就每個同心圓(磁道)就是類似於稿紙的一行,每一行上再分為若干的格子(扇區),磁頭就類似於打印噴頭
對於打印機來說,需要紙不斷的移動,但是這樣效率太低了,對於磁盤來說可以讓磁盤不斷的旋轉,然后移動磁頭來進行換行。
目前服務器中一般選擇1萬轉/s,可以獲得比較高的性價比。
- 磁道:同心圓
- 扇區:每個同心圓的上每段圓弧,是讀寫的最小單位
- 柱面:所有盤面上的同一磁道,在豎直方向上構成一個圓柱。
- 每個盤片上都有可以讀寫數據的磁頭。
需要注意的是,數據的讀寫是按照柱面來進行的,也就是說首先在同一柱面的內從0磁頭開始,依次向下在同一柱面的不同盤面上進行操作。為什么會這樣呢?因為這樣操作只需要改變電流,只需要通過電子切換,而不需要改變磁道(機械切換),速度更快。
我們需要記住一個規律
:把磁頭挪到指定的磁道的速度是非常慢的。
扇區尋址
了解了磁盤結構以后,我們來看一下磁盤如何尋址。
我們可以把尋找磁盤里面的數據想象成在一個小區里面找某一戶人家一樣。我們需要知道三個信息:在哪一棟、哪一層、哪一戶,然后就可以找到他了。同樣,找磁盤上的數據可以通過柱面(哪一棟)、磁頭(哪一層)、扇區(哪一戶)找到某個數據。
但是這種編碼方式比較的麻煩,不利於程序的編寫。就比如一戶人家在12棟3樓4號,並不直觀。那么我們可以用一個線性地址120304
來表示這戶人家的地址,顯然這種方法更利於編程。
所以我們可以將磁道磁頭扇區與另一種線性地址對應起來,這種對應關系保存在磁盤控制電路的ROM里面,可以在磁盤初始化的時候載入緩存以便查詢。
於是磁盤可以對外提供線性地址,即LBA(Logical block address)地址。可以將磁盤想象成只有一個磁道,是無限長的直線,扇區為上面的等長的線段,這樣可以屏蔽柱面、磁頭等比較復雜的東西,對外而言尋址方式更為簡便。
也就是說通過磁盤控制器可以對外屏蔽查找具體扇區的細節,進行邏輯的抽象,這樣就完成了物理地址到邏輯地址的抽象、虛擬、映射
磁盤高層技術
我們在前面的介紹中說過,磁盤進行磁道的切換最費時間,所以我們會通過多種方法來避免頻繁的磁道切換。如下就是比較常用的解決方案。
隊列技術
第一個指令向讓讀最外圈的數據,第二個指令向讀最內圈的數據,第三個指令又向讀最外圈的數據,如果按照這個順序來,需要頻繁的換道,我們知道換道時間非常長,是性能的瓶頸。
所以可以先切換到最外圈,執行完第一個指令,然后先執行第三個指令,最后再執行第二個指令,類似於電梯,每次把同方向的人都搭載上去。
無序傳輸技術
要求讀某些扇區的內容,如果不做優化的話,肯定直接傻乎乎的從開頭開始讀。但是實際上,有可能磁頭離數據段的末尾近啊。
那么我們完全可以無視讀出數據的順序,從離磁頭近的扇區開始讀。
磁盤緩存
磁盤的速度是相當慢的,所以與外界的內存、CPU的訪問有極大的矛盾。就好比一個團隊里面,有人做事快,有人做事慢,做事快的就會等做事慢的。
當然這種矛盾是無法調和的,那有什么折中的方法嗎?有,有句話叫笨鳥先飛
,所謂緩存就是笨鳥先飛。
比如說做事慢的人,雖然手腳不麻利,但是有個好處,記憶力好,而且勤奮。所以當事來了以后,他雖然沒辦法立刻給答復,但他可以先記住啊,然后告訴做事快的人先去忙。同樣,他也可以提前把一些事先做了,然后准備着。避免手忙腳亂。
回到磁盤上,緩存
其實就是一塊電路板上的RAM芯片,他的速度就很快,而且如果斷電的話,里面的數據會丟失。
緩存的主要的作用是:
- 接收指令和數據
- 進行預讀
有些資料說禁用磁盤緩存,這種說法容易造成誤解。
實際上禁用磁盤緩存就是Write Through(直通)模式,也就是說磁盤收到指令和數據並需要進行寫入的時候,不是在數據到達緩存的時候就返回成功,而是應該等到數據都落入盤片以后,才向控制器
返回成功信號。相當於禁用了緩存
實際上這種模式,數據還是會到達緩存。
SCSI指令中有兩個參數可以控制緩存:
- DPO(Disable PageOut):禁止緩存中的數據頁被換出,置了這個位的數據不能將其他數據換出。
- FUA:Force Unit Access:強制盤片訪問,也就是Write Through
所以如果DPO和FUA都置1了, 相當於完全不使用緩存的提速作用。
影響磁盤性能的因素
- 轉速:主要影響連續IO的吞吐量。因為轉得越快,數據傳輸時間越短。
- 尋道速度:主要影響隨機IO。因為隨機IO下,必須頻繁的換道。
- 單碟容量:單碟容量越高,單位空間內的數據量越大
- 接口速度:最不重要,因為目前的接口速度已經滿足了磁盤能達道的最高傳輸帶寬。
磁盤接口技術
不管硬盤內部多么復雜,一定需要向使用者提供接口,以屏蔽訪問的細節,這個接口不是物理的接口,而是硬盤面向外部的時候,為了被方便的使用,所提供的抽象的協議。
目前硬盤提供的物理接口
- 用於ATA指令的IDE接口
- 用於ATA指令的SATA接口
- 用於SCSI指令的並行SCSI接口
- 用於SCSI指令的串行SCSI(SAS)接口
- 用於SCSI指令系統,並且承載於FC協議的串行FC接口
列成表格如下
接口 | 英文 | 指令系統 | 備注 |
---|---|---|---|
IDE接口 | Parallel ATA(Advanced Technology Attachment) | ATA指令系統 | Integrated Drive Electronics |
SATA接口 | Serial ATA | ATA指令系統 | |
並行SCSI接口 | Parallel SCSI(small computer system interface) | SCSI指令系統 | |
SAS接口 | serial SCSI | SCSI指令系統 | |
FC接口 | Fibre Channel | SCSI指令系統 | 承載FC協議的串行SCSI接口 |
IDE硬盤接口
IDE,integrated Drive Electronics ,電子集成驅動器,本意是把控制電路、盤片、磁頭放到一個容器中的硬盤驅動器,制造比較容易。
IDE接口,也稱PATA接口,也即並行ATA
ATA協議需要主機更多參與IO,無法支持大量的並發訪問,適用於家用電腦和低端服務器;
SATA硬盤接口
SATA:串性ATA,用串行線路傳輸數據,但是指令集仍然是ATA。
下圖是IDE與SATA線纜的對比
SATA的優點是:
- 可以對指令及數據包進行CRC,而PATA只能對來回傳輸的數據進行較驗。
- 相對於IDE的80芯更節省空間。
目前SATA規范中接口速率為6Gb/s,有於SATA使用8bit/10bit編碼,所以6Gb/s相當於600MB/s的接口速率,但是實際上性能沒有得到多大的提升。
因為硬盤的速率瓶頸在於硬盤內部的尋道,而非傳輸,接口速率的提高最直接影響從緩存中的讀寫。
SCSI硬盤接口
SCSI接口更為靈活,而且性能也較高。
可以有8個或者16個SCSI設備連接在SCSI通道上,缺點是比較貴。因為一般需要配備價格不菲的SCSI卡,而且SCSI接口的設備在安裝、設置時比較麻煩。
SCSI總線連接圖:
一條總線上最多16個節點,各分配一個SCSI ID ,其中SCSI控制器需要占一個ID
SCSI卡上有一塊類似CPU的芯片可以對SCSI設備進行控制,減少了CPU的負擔,所以適合大量並發訪問場景,適用於企業級數據中心
SCSI卡將SCSI總線上的設備,經過PCI總線傳遞給內存中運行的SCSI卡的驅動程序
,讓OS知道所有設備。
下圖是SCSI總線與計算機總線的連接圖
可以看出SCSI卡一端接主機的PCI,一端用SCSI控制器接入SCSI總線。
多通道SCSI卡:如果一張卡上有多個控制器,每個控制器獨立掌管一條總線
多通道SCSI控制器卡示意圖
SCSI協議尋址方式
SCSI協議的尋址方式按照“控制器——通道——SCSI ID —— LUN ID (logic unit number) ”。
一個主機IO總線上可以有多個控制器,每個控制器可以有多條后端的SCSI總線(通道),每個SCSI總線上掛着8個或者16個SCSI設備,通過SCSI ID來區分。
然而SCSI ID不是最后一層地址,還有一個LUN ID 。 SCSI設備不能物理上再分割了,所以只能在邏輯上分,每個SCSI ID下面可以區分出若干的LUN ID 。這樣一條SCSI總線上可接入的邏輯存儲單元數量大大增加。
LUN對於傳統的SCSI總線意義不大,但是對帶RAID功能的SCSI接口磁盤陣列來說,因為會產生很多虛擬磁盤,所以可以使用LUN來擴充可尋址范圍。習慣上稱磁盤陣列生成的虛擬磁盤為LUN。
SCSI控制器也是總線上的一個節點,不過優先級必須是最高的。
磁盤控制器、驅動器控制器電路、磁盤控制器驅動程序的區別
磁盤控制器
硬盤的接口:
- 物理接口:硬盤接入磁盤控制器需要的接口
- 邏輯接口:指令系統,指令集定義了“怎么樣向磁盤發送數據和讀數據”,這套指令集是由專門的芯片來生成,這就是
磁盤控制器
磁盤控制器的作用:參與底層總線的初始化、仲裁過程,向驅動程序提供簡單的接口。
所以驅動程序
只需要將要讀寫的設備號、讀寫的初始地址、長度告訴控制器即可,其他的由控制器來完成
驅動器控制器電路
- 驅動器控制電路:位於磁盤的驅動器上,負責驅動磁頭臂來讀寫數據
- 磁盤控制器:向磁盤驅動器的控制器電路發送指令。
所以流程是,CPU通過總線發送指令給主板上的磁盤控制器,
磁盤控制器通過線纜發送指令給驅動器
驅動器控制磁盤進行讀寫。
CPU操作磁盤控制器的指令系統叫磁盤控制器
驅動程序
控制器收到指令通過電路邏輯運算生成的指令就是常說的ATA指令集或者SCSI指令集。
為什么在SCSI磁盤上安裝操作系統需要手動加載SCSI驅動?
機器剛通電,OS還沒啟動起來,所以也沒加載磁盤控制器驅動,如何訪問磁盤的呢?
這要從機器啟動的流程說起,系統的BIOS中存放了初始化系統的基本代碼,所以機器啟動后執行系統BIOS里面的代碼,里面有一步就是去查找磁盤控制器上的BIOS地址,然后去這個地方再執行其中的代碼以初始化控制器。
最后此BIOS讓CPU提取0磁道中的第1扇區的代碼,從而加載OS。
從上面的流程可以看出,系統BIOS會指示CPU查找磁盤控制器的BIOS地址,里面有最基本的磁盤控制器驅動程序。但是因為不完善,所以在OS內核啟動的過程中,會用自己的驅動來接管。
那么向SCSI磁盤上安裝OS,必須手動加載SCSI驅動就原因就不難解釋了。
因為CPU必須通過執行驅動程序才能向磁盤驅動器發指令,而磁盤控制器BIOS里面的代碼非常簡單,功能很有限,只能適用於啟動OS這種臨時任務。所以必須加載完整功能的驅動程序。
對於ATA磁盤來說,ATA已經是非常成熟的技術了,控制器一般都是Intel的,所以操作系統安裝程序在初始化執行的時候已經自行加載了驅動。
而SCSI磁盤的生產廠商很多,所以必須手動加載。
安裝了OS的系統,啟動之初從磁盤BIOS(ROM)中讀取驅動程序,此時的執行速度很慢,但是一旦將OS本身的驅動程序讀到了內存中以后,速度就可以增加。由於操作系統安裝以后,就具有磁盤的驅動程序了,所以不需要每次手動加載。
磁盤IOPS和吞吐量
衡量磁盤的性能最重要的兩個參數就是IOPS和吞吐量。
IOPS關注的就是每秒進行多少次的IO,跟隨機讀寫的快慢有關。
而吞吐量關注的是硬盤在傳輸數據的時候數據流的速度。
IOPS
IOPS:也就是每秒能進行多少次IO。這個值也不是固定的。
寫入10000個大小為1KB的文件,比寫入一個10MB的文件耗費更多的時間。
因為10000個文件需要做好幾萬次IO,而寫入10MB的大文件,因為是連續存放,所以只需要幾十個IO。
對於寫入10000個小文件,因為每秒需要的IO非常高,如果用具有較高IOPS的磁盤,將提速不少。寫入10MB文件,就算用了較高的IOPS也不會提升速度。因為只需要少量的IO。只有用較大傳輸帶寬的才會體現優勢。
傳輸帶寬
傳輸帶寬:硬盤在傳輸數據時的數據流的速度。
在同一塊硬盤寫入不同大小的數據,帶寬不同。
硬盤的帶寬如果高,在傳輸大塊的連續的數據時有優勢。
而具有高IOPS的硬盤在傳輸小塊的不連續的數據具有優勢。