国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
IO系統(tǒng)性能

IO系統(tǒng)性能之一:衡量性能的幾個(gè)指標(biāo)



注意:本系列文章中所涉及的性能都是指磁盤(Magnetic Disks)IO性能,不考慮網(wǎng)絡(luò)以及其他的性質(zhì)的IO性能。


前言

作為一個(gè)數(shù)據(jù)庫管理員,關(guān)注系統(tǒng)的性能是日常最重要的工作之一,而在所關(guān)注的各方面的性能只能IO性能卻是最令人頭痛的一塊,面對著各種生澀的參數(shù)和令人眼花繚亂的新奇的術(shù)語,再加上存儲廠商的忽悠,總是讓我們有種云里霧里的感覺。本系列文章試圖從基本概念開始對磁盤存儲相關(guān)的各種概念進(jìn)行綜合歸納,讓大家能夠?qū)O性能相關(guān)的基本概念,IO性能的監(jiān)控和調(diào)整有個(gè)比較全面的了解。

在這一部分里我們先舍棄各種結(jié)構(gòu)復(fù)雜的存儲系統(tǒng),直接研究一個(gè)單獨(dú)的磁盤的性能問題,藉此了解各個(gè)衡量IO系統(tǒng)系能的各個(gè)指標(biāo)以及之間的關(guān)系。


幾個(gè)基本的概念

在研究磁盤性能之前我們必須先了解磁盤的結(jié)構(gòu),以及工作原理。不過在這里就不再重復(fù)說明了,關(guān)系硬盤結(jié)構(gòu)和工作原理的信息可以參考維基百科上面的相關(guān)詞條——Hard disk drive(英文)硬盤驅(qū)動(dòng)器(中文)。

讀寫IO(Read/Write IO)操作
磁盤是用來給我們存取數(shù)據(jù)用的,因此當(dāng)說到IO操作的時(shí)候,就會(huì)存在兩種相對應(yīng)的操作,存數(shù)據(jù)時(shí)候?qū)?yīng)的是寫IO操作,取數(shù)據(jù)的時(shí)候?qū)?yīng)的是是讀IO操作。
單個(gè)IO操作
當(dāng)控制磁盤的控制器接到操作系統(tǒng)的讀IO操作指令的時(shí)候,控制器就會(huì)給磁盤發(fā)出一個(gè)讀數(shù)據(jù)的指令,并同時(shí)將要讀取的數(shù)據(jù)塊的地址傳遞給磁盤,然后磁盤會(huì)將讀取到的數(shù)據(jù)傳給控制器,并由控制器返回給操作系統(tǒng),完成一個(gè)寫IO的操作;同樣的,一個(gè)寫IO的操作也類似,控制器接到寫的IO操作的指令和要寫入的數(shù)據(jù),并將其傳遞給磁盤,磁盤在數(shù)據(jù)寫入完成之后將操作結(jié)果傳遞回控制器,再由控制器返回給操作系統(tǒng),完成一個(gè)寫IO的操作。單個(gè)IO操作指的就是完成一個(gè)寫IO或者是讀IO的操作。
隨機(jī)訪問(Random Access)與連續(xù)訪問(Sequential Access)
隨機(jī)訪問指的是本次IO所給出的扇區(qū)地址和上次IO給出扇區(qū)地址相差比較大,這樣的話磁頭在兩次IO操作之間需要作比較大的移動(dòng)動(dòng)作才能重新開始讀/寫數(shù)據(jù)。相反的,如果當(dāng)次IO給出的扇區(qū)地址與上次IO結(jié)束的扇區(qū)地址一致或者是接近的話,那磁頭就能很快的開始這次IO操作,這樣的多個(gè)IO操作稱為連續(xù)訪問。因此盡管相鄰的兩次IO操作在同一時(shí)刻發(fā)出,但如果它們的請求的扇區(qū)地址相差很大的話也只能稱為隨機(jī)訪問,而非連續(xù)訪問。
順序IO模式(Queue Mode)/并發(fā)IO模式(Burst Mode)
磁盤控制器可能會(huì)一次對磁盤組發(fā)出一連串的IO命令,如果磁盤組一次只能執(zhí)行一個(gè)IO命令時(shí)稱為順序IO;當(dāng)磁盤組能同時(shí)執(zhí)行多個(gè)IO命令時(shí),稱為并發(fā)IO。并發(fā)IO只能發(fā)生在由多個(gè)磁盤組成的磁盤組上,單塊磁盤只能一次處理一個(gè)IO命令。


單個(gè)IO的大小(IO Chunk Size)

熟悉數(shù)據(jù)庫的人都會(huì)有這么一個(gè)概念,那就是數(shù)據(jù)庫存儲有個(gè)基本的塊大小(Block Size),不管是SQL Server還是Oracle,默認(rèn)的塊大小都是8KB,就是數(shù)據(jù)庫每次讀寫都是以8k為單位的。那么對于數(shù)據(jù)庫應(yīng)用發(fā)出的固定8k大小的單次讀寫到了寫磁盤這個(gè)層面會(huì)是怎么樣的呢,就是對于讀寫磁盤來說單個(gè)IO操作操作數(shù)據(jù)的大小是多少呢,是不是也是一個(gè)固定的值?答案是不確定。首先操作系統(tǒng)為了提高 IO的性能而引入了文件系統(tǒng)緩存(File System Cache),系統(tǒng)會(huì)根據(jù)請求數(shù)據(jù)的情況將多個(gè)來自IO的請求先放在緩存里面,然后再一次性的提交給磁盤,也就是說對于數(shù)據(jù)庫發(fā)出的多個(gè)8K數(shù)據(jù)塊的讀操作有可能放在一個(gè)磁盤讀IO里就處理了。還有對于有些存儲系統(tǒng)也是提供了緩存(Cache)的,接收到操作系統(tǒng)的IO請求之后也是會(huì)將多個(gè)操作系統(tǒng)的 IO請求合并成一個(gè)來處理。不管是操作系統(tǒng)層面的緩存還是磁盤控制器層面的緩存,目的都只有一個(gè),提高數(shù)據(jù)讀寫的效率。因此每次單獨(dú)的IO操作大小都是不一樣的,它主要取決于系統(tǒng)對于數(shù)據(jù)讀寫效率的判斷。

