西西軟件園多重安全檢測(cè)下載網(wǎng)站、值得信賴的軟件下載站!
軟件
軟件
文章
搜索

首頁西西教程數(shù)據(jù)庫教程 → 磁盤讀寫和數(shù)據(jù)庫讀寫哪個(gè)更好?磁盤讀寫與數(shù)據(jù)庫的關(guān)系

磁盤讀寫和數(shù)據(jù)庫讀寫哪個(gè)更好?磁盤讀寫與數(shù)據(jù)庫的關(guān)系

相關(guān)軟件相關(guān)文章發(fā)表評(píng)論 來源:西西整理時(shí)間:2013/7/15 18:57:16字體大。A-A+

作者:西西點(diǎn)擊:220次評(píng)論:0次標(biāo)簽: 磁盤讀寫

  • 類型:磁盤工具大小:572KB語言:中文 評(píng)分:6.6
  • 標(biāo)簽:
立即下載

假定在程序效率和關(guān)鍵過程相當(dāng)且不計(jì)入緩存等措施的條件下,讀寫任何類型的數(shù)據(jù)都沒有直接操作文件來的快,不論MSYQL過程如何,最后都要到磁盤上去讀這個(gè)“文件”(記錄存儲(chǔ)區(qū)等效),所以當(dāng)然這一切的前提是只讀 內(nèi)容,無關(guān)任何排序或查找操作。

動(dòng)態(tài)網(wǎng)站一般都是用數(shù)據(jù)庫來存儲(chǔ)信息,如果信息的及時(shí)性要求不高 可以加入緩存來減少頻繁讀寫數(shù)據(jù)庫。

兩種方式一般都支持,但是繞過操作系統(tǒng)直接操作磁盤的性能較高,而且安全性也較高,數(shù)據(jù)庫系中的磁盤性能一直都是瓶頸,大型數(shù)據(jù)庫一般基于unix系統(tǒng),當(dāng)然win下也有,不常用應(yīng)為win的不可靠性,unix下,用的是裸設(shè)備raw設(shè)備,就是沒有加工過的設(shè)備(unix下的磁盤分區(qū)屬于特殊設(shè)備,以文件形式統(tǒng)一管理),由dbms直接管理,不通過操作系統(tǒng),效率很高,可靠性也高,因?yàn)榇疟P,cache和內(nèi)存都是自己管理的,大型數(shù)據(jù)庫系統(tǒng)db2,oracal,informix(不太流行了),mssql算不上大型數(shù)據(jù)庫系統(tǒng)。

1、直接讀文件相比數(shù)據(jù)庫查詢效率更勝一籌,而且文中還沒算上連接和斷開的時(shí)間。

2、一次讀取的內(nèi)容越大,直接讀文件的優(yōu)勢(shì)會(huì)越明顯(讀文件時(shí)間都是小幅增長,這跟文件存儲(chǔ)的連續(xù)性和簇大小等有關(guān)系),這個(gè)結(jié)果恰恰跟書生預(yù)料的相反,說明MYSQL對(duì)更大文件讀取可能又附加了某些操作(兩次時(shí)間增長了近30%),如果只是單純的賦值轉(zhuǎn)換應(yīng)該是差異偏小才對(duì)。

3、寫文件和INSERT幾乎不用測(cè)試就可以推測(cè)出,數(shù)據(jù)庫效率只會(huì)更差。
4、很小的配置文件如果不需要使用到數(shù)據(jù)庫特性,更加適合放到獨(dú)立文件里存取,無需單獨(dú)創(chuàng)建數(shù)據(jù)表或記錄,很大的文件比如圖片、音樂等采用文件存儲(chǔ)更為方便,只把路徑或縮略圖等索引信息放到數(shù)據(jù)庫里更合理一些。

5、PHP上如果只是讀文件,file_get_contents比fopen、fclose更有效率,不包括判斷存在這個(gè)函數(shù)時(shí)間會(huì)少3秒左右。
6、fetch_row和fetch_object應(yīng)該是從fetch_array轉(zhuǎn)換而來的,書生沒看過PHP的源碼,單從執(zhí)行上就可以說明fetch_array效率更高,這跟網(wǎng)上的說法似乎相反。

