qileilove

          blog已經(jīng)轉(zhuǎn)移至github,大家請(qǐng)?jiān)L問 http://qaseven.github.io/

          磁盤讀寫與數(shù)據(jù)庫(kù)的關(guān)系

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

          posted on 2014-10-30 12:00 順其自然EVO 閱讀(448) 評(píng)論(0)  編輯  收藏 所屬分類: 數(shù)據(jù)庫(kù)

          <2014年10月>
          2829301234
          567891011
          12131415161718
          19202122232425
          2627282930311
          2345678

          導(dǎo)航

          統(tǒng)計(jì)

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 阿拉善左旗| 永州市| 韶山市| 汨罗市| 象山县| 子洲县| 金寨县| 巨野县| 武冈市| 谢通门县| 和平县| 共和县| 广德县| 商河县| 龙里县| 海原县| 扎兰屯市| 共和县| 张北县| 夏河县| 大港区| 昂仁县| 辽源市| 张家川| 景泰县| 商河县| 五寨县| 汝阳县| 行唐县| 叙永县| 东宁县| 班戈县| 阳谷县| 福建省| 黑水县| 临海市| 梁河县| 天津市| 许昌市| 剑河县| 盐源县|