當(dāng)一次IO操作大小比較小的時(shí)候我們成為小的IO操作,比如說1K,4K,8K這樣的;當(dāng)一次IO操作的數(shù)據(jù)量比較的的時(shí)候稱為大IO操作,比如說32K,64K甚至更大。

在我們說到塊大小(Block Size)的時(shí)候通常我們會(huì)接觸到多個(gè)類似的概念,像我們上面提到的那個(gè)在數(shù)據(jù)庫里面的數(shù)據(jù)最小的管理單位,Oralce稱之為塊(Block),大小一般為8K,SQL Server稱之為頁(Page),一般大小也為8k。在文件系統(tǒng)里面我們也能碰到一個(gè)文件系統(tǒng)的塊,在現(xiàn)在很多的Linux系統(tǒng)中都是4K(通過 /usr/bin/time -v可以看到),它的作用其實(shí)跟數(shù)據(jù)庫里面的塊/頁是一樣的,都是為了方便數(shù)據(jù)的管理。但是說到單次IO的大小,跟這些塊的大小都是沒有直接關(guān)系的,在英文里單次IO大小通常被稱為是IO Chunk Size,不會(huì)說成是IO Block Size的。


IOPS(IO per Second)

IOPS,IO系統(tǒng)每秒所執(zhí)行IO操作的次數(shù),是一個(gè)重要的用來衡量系統(tǒng)IO能力的一個(gè)參數(shù)。對于單個(gè)磁盤組成的IO系統(tǒng)來說,計(jì)算它的IOPS不是一件很難的事情,只要我們知道了系統(tǒng)完成一次IO所需要的時(shí)間的話我們就能推算出系統(tǒng)IOPS來。

現(xiàn)在我們就來推算一下磁盤的IOPS,假設(shè)磁盤的轉(zhuǎn)速(Rotational Speed)為15K RPM,平均尋道時(shí)間為5ms,最大傳輸速率為40MB/s(這里將讀寫速度視為一樣,實(shí)際會(huì)差別比較大)。

對于磁盤來說一個(gè)完整的IO操作是這樣進(jìn)行的:當(dāng)控制器對磁盤發(fā)出一個(gè)IO操作命令的時(shí)候,磁盤的驅(qū)動(dòng)臂(Actuator Arm)帶讀寫磁頭(Head)離開著陸區(qū)(Landing Zone,位于內(nèi)圈沒有數(shù)據(jù)的區(qū)域),移動(dòng)到要操作的初始數(shù)據(jù)塊所在的磁道(Track)的正上方,這個(gè)過程被稱為尋址(Seeking),對應(yīng)消耗的時(shí)間被稱為尋址時(shí)間(Seek Time);但是找到對應(yīng)磁道還不能馬上讀取數(shù)據(jù),這時(shí)候磁頭要等到磁盤盤片(Platter)旋轉(zhuǎn)到初始數(shù)據(jù)塊所在的扇區(qū)(Sector)落在讀寫磁頭正上方的之后才能開始讀取數(shù)據(jù),在這個(gè)等待盤片旋轉(zhuǎn)到可操作扇區(qū)的過程中消耗的時(shí)間稱為旋轉(zhuǎn)延時(shí)(Rotational Delay);接下來就隨著盤片的旋轉(zhuǎn),磁頭不斷的讀/寫相應(yīng)的數(shù)據(jù)塊,直到完成這次IO所需要操作的全部數(shù)據(jù),這個(gè)過程稱為數(shù)據(jù)傳送(Data Transfer),對應(yīng)的時(shí)間稱為傳送時(shí)間(Transfer Time)。完成這三個(gè)步驟之后一次IO操作也就完成了。

在我們看硬盤廠商的宣傳單的時(shí)候我們經(jīng)常能看到3個(gè)參數(shù),分別是平均尋址時(shí)間、盤片旋轉(zhuǎn)速度以及最大傳送速度,這三個(gè)參數(shù)就可以提供給我們計(jì)算上述三個(gè)步驟的時(shí)間。

第一個(gè)尋址時(shí)間,考慮到被讀寫的數(shù)據(jù)可能在磁盤的任意一個(gè)磁道,既有可能在磁盤的最內(nèi)圈(尋址時(shí)間最短),也可能在磁盤的最外圈(尋址時(shí)間最長),所以在計(jì)算中我們只考慮平均尋址時(shí)間,也就是磁盤參數(shù)中標(biāo)明的那個(gè)平均尋址時(shí)間,這里就采用當(dāng)前最多的10krmp硬盤的5ms。

第二個(gè)旋轉(zhuǎn)延時(shí),和尋址一樣,當(dāng)磁頭定位到磁道之后有可能正好在要讀寫扇區(qū)之上,這時(shí)候是不需要額外額延時(shí)就可以立刻讀寫到數(shù)據(jù),但是最壞的情況確實(shí)要磁盤旋轉(zhuǎn)整整一圈之后磁頭才能讀取到數(shù)據(jù),所以這里我們也考慮的是平均旋轉(zhuǎn)延時(shí),對于10krpm的磁盤就是(60s/15k)*(1/2) = 2ms。

第三個(gè)傳送時(shí)間,磁盤參數(shù)提供我們的最大的傳輸速度,當(dāng)然要達(dá)到這種速度是很有難度的,但是這個(gè)速度卻是磁盤純讀寫磁盤的速度,因此只要給定了單次 IO的大小,我們就知道磁盤需要花費(fèi)多少時(shí)間在數(shù)據(jù)傳送上,這個(gè)時(shí)間就是IO Chunk Size / Max Transfer Rate。

現(xiàn)在我們就可以得出這樣的計(jì)算單次IO時(shí)間的公式:

IO Time = Seek Time + 60 sec/Rotational Speed/2 + IO Chunk Size/Transfer Rate

于是我們可以這樣計(jì)算出IOPS

IOPS = 1/IO Time = 1/(Seek Time + 60 sec/Rotational Speed/2 + IO Chunk Size/Transfer Rate)

