一 磁盤物理結構
(1) 盤片:硬盤的盤體由多個盤片疊在一塊兒構成。數據庫
在硬盤出廠時,由硬盤生產商完成了低級格式化(物理格式化),做用是將空白的盤片(Platter)劃分爲一個個同圓心、不一樣半徑的磁道(Track),還將磁道劃分爲若干個扇區(Sector),每一個扇區可存儲128×2的N次方(N=0.1.2.3)字節信息,默認每一個扇區的大小爲512字節。一般使用者無需再進行低級格式化操做。緩存
(2) 磁頭:每張盤片的正反兩面各有一個磁頭。服務器
(3) 主軸:全部盤片都由主軸電機帶動旋轉。併發
(4) 控制集成電路板:複雜!上面還有ROM(內有軟件系統)、Cache等。dom
二 磁盤如何完成單次IO操做
(1) 尋道
當控制器對磁盤發出一個IO操做命令的時候,磁盤的驅動臂(Actuator Arm)帶動磁頭(Head)離開着陸區(Landing Zone,位於內圈沒有數據的區域),移動到要操做的初始數據塊所在的磁道(Track)的正上方,這個過程被稱爲尋道(Seeking),對應消耗的時間被稱爲尋道時間(Seek Time);性能
(2) 旋轉延遲
找到對應磁道還不能立刻讀取數據,這時候磁頭要等到磁盤盤片(Platter)旋轉到初始數據塊所在的扇區(Sector)落在讀寫磁頭正下方以後才能開始讀取數據,在這個等待盤片旋轉到可操做扇區的過程當中消耗的時間稱爲旋轉延時(Rotational Latency);spa
(3) 數據傳送
接下來就隨着盤片的旋轉,磁頭不斷的讀/寫相應的數據塊,直到完成此次IO所須要操做的所有數據,這個過程稱爲數據傳送(Data Transfer),對應的時間稱爲傳送時間(Transfer Time)。完成這三個步驟以後單次IO操做也就完成了。操作系統
根據磁盤單次IO操做的過程,能夠發現:
單次IO時間 = 尋道時間 + 旋轉延遲 + 傳送時間日誌
進而推算IOPS(IO per second)的公式爲:
IOPS = 1000ms/單次IO時間對象
三 磁盤IOPS計算
不一樣磁盤,它的尋道時間,旋轉延遲,數據傳送所需的時間各是多少?
1. 尋道時間
考慮到被讀寫的數據可能在磁盤的任意一個磁道,既有可能在磁盤的最內圈(尋道時間最短),也可能在磁盤的最外圈(尋道時間最長),因此在計算中咱們只考慮平均尋道時間。
在購買磁盤時,該參數都有標明,目前的SATA/SAS磁盤,按轉速不一樣,尋道時間不一樣,不過一般都在10ms如下:
轉速 |
平均尋道時間 |
15000rpm |
2~3ms |
10000rpm |
3~5ms |
7200rpm |
8~9ms |
2. 旋轉延時
和尋道同樣,當磁頭定位到磁道以後有可能正好在要讀寫扇區之上,這時候是不須要額外的延時就能夠馬上讀寫到數據,可是最壞的狀況確實要磁盤旋轉整整一圈以後磁頭才能讀取到數據,因此這裏也考慮的是平均旋轉延時,對於15000rpm的磁盤就是(60s/15000)*(1/2) = 2ms。
3. 傳送時間
(1) 磁盤傳輸速率
磁盤傳輸速率分兩種:內部傳輸速率(Internal Transfer Rate),外部傳輸速率(External Transfer Rate)。
內部傳輸速率(Internal Transfer Rate),是指磁頭與硬盤緩存之間的數據傳輸速率,簡單的說就是硬盤磁頭將數據從盤片上讀取出來,而後存儲在緩存內的速度。
理想的內部傳輸速率不存在尋道,旋轉延時,就一直在同一個磁道上讀數據並傳到緩存,顯然這是不可能的,由於單個磁道的存儲空間是有限的;
實際的內部傳輸速率包含了尋道和旋轉延時,目前家用磁盤,穩定的內部傳輸速率通常在30MB/s到45MB/s之間(服務器磁盤,應該會更高)。
外部傳輸速率(External Transfer Rate),是指硬盤緩存和系統總線之間的數據傳輸速率,也就是計算機經過硬盤接口從緩存中將數據讀出交給相應的硬盤控制器的速率。
硬盤廠商在硬盤參數中,一般也會給出一個最大傳輸速率,好比如今SATA3.0的6Gbit/s,換算一下就是6*1024/8,768MB/s,一般指的是硬盤接口對外的最大傳輸速率,固然實際使用中是達不到這個值的。
這裏計算IOPS,保守選擇實際內部傳輸速率,以40M/s爲例。
(2) 單次IO操做的大小
有了傳送速率,還要知道單次IO操做的大小(IO Chunk Size),才能夠算出單次IO的傳送時間。那麼磁盤單次IO的大小是多少?答案是:不肯定。
操做系統爲了提升 IO的性能而引入了文件系統緩存(File System Cache),系統會根據請求數據的狀況將多個來自IO的請求先放在緩存裏面,而後再一次性的提交給磁盤,也就是說對於數據庫發出的多個8K數據塊的讀操做有可能放在一個磁盤讀IO裏就處理了。
還有,有些存儲系統也是提供了緩存(Cache),接收到操做系統的IO請求以後也是會將多個操做系統的 IO請求合併成一個來處理。
不論是操做系統層面的緩存,仍是磁盤控制器層面的緩存,目的都只有一個,提升數據讀寫的效率。所以每次單獨的IO操做大小都是不同的,它主要取決於系統對於數據讀寫效率的判斷。這裏以SQL Server數據庫的數據頁大小爲例:8K。
(3) 傳送時間
傳送時間 = IO Chunk Size/Internal Transfer Rate = 8k/40M/s = 0.2ms
能夠發現:
(3.1) 若是IO Chunk Size大的話,傳送時間會變長,單次IO時間就也變長,從而致使IOPS變小;
(3.2) 機械磁盤的主要讀寫成本,都花在了尋址時間上,即:尋道時間 + 旋轉延遲,也就是磁盤臂的擺動,和磁盤的旋轉延遲。
(3.3) 若是粗略的計算IOPS,能夠忽略傳送時間,1000ms/(尋道時間 + 旋轉延遲)便可。
4. IOPS計算示例
以15000rpm爲例:
(1) 單次IO時間
單次IO時間 = 尋道時間 + 旋轉延遲 + 傳送時間 = 3ms + 2ms + 0.2 ms = 5.2 ms
(2) IOPS
IOPS = 1000ms/單次IO時間 = 1000ms/5.2ms = 192 (次)
這裏計算的是單塊磁盤的隨機訪問IOPS。
考慮一種極端的狀況,若是磁盤所有爲順序訪問,那麼就能夠忽略:尋道時間 + 旋轉延遲 的時長,IOPS的計算公式就變爲:IOPS = 1000ms/傳送時間
IOPS = 1000ms/傳送時間= 1000ms/0.2ms = 5000 (次)
顯然這種極端的狀況太過理想,畢竟每一個磁道的空間是有限的,尋道時間 + 旋轉延遲 時長確實能夠減小,不過是沒法徹底避免的。
四 數據庫中的磁盤讀寫
1. 隨機訪問和連續訪問
(1) 隨機訪問(Random Access)
指的是本次IO所給出的扇區地址和上次IO給出扇區地址相差比較大,這樣的話磁頭在兩次IO操做之間須要做比較大的移動動做才能從新開始讀/寫數據。
(2) 連續訪問(Sequential Access)
相反的,若是當次IO給出的扇區地址與上次IO結束的扇區地址一致或者是接近的話,那磁頭就能很快的開始此次IO操做,這樣的多個IO操做稱爲連續訪問。
(3) 以SQL Server數據庫爲例
數據文件,SQL Server統一區上的對象,是以extent(8*8k)爲單位進行空間分配的,數據存放是很隨機的,哪一個數據頁有空間,就寫在哪裏,除非經過文件組給每一個表預分配足夠大的、單獨使用的文件,不然不能保證數據的連續性,一般爲隨機訪問。
另外哪怕彙集索引表,也只是邏輯上的連續,並非物理上。
日誌文件,因爲有VLF的存在,日誌的讀寫理論上爲連續訪問,但若是日誌文件設置爲自動增加,且增量不大,VLF就會不少很小,那麼就也並非嚴格的連續訪問了。
2. 順序IO和併發IO
(1) 順序IO模式(Queue Mode)
磁盤控制器可能會一次對磁盤組發出一連串的IO命令,若是磁盤組一次只能執行一個IO命令,稱爲順序IO;
(2) 併發IO模式(Burst Mode)
當磁盤組能同時執行多個IO命令時,稱爲併發IO。併發IO只能發生在由多個磁盤組成的磁盤組上,單塊磁盤只能一次處理一個IO命令。
(3) 以SQL Server數據庫爲例
有的時候,儘管磁盤的IOPS(Disk Transfers/sec)尚未太大,可是發現數據庫出現IO等待,爲何?一般是由於有了磁盤請求隊列,有過多的IO請求堆積。
磁盤的請求隊列和繁忙程度,經過如下性能計數器查看:
LogicalDisk/Avg.Disk Queue Length
LogicalDisk/Current Disk Queue Length
LogicalDisk/%Disk Time
這種狀況下,能夠作的是:
(1) 簡化業務邏輯,減小IO請求數;
(2) 同一個實例下的多個用戶數據庫,遷移到不一樣實例下;
(3) 同一個數據庫的日誌、數據文件,分離到不一樣的存儲單元;
(4) 藉助HA策略,作讀寫操做的分離。
3. IOPS和吞吐量(throughput)
(1) IOPS
IOPS即每秒進行讀寫(I/O)操做的次數。在計算傳送時間時,有提到:若是IO Chunk Size大的話,那麼IOPS會變小,假設以100M爲單位讀寫數據,那麼IOPS就會很小。
(2) 吞吐量(throughput)
吞吐量指每秒能夠讀寫的字節數。一樣假設以100M爲單位讀寫數據,儘管IOPS很小,可是每秒讀寫了N*100M的數據,吞吐量並不小。
(3) 以SQL Server數據庫爲例
對於OLTP的系統,常常讀寫小塊數據,多爲隨機訪問,用IOPS來衡量讀寫性能;
對於數據倉庫,日誌文件,常常讀寫大塊數據,多爲順序訪問,用吞吐量來衡量讀寫性能。
磁盤當前的IOPS,經過如下性能計數器查看:
LogicalDisk/Disk Transfers/sec
LogicalDisk/Disk Reads/sec
LogicalDisk/Disk Writes/sec
磁盤當前的吞吐量,經過如下性能計數器查看:LogicalDisk/Disk Bytes/secLogicalDisk/Disk Read Bytes/secLogicalDisk/Disk Write Bytes/sec