一 磁盤物理結構
(1) 盤片:硬碟的盤體由多個盤片疊在一起構成,

在硬碟出廠時,由硬碟生產商完成了低級格式化(物理格式化),作用是將空白的盤片(Platter)劃分為一個個同圓心、不同半徑的磁道(Track),還將磁道劃分為若干個扇區(Sector),每個扇區可存盤128×2的N次方(N=0.1.2.3)位元組資訊,默認每個扇區的大小為512位元組,通常使用者無需再進行低級格式化操作,
(2) 磁頭:每張盤片的正反兩面各有一個磁頭,

(3) 主軸:所有盤片都由主軸電機帶動旋轉,

(4) 控制集成電路板:復雜!上面還有ROM(內有軟體系統)、Cache等,

二 磁盤如何完成單次IO操作
(1) 尋道
當控制器對磁盤發出一個IO操作命令的時候,磁盤的驅動臂(Actuator Arm)帶動磁頭(Head)離開著陸區(Landing Zone,位于內圈沒有資料的區域),移動到要操作的初始資料塊所在的磁道(Track)的正上方,這個程序被稱為尋道(Seeking),對應消耗的時間被稱為尋道時間(Seek Time);
(2) 旋轉延遲
找到對應磁道還不能馬上讀取資料,這時候磁頭要等到磁盤盤片(Platter)旋轉到初始資料塊所在的扇區(Sector)落在讀寫磁頭正下方之后才能開始讀取資料,在這個等待盤片旋轉到可操作扇區的程序中消耗的時間稱為旋轉延時(Rotational Latency);
(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(virtual log file)的存在,日志的讀寫理論上為連續訪問,但如果日志檔案設定為自動增長,且增量不大,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(On-Line Transaction Processing)的系統,經常讀寫小塊資料,多為隨機訪問,用IOPS來衡量讀寫性能;
對于資料倉庫,日志檔案,經常讀寫大塊資料,多為順序訪問,用吞吐量來衡量讀寫性能,
磁盤當前的IOPS,通過以下性能計數器查看:
LogicalDisk/Disk Transfers/sec
LogicalDisk/Disk Reads/sec
LogicalDisk/Disk Writes/sec
磁盤當前的吞吐量,通過以下性能計數器查看:
LogicalDisk/Disk Bytes/sec
LogicalDisk/Disk Read Bytes/sec
LogicalDisk/Disk Write Bytes/sec
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/238406.html
標籤:其他