對于給定不同的IO大小我們可以得出下面的一系列的數(shù)據(jù)

4K (1/7.1 ms = 140 IOPS)
    
5ms + (60sec/15000RPM/2) + 4K/40MB = 5 + 2 + 0.1 = 7.1
8k (1/7.2 ms = 139 IOPS)
    
5ms + (60sec/15000RPM/2) + 8K/40MB = 5 + 2 + 0.2 = 7.2
16K (1/7.4 ms = 135 IOPS)
    
5ms + (60sec/15000RPM/2) + 16K/40MB = 5 + 2 + 0.4 = 7.4
32K (1/7.8 ms = 128 IOPS)
    
5ms + (60sec/15000RPM/2) + 32K/40MB = 5 + 2 + 0.8 = 7.8
64K (1/8.6 ms = 116 IOPS)
    
5ms + (60sec/15000RPM/2) + 64K/40MB = 5 + 2 + 1.6 = 8.6

從上面的數(shù)據(jù)可以看出,當(dāng)單次IO越小的時(shí)候,單次IO所耗費(fèi)的時(shí)間也越少,相應(yīng)的IOPS也就越大。

上面我們的數(shù)據(jù)都是在一個(gè)比較理想的假設(shè)下得出來的,這里的理想的情況就是磁盤要花費(fèi)平均大小的尋址時(shí)間和平均的旋轉(zhuǎn)延時(shí),這個(gè)假設(shè)其實(shí)是比較符合我們實(shí)際情況中的隨機(jī)讀寫,在隨機(jī)讀寫中,每次IO操作的尋址時(shí)間和旋轉(zhuǎn)延時(shí)都不能忽略不計(jì),有了這兩個(gè)時(shí)間的存在也就限制了IOPS的大小。現(xiàn)在我們考慮一種相對極端的順序讀寫操作,比如說在讀取一個(gè)很大的存儲連續(xù)分布在磁盤的的文件,因?yàn)槲募拇鎯Φ姆植际沁B續(xù)的,磁頭在完成一個(gè)讀IO操作之后,不需要從新的尋址,也不需要旋轉(zhuǎn)延時(shí),在這種情況下我們能到一個(gè)很大的IOPS值,如下

4K (1/0.1 ms = 10000 IOPS)
    
0ms + 0ms + 4K/40MB = 0.1
8k (1/0.2 ms = 5000 IOPS)
    
0ms + 0ms + 8K/40MB = 0.2
16K (1/0.4 ms = 2500 IOPS)
    
0ms + 0ms + 16K/40MB = 0.4
32K (1/0.8 ms = 1250 IOPS)
    
0ms + 0ms + 32K/40MB = 0.8
64K (1/1.6 ms = 625 IOPS)
    
0ms + 0ms + 64K/40MB = 1.6

相比第一組數(shù)據(jù)來說差距是非常的大的,因此當(dāng)我們要用IOPS來衡量一個(gè)IO系統(tǒng)的系能的時(shí)候我們一定要說清楚是在什么情況的IOPS,也就是要說明讀寫的方式以及單次IO的大小,當(dāng)然在實(shí)際當(dāng)中,特別是在OLTP的系統(tǒng)的,隨機(jī)的小IO的讀寫是最有說服力的。


傳輸速度(Transfer Rate)/吞吐率(Throughput)

現(xiàn)在我們要說的傳輸速度(另一個(gè)常見的說法是吞吐率)不是磁盤上所表明的最大傳輸速度或者說理想傳輸速度,而是磁盤在實(shí)際使用的時(shí)候從磁盤系統(tǒng)總線上流過的數(shù)據(jù)量。有了IOPS數(shù)據(jù)之后我們是很容易就能計(jì)算出對應(yīng)的傳輸速度來的

Transfer Rate = IOPS * IO Chunk Size

還是那上面的第一組IOPS的數(shù)據(jù)我們可以得出相應(yīng)的傳輸速度如下

4K: 140 * 4K  =  560K / 40M = 1.36%
 
8K: 139 * 8K  = 1112K / 40M = 2.71%
16K: 135 * 16K = 2160K / 40M = 5.27%
32K: 116 * 32K = 3712K / 40M = 9.06%

可以看出實(shí)際上的傳輸速度是很小的,對總線的利用率也是非常的小。

這里一定要明確一個(gè)概念,那就是盡管上面我們使用IOPS來計(jì)算傳輸速度,但是實(shí)際上傳輸速度和IOPS是沒有直接關(guān)系,在沒有緩存的情況下它們共同的決定因素都是對磁盤系統(tǒng)的訪問方式以及單個(gè)IO的大小。對磁盤進(jìn)行隨機(jī)訪問時(shí)候我們可以利用IOPS來衡量一個(gè)磁盤系統(tǒng)的性能,此時(shí)的傳輸速度不會(huì)太大;但是當(dāng)對磁盤進(jìn)行連續(xù)訪問時(shí),此時(shí)的IOPS已經(jīng)沒有了參考的價(jià)值,這個(gè)時(shí)候限制實(shí)際傳輸速度卻是磁盤的最大傳輸速度。因此在實(shí)際的應(yīng)用當(dāng)中,只會(huì)用IOPS來衡量小IO的隨機(jī)讀寫的性能,而當(dāng)要衡量大IO連續(xù)讀寫的性能的時(shí)候就要采用傳輸速度而不能是IOPS了。


IO響應(yīng)時(shí)間(IO Response Time)

最后來關(guān)注一下能直接描述IO性能的IO響應(yīng)時(shí)間。IO響應(yīng)時(shí)間也被稱為IO延時(shí)(IO Latency),IO響應(yīng)時(shí)間就是從操作系統(tǒng)內(nèi)核發(fā)出的一個(gè)讀或者寫的IO命令到操作系統(tǒng)內(nèi)核接收到IO回應(yīng)的時(shí)間,注意不要和單個(gè)IO時(shí)間混淆了,單個(gè)IO時(shí)間僅僅指的是IO操作在磁盤內(nèi)部處理的時(shí)間,而IO響應(yīng)時(shí)間還要包括IO操作在IO等待隊(duì)列中所花費(fèi)的等待時(shí)間。