磁盤讀寫與數(shù)據(jù)庫的關(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 Delay);

(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í)間最長),所以在計(jì)算中我們只考慮平均尋道時(shí)間。

在購買磁盤時(shí),該參數(shù)都有標(biāo)明,目前的SATA/SAS磁盤,按轉(zhuǎn)速不同,尋道時(shí)間不同,不過通常都在10ms以下:

3. 傳送時(shí)間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。

(1) 磁盤傳輸速率
磁盤傳輸速率分兩種:內(nèi)部傳輸速率(Internal Transfer Rate),外部傳輸速率(External Transfer Rate)。

內(nèi)部傳輸速率(Internal Transfer Rate),是指磁頭與硬盤緩存之間的數(shù)據(jù)傳輸速率,簡單的說就是硬盤磁頭將數(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ù)庫發(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ù)庫的數(shù)據(jù)頁大小為例: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ì)變大,從而導(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í)長,IOPS的計(jì)算公式就變?yōu)椋篒OPS = 1000ms/傳送時(shí)間
IOPS = 1000ms/傳送時(shí)間= 1000ms/0.2ms = 5000 (次)

顯然這種極端的情況太過理想,畢竟每個(gè)磁道的空間是有限的,尋道時(shí)間 + 旋轉(zhuǎn)延遲 時(shí)長確實(shí)可以減少,不過是無法完全避免的。

四 數(shù)據(jù)庫中的磁盤讀寫
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ù)庫為例
數(shù)據(jù)文件,SQL Server統(tǒng)一區(qū)上的對(duì)象,是以extent(8*8k)為單位進(jìn)行空間分配的,數(shù)據(jù)存放是很隨機(jī)的,哪個(gè)數(shù)據(jù)頁有空間,就寫在哪里,除非通過文件組給每個(gè)表預(yù)分配足夠大的、單獨(dú)使用的文件,否則不能保證數(shù)據(jù)的連續(xù)性,通常為隨機(jī)訪問。
另外哪怕聚集索引表,也只是邏輯上的連續(xù),并不是物理上。

日志文件,由于有VLF的存在,日志的讀寫理論上為連續(xù)訪問,但如果日志文件設(shè)置為自動(dò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ù)庫為例
有的時(shí)候,盡管磁盤的IOPS(Disk Transfers/sec)還沒有太大,但是發(fā)現(xiàn)數(shù)據(jù)庫出現(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) 簡化業(yè)務(wù)邏輯,減少IO請(qǐng)求數(shù);
(2) 同一個(gè)實(shí)例下,多個(gè)數(shù)據(jù)庫遷移的不同實(shí)例下;
(3) 同一個(gè)數(shù)據(jù)庫的日志,數(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ù)庫為例
對(duì)于OLTP的系統(tǒng),經(jīng)常讀寫小塊數(shù)據(jù),多為隨機(jī)訪問,用IOPS來衡量讀寫性能;
對(duì)于數(shù)據(jù)倉庫,日志文件,經(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

    相關(guān)評(píng)論

    閱讀本文后您有什么感想? 已有人給出評(píng)價(jià)!

    • 8 喜歡喜歡
    • 3 頂
    • 1 難過難過
    • 5 囧
    • 3 圍觀圍觀
    • 2 無聊無聊

    熱門評(píng)論

    最新評(píng)論

    第 1 樓 湖北襄樊聯(lián)通 網(wǎng)友 客人 發(fā)表于: 2015/5/21 9:20:50
    不錯(cuò),寫的很好嘞

    支持( 0 ) 蓋樓(回復(fù))

    發(fā)表評(píng)論 查看所有評(píng)論(0)

    昵稱:
    表情: 高興 可 汗 我不要 害羞 好 下下下 送花 屎 親親
    字?jǐn)?shù): 0/500 (您的評(píng)論需要經(jīng)過審核才能顯示)