0. 磁盤讀寫與數據庫的關係 -- 轉載

原文鏈接:http://www.cnblogs.com/seusoftware/p/3191555.html

一 磁盤物理結構
(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的存在,日誌的讀寫理論上爲連續訪問,但如果日誌文件設置爲自動增長,且增量不大,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/sec
LogicalDisk/Disk Read Bytes/sec
LogicalDisk/Disk Write Bytes/sec

 
 
分類: 磁盤存儲
綠色通道: 好文要頂 關注我 收藏該文與我聯繫 
4
0
 
(請您對文章做出評價)
 
» 下一篇:1. RAID在數據庫存儲上的應用
posted @ 2013-07-15 17:22 張騫 閱讀(889) 評論(21編輯 收藏
 
 
#1樓 2013-07-15 17:47 gqzhao  
寫的不錯。支持一下。
#2樓 2013-07-15 18:06 勇攀高峯  
不錯,支持下
#3樓 2013-07-15 18:30 Joe.TJ  
支援騫哥!
#4樓 2013-07-15 18:32 靈感之源  
不論是數據庫查詢還是普通文件讀寫做到深一些的優化,就得考慮物理IO這級別的

7200RPM,每分鐘才能100多一點的讀寫操作,所以讀寫一般都會選擇逐個chunk(譬如8K,64K,1MB)這樣讀寫。

再進一步,不是單磁盤,因爲數據庫等IO操作支持Data/Log一起讀寫,如果data/log放到不同的物理磁盤,越多的spindle,越快的速度。所以服務器做RAID,不僅僅是爲了容錯和安全,還爲了提升性能
#5樓 2013-07-15 23:01 Never_say  
寫的很好。
磁盤現在也分很多種
#6樓 2013-07-16 08:24 AlanWang  
圖片很直觀
一直有一個問題,弄不清楚。

當往硬盤裏寫一個文件的時候,比如一個40M的文件。

假設硬盤有四個盤片,八個盤面(一個盤片正反兩面),八個磁頭。把這40M的文件寫進去,是都寫在一個盤面;還是說分成八份,同時寫到八個盤面裏。

爲啥有這種想法呢?因爲速度相差八倍。

不過現在不考慮了,因爲ssd了。ssd硬盤就是同時往多塊存儲卡里寫文件的,所以他的速度纔會比機械硬盤快。

ps:順便說一下,現在市場上的ssd,裏面都是閃存卡,相當於U盤。

不信的話,可以對比一下內存、U盤、ssd的價格(1 M多少錢)。
#8樓[樓主2013-07-16 09:19 張騫  
@Joe.TJ
你是羣裏的joe?
#9樓[樓主2013-07-16 09:23 張騫  
@靈感之源
說的很對,RAID一是容災,再就是提供併發IO。做了RAID,IOPS的算法也有不一樣哦
#10樓[樓主2013-07-16 09:30 張騫  
@金色海洋(jyk)陽光男孩
按我測試下來,SSD的連續訪問比機械磁盤沒太大優勢的,SSD的優勢主要在隨機訪問,因爲沒有磁盤臂的擺動和旋轉延時,機械盤單純的傳送時間也是很短的,所以我們用機械盤做數據庫文件存放時,纔會考慮儘量減少碎片,保證文件的連續性,就是爲了能更多的使用連續訪問。
#11樓 2013-07-16 10:07 _cc  
支持一下,寫的很清楚。
#12樓 2013-07-16 10:16 Joe.TJ  
@張騫
是的。跟你一起兩個羣的Joe。
#13樓 2013-07-16 10:22 攀攀  
寫的蠻好
#14樓[樓主2013-07-16 10:24 張騫  
@Joe.TJ
一不小心就碰到熟人了
#15樓 2013-07-16 10:55 dgdyq  
請教下樓主,服務器的RAID,例如我用8塊SAS硬盤做1個RAID1+0(這個就一個RAID,那麼就分四個區),
8塊硬盤做四個RAID1(既然是四個RAID,那麼我操作系統放在一個RAID上,SQL數據放在1個RAID上,日誌放在1個RAID上),
這兩種RAID配置那種讀寫速度會更好?
或者說,那種比較適合做服務器磁盤RAID?
請說說原理?
#16樓[樓主2013-07-16 11:23 張騫  
@dgdyq
讀寫速度上RAID10是好過RAID1的,至於實際效果,要根據你的業務系統測試過才知道
#17樓 2013-07-16 11:33 在路上—書生  
學習了
@張騫
引用@金色海洋(jyk)陽光男孩
按我測試下來,SSD的連續訪問比機械磁盤沒太大優勢的,SSD的優勢主要在隨機訪問,因爲沒有磁盤臂的擺動和旋轉延時,機械盤單純的傳送時間也是很短的,所以我們用機械盤做數據庫文件存放時,纔會考慮儘量減少碎片,保證文件的連續性,就是爲了能更多的使用連續訪問。



其實ssd的優勢被接口速度給限制了。

現在 sata ||| 的最大速度才500MB ,ssd再快,也超不過這個速度,除非接口再次升級。

ssd的優勢是可以“無限併發”,就是做raid。 可以把一個文件分成n份,向n個“存儲芯片”一起寫入。

不考慮成本,不考慮接口限制,他的速度可以達到多少?

關於成本,內存也好、u盤也好、ssd也好,一直都是降價的趨勢(當然硬盤也是一直在降價)。

所以成本越來越不是問題。

剩下的就是接口了。已經出到第三代了,第四代、第五代沒可能出不來吧。速度也會越來越快。

ssd可以輕鬆跟上,但是機械硬盤呢?可以輕鬆跟上嗎?

成本降下來,就是ssd的天下了,就好比液晶顯示器代替CRT顯示器一樣。
#19樓[樓主2013-07-16 14:08 張騫  
@金色海洋(jyk)陽光男孩
ssd還沒有達到接口的限速吧,按吞吐量來算,1M的Chunk size,ssd讀寫可以達到150~200M/s,hhd的吞吐量也是可以達到150M/s左右的;
ssd的優勢在於隨機訪問,讀取的時候可以達到10000+的IOPS,寫的話要比讀差很多,大概2000+,在oltp系統中,引進ssd還是很有幫助的。
#20樓 2013-07-17 11:45 樺仔  
先收藏了
#21樓 2013-07-17 13:18 CareySon  
@張騫
是的,SSD用來提高IOPS,用在提高吞吐量的話就太浪費了

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章