計(jì)算IO操作在等待隊(duì)列里面消耗的時(shí)間有一個(gè)衍生于利托氏定理(Little’s Law)的排隊(duì)模型M/M/1模型可以遵循,由于排隊(duì)模型算法比較復(fù)雜,到現(xiàn)在還沒有搞太明白(如果有誰對M/M/1模型比較精通的話歡迎給予指導(dǎo)),這里就羅列一下最后的結(jié)果,還是那上面計(jì)算的IOPS數(shù)據(jù)來說:

8K IO Chunk Size (135 IOPS, 7.2 ms)
    
135 => 240.0 ms
    
105 => 29.5 ms
    
75  => 15.7 ms
    
45  => 10.6 ms
 
64K IO Chunk Size(116 IOPS, 8.6 ms)
    
135 => 沒響應(yīng)了……
    
105 => 88.6 ms
    
75  => 24.6 ms
    
45  => 14.6 ms

從上面的數(shù)據(jù)可以看出,隨著系統(tǒng)實(shí)際IOPS越接近理論的最大值,IO的響應(yīng)時(shí)間會(huì)成非線性的增長,越是接近最大值,響應(yīng)時(shí)間就變得越大,而且會(huì)比預(yù)期超出很多。一般來說在實(shí)際的應(yīng)用中有一個(gè)70%的指導(dǎo)值,也就是說在IO讀寫的隊(duì)列中,當(dāng)隊(duì)列大小小于最大IOPS的70%的時(shí)候,IO的響應(yīng)時(shí)間增加會(huì)很小,相對來說讓人比較能接受的,一旦超過70%,響應(yīng)時(shí)間就會(huì)戲劇性的暴增,所以當(dāng)一個(gè)系統(tǒng)的IO壓力超出最大可承受壓力的70%的時(shí)候就是必須要考慮調(diào)整或升級了。

另外補(bǔ)充說一下這個(gè)70%的指導(dǎo)值也適用于CPU響應(yīng)時(shí)間,這也是在實(shí)踐中證明過的,一旦CPU超過70%,系統(tǒng)將會(huì)變得受不了的慢。很有意思的東西。


IO系統(tǒng)性能之二:緩存和RAID如何提高磁盤IO性能



上一篇文章的計(jì)算中我們可以看到一個(gè)15k轉(zhuǎn)速的磁盤在隨機(jī)讀寫訪問的情況下IOPS竟然只有140左右,但在實(shí)際應(yīng)用中我們卻能看到很多標(biāo)有5000IOPS甚至更高的存儲系統(tǒng),有這么大IOPS的存儲系統(tǒng)怎么來的呢?這就要?dú)w結(jié)于各種存儲技術(shù)的使用了,在這些存儲技術(shù)中使用最廣的就是高速緩存(Cache)和磁盤冗余陣列(RAID)了,本文就將探討緩存和磁盤陣列提高存儲IO性能的方法。


高速緩存(Cache)

在當(dāng)下的各種存儲產(chǎn)品中,按照速度從快到慢應(yīng)該就是內(nèi)存>閃存>磁盤>磁帶了,然而速度越快也就意味著價(jià)格越高,閃存雖然說是發(fā)展勢頭很好,但目前來說卻還是因?yàn)閮r(jià)格問題無法普及,因此現(xiàn)在還是一個(gè)磁盤作霸王的時(shí)代。與CPU和內(nèi)存速度相比,磁盤的速度無疑是計(jì)算機(jī)系統(tǒng)中最大的瓶頸了,所以在必須使用磁盤而又想提高性能的情況下,人們想出了在磁盤中嵌入一塊高速的內(nèi)存用來保存經(jīng)常訪問的數(shù)據(jù)從而提高讀寫效率的方法來折中的解決,這塊嵌入的內(nèi)存就被稱為高速緩存。

說到緩存,這東西應(yīng)用現(xiàn)在已經(jīng)是無處不在,從處于上層的應(yīng)用,到操作系統(tǒng)層,再到磁盤控制器,還有CPU內(nèi)部,單個(gè)磁盤的內(nèi)部也都存在緩存,所有這些緩存存在的目的都是相同的,就是提高系統(tǒng)執(zhí)行的效率。當(dāng)然在這里我們只關(guān)心跟IO性能相關(guān)的緩存,與IO性能直接相關(guān)的幾個(gè)緩存分別是文件系統(tǒng)緩存(File System Cache)、磁盤控制器緩存(Disk Controller Cache)和磁盤緩存(Disk Cache,也稱為Disk Buffer),不過當(dāng)在計(jì)算一個(gè)磁盤系統(tǒng)性能的時(shí)候文件系統(tǒng)緩存也是不會(huì)考慮在內(nèi)的,因此我們重點(diǎn)考察的就是磁盤控制器緩存和磁盤緩存。

不管是控制器緩存還是磁盤緩存,他們所起的作用主要是分為三部分:緩存數(shù)據(jù)、預(yù)讀(Read-ahead)和回寫(Write-back)。

緩存數(shù)據(jù)
首先是系統(tǒng)讀取過的數(shù)據(jù)會(huì)被緩存在高速緩存中,這樣下次再次需要讀取相同的數(shù)據(jù)的時(shí)候就不用在訪問磁盤,直接從緩存中取數(shù)據(jù)就可以了。當(dāng)然使用過的數(shù)據(jù)也不可能在緩存中永久保留的,緩存的數(shù)據(jù)一般那是采取LRU算法來進(jìn)行管理,目的是將長時(shí)間不用的數(shù)據(jù)清除出緩存,那些經(jīng)常被訪問的卻能一直保留在緩存中,直到緩存被清空。
預(yù)讀
預(yù)讀是指采用預(yù)讀算法在沒有系統(tǒng)的IO請求的時(shí)候事先將數(shù)據(jù)從磁盤中讀入到緩存中,然后在系統(tǒng)發(fā)出讀IO請求的時(shí)候,就會(huì)實(shí)現(xiàn)去檢查看看緩存里面是否存在要讀取的數(shù)據(jù),如果存在(即命中)的話就直接將結(jié)果返回,這時(shí)候的磁盤不再需要尋址、旋轉(zhuǎn)等待、讀取數(shù)據(jù)這一序列的操作了,這樣是能節(jié)省很多時(shí)間的;如果沒有命中則再發(fā)出真正的讀取磁盤的命令去取所需要的數(shù)據(jù)。

緩存的命中率跟緩存的大小有很大的關(guān)系,理論上是緩存越大的話,所能緩存的數(shù)據(jù)也就越多,這樣命中率也自然越高,當(dāng)然緩存不可能太大,畢竟成本在那兒呢。如果一個(gè)容量很大的存儲系統(tǒng)配備了一個(gè)很小的讀緩存的話,這時(shí)候問題會(huì)比較大的,因?yàn)樾【彺婢彺娴臄?shù)據(jù)量非常小,相比整個(gè)存儲系統(tǒng)來說比例非常低,這樣隨機(jī)讀?。〝?shù)據(jù)庫系統(tǒng)的大多數(shù)情況)的時(shí)候命中率也自然就很低,這樣的緩存不但不能提高效率(因?yàn)榻^大部分讀IO都還要讀取磁盤),反而會(huì)因?yàn)槊看稳テヅ渚彺娑速M(fèi)時(shí)間。

執(zhí)行讀IO操作是讀取數(shù)據(jù)存在于緩存中的數(shù)量與全部要讀取數(shù)據(jù)的比值稱為緩存命中率(Read Cache Hit Radio),假設(shè)一個(gè)存儲系統(tǒng)在不使用緩存的情況下隨機(jī)小IO讀取能達(dá)到150IOPS,而它的緩存能提供10%的緩存命中率的話,那么實(shí)際上它的IOPS可以達(dá)到150/(1-10%)=166。

回寫
首先說一下,用于回寫功能的那部分緩存被稱為寫緩存(Write Cache)。在一套寫緩存打開的存儲中,操作系統(tǒng)所發(fā)出的一系列寫IO命令并不會(huì)被挨個(gè)的執(zhí)行,這些寫IO的命令會(huì)先寫入緩存中,然后再一次性的將緩存中的修改推到磁盤中,這就相當(dāng)于將那些相同的多個(gè)IO合并成一個(gè),多個(gè)連續(xù)操作的小IO合并成一個(gè)大的IO,還有就是將多個(gè)隨機(jī)的寫IO變成一組連續(xù)的寫IO,這樣就能減少磁盤尋址等操作所消耗的時(shí)間,大大的提高磁盤寫入的效率。

讀緩存雖然對效率提高是很明顯的,但是它所帶來的問題也比較嚴(yán)重,因?yàn)榫彺婧推胀▋?nèi)存一樣,掉點(diǎn)以后數(shù)據(jù)會(huì)全部丟失,當(dāng)操作系統(tǒng)發(fā)出的寫IO命令寫入到緩存中后即被認(rèn)為是寫入成功,而實(shí)際上數(shù)據(jù)是沒有被真正寫入磁盤的,此時(shí)如果掉電,緩存中的數(shù)據(jù)就會(huì)永遠(yuǎn)的丟失了,這個(gè)對應(yīng)用來說是災(zāi)難性的,目前解決這個(gè)問題最好的方法就是給緩存配備電池了,保證存儲掉電之后緩存數(shù)據(jù)能如數(shù)保存下來。

和讀一樣,寫緩存也存在一個(gè)寫緩存命中率(Write Cache Hit Radio),不過和讀緩存命中情況不一樣的是,盡管緩存命中,也不能將實(shí)際的IO操作免掉,只是被合并了而已。

控制器緩存和磁盤緩存除了上面的作用之外還承當(dāng)著其他的作用,比如磁盤緩存有保存IO命令隊(duì)列的功能,單個(gè)的磁盤一次只能處理一個(gè)IO命令,但卻能接收多個(gè)IO命令,這些進(jìn)入到磁盤而未被處理的命令就保存在緩存中的IO隊(duì)列中。


RAID(Redundant Array Of Inexpensive Disks)

如果你是一位數(shù)據(jù)庫管理員或者經(jīng)常接觸服務(wù)器,那對RAID應(yīng)該很熟悉了,作為最廉價(jià)的存儲解決方案,RAID早已在服務(wù)器存儲中得到了普及。在RAID的各個(gè)級別中,應(yīng)當(dāng)以RAID10和RAID5(不過RAID5已經(jīng)基本走到頭了,RAID6正在崛起中,看看這里了解下原因)應(yīng)用最廣了。下面將就RAID0,RAID1,RAID5,RAID6,RAID10這幾種級別的RAID展開說一下磁盤陣列對于磁盤性能的影響,當(dāng)然在閱讀下面的內(nèi)容之前你必須對各個(gè)級別的RAID的結(jié)構(gòu)和工作原理要熟悉才行,這樣才不至于滿頭霧水,推薦查看wikipedia上面的如下條目:RAID,Standard RAID levelsNested RAID levels。

RAID0
RAID0將數(shù)據(jù)條帶化(striping)將連續(xù)的數(shù)據(jù)分散在多個(gè)磁盤上進(jìn)行存取,系統(tǒng)發(fā)出的IO命令(不管讀IO和寫IO都一樣)就可以在磁盤上被并行的執(zhí)行,每個(gè)磁盤單獨(dú)執(zhí)行自己的那一部分請求,這樣的并行的IO操作能大大的增強(qiáng)整個(gè)存儲系統(tǒng)的性能。假設(shè)一個(gè)RAID0陣列有n(n>=2)個(gè)磁盤組成,每個(gè)磁盤的隨機(jī)讀寫的IO能力都達(dá)到140的話,那么整個(gè)磁盤陣列的IO能力將是140*n。同時(shí)如果在陣列總線的傳輸能力允許的話RAID0的吞吐率也將是單個(gè)磁盤的n倍。
RAID1
RAID1在容量上相當(dāng)于是將兩個(gè)磁盤合并成一個(gè)磁盤來使用了,互為鏡像的兩個(gè)磁盤里面保存的數(shù)據(jù)是完全一樣的,因此在并行讀取的時(shí)候速度將是n個(gè)磁盤速度的總和,但是寫入就不一樣了,每次寫入都必須同時(shí)寫入到兩個(gè)磁盤中,因此寫入速度只有n/2。
RAID5
我們那一個(gè)有n(n>=3)個(gè)磁盤的RAID5陣列來看,首先看看RAID5陣列的讀IO,RAID5是支持并行IO的,而磁盤上的數(shù)據(jù)呈條帶狀的分布在所有的磁盤上,因此讀IO的速度相當(dāng)于所有磁盤速度的總和。不過這是在沒有磁盤損壞的情況下,當(dāng)有一個(gè)磁盤故障的時(shí)候讀取速度也是會(huì)下降的,因?yàn)橹虚g需要花時(shí)間來計(jì)算丟失磁盤上面的數(shù)據(jù)。

讀取數(shù)據(jù)的情況相對就要復(fù)雜的多了,先來看下RAID5奇偶校驗(yàn)數(shù)據(jù)寫入的過程,我們把寫入的數(shù)據(jù)稱為D1,當(dāng)磁盤拿到一個(gè)寫IO的命令的時(shí)候,它首先會(huì)讀取一次要入的地址的數(shù)據(jù)塊中修改之前的數(shù)據(jù)D0,然后再讀取到當(dāng)前條帶中的校驗(yàn)信息P0,接下來就根據(jù)D0,P0,D1這三組數(shù)據(jù)計(jì)算出數(shù)據(jù)寫入之后的條帶的奇偶校驗(yàn)信息P1,最后發(fā)出兩個(gè)寫IO的命令,一個(gè)寫入D1,另一個(gè)寫入奇偶校驗(yàn)信息P1??梢钥闯鲫嚵性趯?shí)際操作的時(shí)候需要讀、讀、寫、寫一共4個(gè)IO才能完成一次寫IO操作,也就是實(shí)際上的寫入速度只有所有磁盤速度總和的1/4。從這點(diǎn)可以看出RAID5是非常不適合用在要大批量寫入數(shù)據(jù)的系統(tǒng)上的。

RAID6
RAID6和RAID5很類似,差別就在于RAID6多了一個(gè)用于校驗(yàn)的磁盤。就寫IO速度上來說這兩個(gè)是完全一樣的,都是所有磁盤IO速度的總和。

在寫IO上也很是類似,不同的是RAID將一個(gè)命令分成了三次讀、三次寫一共6次IO命令才能完成,也就是RAID6實(shí)際寫入磁盤的速度是全部磁盤速度之和的1/6??梢钥闯鰪膶慖O看RAID6比RAID5差別是很大的。

RAID10
RAID0讀寫速度都很好,卻沒有冗余保護(hù);RAID5和RAID6都有同樣的毛病就是寫入的時(shí)候慢,讀取的時(shí)候快。那么RAID1呢?嗯,這里要說的就是RAID1,其實(shí)不管是RAID10還是RAID01,其實(shí)都是組合大于2塊磁盤時(shí)候的RAID1,當(dāng)先鏡像后條帶時(shí)候就稱為RAID10,先條帶后鏡像的時(shí)候稱為RAID01。從性能上看RAID01和RAID10都是一樣的,都是RAID1嘛,但是RAID10在重建故障磁盤的時(shí)候性能比RAID01要快。

因?yàn)镽AID10其實(shí)就是RAID1,所以它的性能與RAID1也就是一樣的了,這里不需要再做過多的討論。


四個(gè)性能指標(biāo)的變化


IO響應(yīng)時(shí)間(IO Response Time)

在任何時(shí)候IO響應(yīng)時(shí)間值得都是單個(gè)IO的響應(yīng)時(shí)間,因此,不管磁盤是否組成了磁盤陣列,它的IO響應(yīng)時(shí)間應(yīng)該都是一樣的。從前面的計(jì)算中我們可以看到,如果IO響應(yīng)時(shí)間在10ms左右的話是很正常的,但是當(dāng)IO響應(yīng)時(shí)間比這個(gè)值超出太多的時(shí)候,你就要開始注意了,很可能就意味著此時(shí)你的磁盤系統(tǒng)已經(jīng)成為了一個(gè)瓶頸。


IOPS

綜合上面兩個(gè)部分的討論我們來估算一下陣列下的磁盤總體IOPS,在這里我們先假設(shè)組成陣列的單個(gè)磁盤的隨機(jī)讀寫的IOPS為140,讀寫緩存命中率都為10%,組成陣列的磁盤個(gè)數(shù)為4。

因?yàn)椴还苁悄欠N陣列,磁盤的讀取性能都是所有磁盤之和,所以可以得出下面的讀取IOPS:

read IOPS = disk_IOPS/(1-read_cache_hit_ratio)*disk_num = 140/(1-10%)*4 = 622

而寫入性能就完全不一樣了,根據(jù)上面的討論我們可以得出下面結(jié)論:

RAID0: 1 IO request => need 1 actual IO on disk
RAID1: 1 IO request => need 2 actual IO on disk
RAID5: 1 IO request => need 4 actual IO on disk
RAID6: 1 IO request => need 6 actual IO on disk

由此我們也可以計(jì)算出寫入IOPS估算公式:

RAID0 write IOPS = disk_IOPS/(1-write_cache_hit_ratio)*disk_num/acture_IO_num = 140/(1-10%)*4/1 = 622
RAID1 write IOPS = disk_IOPS/(1-write_cache_hit_ratio)*disk_num/acture_IO_num = 140/(1-10%)*4/2 = 311
RAID5 write IOPS = disk_IOPS/(1-write_cache_hit_ratio)*disk_num/acture_IO_num = 140/(1-10%)*4/4 = 155
RAID6 write IOPS = disk_IOPS/(1-write_cache_hit_ratio)*disk_num/acture_IO_num = 140/(1-10%)*4/6 = 103

實(shí)際上從通過上面的計(jì)算方法我們還可以估算當(dāng)給定一個(gè)要求的IOPS的情況下,估計(jì)下使用各個(gè)陣列級別所需要的磁盤的數(shù)量。當(dāng)然我們上面的計(jì)算方法只是一個(gè)估算,我們忽略很多其他的因素,得出的只是一個(gè)大概的數(shù)值,不過在實(shí)際的應(yīng)用還是有一定的參考作用的。

本篇最后附送一個(gè)計(jì)算磁盤系統(tǒng)IOPS的網(wǎng)站――wmarow’s disk & disk array calculator,這個(gè)網(wǎng)站提供的計(jì)算公式還考慮了諸如陣列條帶大小以及主機(jī)方面的因素,很有參考價(jià)值,至于怎么選擇合適的條帶大小,請參考【延伸閱讀】部分。


傳輸速度(Transfer Rate)/吞吐率(Throughput)

實(shí)際上估算除了隨機(jī)讀寫的IOPS也就知道了隨機(jī)讀寫的吞吐率。對于順序讀寫的呢,還是跟前一篇所講的一樣,主要受限于磁盤的限制,不能再拿IOPS來衡量了。

random_throughtput = random_IOPS * IO_chunk_size


10

IO系統(tǒng)性能之三:在Linux中監(jiān)視IO性能




dd命令

dd其實(shí)是工作于比較低層的一個(gè)數(shù)據(jù)拷貝和轉(zhuǎn)換的*nix平臺的工具,但是因?yàn)閐d命令支持*nix平臺的一些特殊設(shè)備,因此我們可以利用dd命令的這個(gè)特性來簡單的測試磁盤的性能。

先說一下兩個(gè)相關(guān)的特殊設(shè)備

/dev/null
空設(shè)備,通常用作輸出設(shè)備,這個(gè)是*nix系統(tǒng)上面的黑洞,所有送到這個(gè)空設(shè)備上的內(nèi)容都會(huì)憑空消失。
/dev/zero
空字符,通常用作輸入,從/dev/zero中讀取時(shí),它能源源不斷的提供空字符(ASCII NUL, 0×00)出來,要多少有多少。

于是就有了下面的用法:

  • 測試磁盤的寫入
/usr/bin/time dd if=/dev/zero of=/tmp/foo bs=4k count=1024000

這個(gè)命令時(shí)往磁盤的文件/tmp/foo中寫入一個(gè)4G大小的文件,當(dāng)然文件的內(nèi)容全部是空字符了,同時(shí)用/usr/bin/time來對命令的執(zhí)行進(jìn)行計(jì)時(shí),命令中的bs指的是寫入文件時(shí)的塊大小,其實(shí)就相當(dāng)于Oracle中的block大小了,count是寫入的塊數(shù)。采取這種方法來寫入數(shù)據(jù)時(shí)只是測試的連續(xù)讀磁盤的性能,而不是隨機(jī)讀的性能,不能采取這種方法檢查一個(gè)機(jī)器的IOPS的,只能檢查磁盤的吞吐率。

  • 測試磁盤的讀取
/usr/bin/time dd if=/tmp/foo of=/dev/null bs=4k

上面的命令是從/tmp/foo文件中讀取數(shù)據(jù),然后扔掉,這里bs用的是讀取時(shí)塊的大小。和上面寫入的命令一樣,這樣測試的僅僅是最大的讀取性能,而不是隨機(jī)IO的性能。

  • 還能讀寫同時(shí)測試
/usr/bin/time dd if=/tmp/foo of=/tmp/foo2 bs=4k

在上面的命令中都用到了time命令對操作進(jìn)行計(jì)時(shí),這樣才能正確的進(jìn)行判斷。要記住的一點(diǎn)是dd命令只能夠提供一個(gè)大概的測試,通過這個(gè)簡單的命令可以對磁盤系統(tǒng)的最大性能有一個(gè)大概的了解,要了解更詳細(xì)的信息還要通過其他方法來查看。


iostat命令


理解iostat的各項(xiàng)輸出

在Linux中,我們執(zhí)行一個(gè)iostat -x命令,我們能看到如下的輸出

$iostat -x
Linux 2.4.21-50a6smp (linux)         11/03/2009

avg-cpu:  %user   %nice    %sys %iowait   %idle
           0.42    0.00    0.26    0.47   98.86

Device:    rrqm/s wrqm/s   r/s   w/s  rsec/s  wsec/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await  svctm  %util
hdc          0.01   0.00  0.00  0.00    0.07    0.00     0.03     0.00    24.48     0.00    4.90   4.57   0.00
hda          0.89   8.54  0.74  4.49   12.60  104.22     6.30    52.11    22.32     0.03    5.41   1.01   0.53

我們先列舉一下各個(gè)性能指標(biāo)的簡單說明。

rrqm/s
每秒進(jìn)行merge的讀操作數(shù)目。
wrqm/s
每秒進(jìn)行merge的寫操作數(shù)目。
r/s
每秒完成的讀I/O設(shè)備次數(shù)。
w/s
每秒完成的寫I/O設(shè)備次數(shù)。
rsec/s
每秒讀扇區(qū)數(shù)。
wsec/s
每秒寫扇區(qū)數(shù)。
rkB/s
每秒讀K字節(jié)數(shù)。
wkB/s
每秒寫K字節(jié)數(shù)。
avgrq-sz
平均每次設(shè)備I/O操作的數(shù)據(jù)大小(扇區(qū))。
avgqu-sz
平均I/O隊(duì)列長度。
await
平均每次設(shè)備I/O操作的等待時(shí)間(毫秒)。
svctm
平均每次設(shè)備I/O操作的服務(wù)時(shí)間(毫秒)。
%util
一秒中有百分之多少的時(shí)間用于I/O操作,或者說一秒中有多少時(shí)間I/O隊(duì)列是非空的。

要理解這些性能指標(biāo)我們先看下圖

IO的執(zhí)行過程的各個(gè)參數(shù)

上圖的左邊是iostat顯示的各個(gè)性能指標(biāo),每個(gè)性能指標(biāo)都會(huì)顯示在一條虛線之上,這表明這個(gè)性能指標(biāo)是從虛線之上的那個(gè)讀寫階段開始計(jì)量的,比如說圖中的w/s從Linux IO scheduler開始穿過硬盤控制器(CCIS/3ware),這就表明w/s統(tǒng)計(jì)的是每秒鐘從Linux IO scheduler通過硬盤控制器的寫IO的數(shù)量。

結(jié)合上圖對讀IO操作的過程做一個(gè)說明,在從OS Buffer Cache傳入到OS Kernel(Linux IO scheduler)的讀IO操作的個(gè)數(shù)實(shí)際上是rrqm/s+r/s,直到讀IO請求到達(dá)OS Kernel層之后,有每秒鐘有rrqm/s個(gè)讀IO操作被合并,最終轉(zhuǎn)送給磁盤控制器的每秒鐘讀IO的個(gè)數(shù)為r/w;在進(jìn)入到操作系統(tǒng)的設(shè)備層(/dev/sda)之后,計(jì)數(shù)器開始對IO操作進(jìn)行計(jì)時(shí),最終的計(jì)算結(jié)果表現(xiàn)是await,這個(gè)值就是我們要的IO響應(yīng)時(shí)間了;svctm是在IO操作進(jìn)入到磁盤控制器之后直到磁盤控制器返回結(jié)果所花費(fèi)的時(shí)間,這是一個(gè)實(shí)際IO操作所花的時(shí)間,當(dāng)await與svctm相差很大的時(shí)候,我們就要注意磁盤的IO性能了;而avgrq-sz是從OS Kernel往下傳遞請求時(shí)單個(gè)IO的大小,avgqu-sz則是在OS Kernel中IO請求隊(duì)列的平均大小。

現(xiàn)在我們可以將iostat輸出結(jié)果和我們前面討論的指標(biāo)掛鉤了。

平均單次IO大小(IO Chunk Size) <=> avgrq-sz

平均IO響應(yīng)時(shí)間(IO Response Time) <=> await

IOPS(IO per Second) <=> r/s + w/s

吞吐率(Throughtput) <=> rkB/s + wkB/s


iostat的應(yīng)用實(shí)例

觀察IO Scheduler的IO合并(IO Merge)

前面說過IO在執(zhí)行過程中會(huì)被合并以提高效率,下面就結(jié)合dd命令和iostat命令看一下。

我們先執(zhí)行dd命令,設(shè)置bs參數(shù)值為1k,完整命令如下

dd if=/dev/zero of=test bs=1k count=1024000

同時(shí)打開另外一個(gè)終端執(zhí)行iostat命令,這里只查看變化那個(gè)磁盤的更改,每秒刷新一次數(shù)據(jù),完整命令如下

iostat -x hdc7 1

然后我們可以得到下面的結(jié)果

Device:    rrqm/s wrqm/s   r/s   w/s  rsec/s  wsec/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await  svctm  %util
hdc7         0.00 9447.00  0.00 776.00    0.00 80616.00     0.00 40308.00   103.89   480.18  805.95   1.29 100.00

avg-cpu:  %user   %nice    %sys %iowait   %idle
           0.50    0.00   56.00   43.50    0.00

Device:    rrqm/s wrqm/s   r/s   w/s  rsec/s  wsec/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await  svctm  %util
hdc7         0.00 9534.00  0.00 872.00    0.00 81384.00     0.00 40692.00    93.33   274.56  401.19   1.14  99.00

avg-cpu:  %user   %nice    %sys %iowait   %idle
           2.50    0.00   46.50   14.00   37.00

Device:    rrqm/s wrqm/s   r/s   w/s  rsec/s  wsec/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await  svctm  %util
hdc7         0.00 6766.00  1.00 276.00    8.00 58808.00     4.00 29404.00   212.33   197.27  321.66   1.95  54.00

avg-cpu:  %user   %nice    %sys %iowait   %idle
           0.50    0.00    0.50    0.00   99.00

看結(jié)果中第一組數(shù)據(jù)中的avgrq-sz,為103.89個(gè)扇區(qū),磁盤的每個(gè)扇區(qū)為512字節(jié),因此平均IO大小為103.89*512/1024=52k字節(jié),遠(yuǎn)遠(yuǎn)大于我們dd命令時(shí)給定的參數(shù)1k字節(jié),也就是說IO在中間被合并了??淳薮蟮膚rqm/s也能得出同樣的結(jié)論。


附:在Windows中監(jiān)視IO性能

本來準(zhǔn)備寫一篇windows中監(jiān)視IO性能的,后來發(fā)現(xiàn)好像可寫的內(nèi)容不多,windows在細(xì)節(jié)這方面做的不是那么的好,不過那些基本信息還是有的。

在Windows中監(jiān)視性能基本都用性能監(jiān)視器了,與IO性能相關(guān)的有兩個(gè)大類,一個(gè)是”LogicalDisk”,另外一個(gè)是”PhysicalDisk”,”LogicalDisk”更多的是用來監(jiān)視文件相關(guān)的IO性能,而”PhysicalDisk”則是用來監(jiān)視LUN或者是磁盤卷,下面就列舉下與前面所列舉的IO性能相關(guān)的計(jì)數(shù)器,具體的自己研究了:

單次IO大小
  • Avg. Disk Bytes/Read
  • Avg. Disk Bytes/Write
IO響應(yīng)時(shí)間
  • Avg. Disk sec/Read
  • Avg. Disk sec/Write
IOPS
  • Disk Reads/sec
  • Disk Writes/sec
  • Disk Transfers/sec
IO吞吐率
  • Disk Bytes/sec
  • Disk Read Bytes/sec
  • Disk Write Bytes/sec


本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
IO系統(tǒng)性能之二:緩存和RAID如何提高磁盤IO性能 | 貝塔中的DBA
RAID10和RAID5區(qū)別比較,利用率與安全的取舍
[后續(xù)] 一篇文章詳解性能評估難點(diǎn)
RAID5和RAID10,哪種RAID更適合你(上)
PCIE SSD對數(shù)據(jù)庫架構(gòu)的影響巨大?參與討論得派克金筆?。ǐ@獎(jiǎng)名單已公布-2014-6-27)-存儲備份 - ChinaUnix.net - 手機(jī)版 - Powered by Discuz!
IOPS
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服