一惊豺、磁盤 I/O 的概念
I/O 的概念呀非,從字義來理解就是輸入輸出坚俗。操作系統(tǒng)從上層到底層,各個層次之間均存在 I/O岸裙。比如猖败,CPU 有 I/O,內(nèi)存有 I/O, VMM 有 I/O, 底層磁盤上也有 I/O哥桥,這是廣義上的 I/O辙浑。通常來講,一個上層的 I/O 可能會產(chǎn)生針對磁盤的多個 I/O拟糕,也就是說判呕,上層的 I/O 是稀疏的,下層的 I/O 是密集的送滞。
磁盤的 I/O侠草,顧名思義就是磁盤的輸入輸出。輸入指的是對磁盤寫入數(shù)據(jù)犁嗅,輸出指的是從磁盤讀出數(shù)據(jù)边涕。我們常見的磁盤類型有 ATA、SATA褂微、FC功蜓、SCSI、SAS宠蚂,如圖1所示式撼。這幾種磁盤中,服務(wù)器常用的是 SAS 和 FC 磁盤求厕,一些高端存儲也使用 SSD 盤著隆。每一種磁盤的性能是不一樣的。
image
圖 1. 物理磁盤的架構(gòu)以及常見磁盤類型
二呀癣、性能評價指標(biāo)
SAN(Storage Area Network, 存儲區(qū)域網(wǎng)絡(luò))和NAS存儲(Network Attached Storage美浦,網(wǎng)絡(luò)附加存儲)一般都具備2個評價指標(biāo):IOPS和帶寬(throughput),兩個指標(biāo)互相獨立又相互關(guān)聯(lián)项栏。體現(xiàn)存儲系統(tǒng)性能的最主要指標(biāo)是IOPS浦辨。下面,將介紹一下這兩個參數(shù)的含義沼沈。
IOPS (Input/Output Per Second)即每秒的輸入輸出量(或讀寫次數(shù))荤牍,是衡量磁盤性能的主要指標(biāo)之一案腺。IOPS是指單位時間內(nèi)系統(tǒng)能處理的I/O請求數(shù)量,I/O請求通常為讀或?qū)憯?shù)據(jù)操作請求康吵。隨機讀寫頻繁的應(yīng)用劈榨,如OLTP(Online Transaction Processing),IOPS是關(guān)鍵衡量指標(biāo)晦嵌。另一個重要指標(biāo)是數(shù)據(jù)吞吐量(Throughput)同辣,指單位時間內(nèi)可以成功傳輸?shù)臄?shù)據(jù)數(shù)量。對于大量順序讀寫的應(yīng)用惭载,如VOD(Video On Demand)旱函,則更關(guān)注吞吐量指標(biāo)。
簡而言之:
磁盤的 IOPS描滔,也就是在一秒內(nèi)棒妨,磁盤進行多少次 I/O 讀寫。
磁盤的吞吐量含长,也就是每秒磁盤 I/O 的流量券腔,即磁盤寫入加上讀出的數(shù)據(jù)的大小。
IOPS 與吞吐量的關(guān)系
每秒 I/O 吞吐量= IOPS* 平均 I/O SIZE拘泞。從公式可以看出: I/O SIZE 越大纷纫,IOPS 越高,那么每秒 I/O 的吞吐量就越高陪腌。因此辱魁,我們會認(rèn)為 IOPS 和吞吐量的數(shù)值越高越好。實際上诗鸭,對于一個磁盤來講染簇,這兩個參數(shù)均有其最大值,而且這兩個參數(shù)也存在著一定的關(guān)系强岸。
IOPS可細(xì)分為如下幾個指標(biāo):
- Toatal IOPS剖笙,混合讀寫和順序隨機I/O負(fù)載情況下的磁盤IOPS,這個與實際I/O情況最為相符请唱,大多數(shù)應(yīng)用關(guān)注此指標(biāo)。
- Random Read IOPS过蹂,100%隨機讀負(fù)載情況下的IOPS十绑。
- Random Write IOPS,100%隨機寫負(fù)載情況下的IOPS酷勺。
- Sequential Read IOPS本橙,100%順序讀負(fù)載情況下的IOPS。
- Sequential Write IOPS脆诉,100%順序?qū)懾?fù)載情況下的IOPS甚亭。
下圖為一個典型的NFS測試結(jié)果:
IOPS的測試benchmark工具主要有Iometer, IoZone, FIO等贷币,可以綜合用于測試磁盤在不同情形下的IOPS。對于應(yīng)用系統(tǒng)亏狰,需要首先確定數(shù)據(jù)的負(fù)載特征役纹,然后選擇合理的IOPS指標(biāo)進行測量和對比分析,據(jù)此選擇合適的存儲介質(zhì)和軟件系統(tǒng)暇唾。
IOPS計算公式
對于磁盤來說一個完整的IO操作是這樣進行的:當(dāng)控制器對磁盤發(fā)出一個IO操作命令的時候促脉,磁盤的驅(qū)動臂(Actuator Arm)帶讀寫磁頭(Head)離開著陸區(qū)(Landing Zone,位于內(nèi)圈沒有數(shù)據(jù)的區(qū)域)策州,移動到要操作的初始數(shù)據(jù)塊所在的磁道(Track)的正上方瘸味,這個過程被稱為尋址(Seeking),對應(yīng)消耗的時間被稱為尋址時間(Seek Time);但是找到對應(yīng)磁道還不能馬上讀取數(shù)據(jù)够挂,這時候磁頭要等到磁盤盤片(Platter)旋轉(zhuǎn)到初始數(shù)據(jù)塊所在的扇區(qū)(Sector)落在讀寫磁頭正上方的之后才能開始讀取數(shù)據(jù)旁仿,在這個等待盤片旋轉(zhuǎn)到可操作扇區(qū)的過程中消耗的時間稱為旋轉(zhuǎn)延時(Rotational Delay);接下來就隨著盤片的旋轉(zhuǎn),磁頭不斷的讀/寫相應(yīng)的數(shù)據(jù)塊孽糖,直到完成這次IO所需要操作的全部數(shù)據(jù)枯冈,這個過程稱為數(shù)據(jù)傳送(Data Transfer),對應(yīng)的時間稱為傳送時間(Transfer Time)梭姓。完成這三個步驟之后一次IO操作也就完成了霜幼。
在我們看硬盤廠商的宣傳單的時候我們經(jīng)常能看到3個參數(shù),分別是平均尋址時間誉尖、盤片旋轉(zhuǎn)速度以及最大傳送速度罪既,這三個參數(shù)就可以提供給我們計算上述三個步驟的時間。
第一個尋址時間铡恕,考慮到被讀寫的數(shù)據(jù)可能在磁盤的任意一個磁道琢感,既有可能在磁盤的最內(nèi)圈(尋址時間最短),也可能在磁盤的最外圈(尋址時間最長)探熔,所以在計算中我們只考慮平均尋址時間驹针,也就是磁盤參數(shù)中標(biāo)明的那個平均尋址時間,這里就采用當(dāng)前最多的10krmp硬盤的5ms诀艰。
第二個旋轉(zhuǎn)延時柬甥,和尋址一樣,當(dāng)磁頭定位到磁道之后有可能正好在要讀寫扇區(qū)之上其垄,這時候是不需要額外額延時就可以立刻讀寫到數(shù)據(jù)苛蒲,但是最壞的情況確實要磁盤旋轉(zhuǎn)整整一圈之后磁頭才能讀取到數(shù)據(jù),所以這里我們也考慮的是平均旋轉(zhuǎn)延時绿满,對于10krpm的磁盤就是(60s/10k)*(1/2) = 2ms臂外。
第三個傳送時間,磁盤參數(shù)提供我們的最大的傳輸速度,當(dāng)然要達到這種速度是很有難度的漏健,但是這個速度卻是磁盤純讀寫磁盤的速度嚎货,因此只要給定了單次 IO的大小,我們就知道磁盤需要花費多少時間在數(shù)據(jù)傳送上蔫浆,這個時間就是IO Chunk Size / Max Transfer Rate殖属。
現(xiàn)在我們就可以得出這樣的計算單次IO時間的公式。
IO Time = Seek Time + 60 sec/Rotational Speed/2 + IO Chunk Size/Transfer Rate
于是我們可以這樣計算出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越小的時候,單次IO所耗費的時間也越少谭溉,相應(yīng)的IOPS也就越大墙懂。
上面我們的數(shù)據(jù)都是在一個比較理想的假設(shè)下得出來的,這里的理想的情況就是磁盤要花費平均大小的尋址時間和平均的旋轉(zhuǎn)延時扮念,這個假設(shè)其實是比較符合我們實際情況中的隨機讀寫损搬,在隨機讀寫中,每次IO操作的尋址時間和旋轉(zhuǎn)延時都不能忽略不計柜与,有了這兩個時間的存在也就限制了IOPS的大小∏汕冢現(xiàn)在我們考慮一種相對極端的順序讀寫操作,比如說在讀取一個很大的存儲連續(xù)分布在磁盤的的文件弄匕,因為文件的存儲的分布是連續(xù)的颅悉,磁頭在完成一個讀IO操作之后,不需要從新的尋址迁匠,也不需要旋轉(zhuǎn)延時剩瓶,在這種情況下我們能到一個很大的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來衡量一個IO系統(tǒng)的系能的時候我們一定要說清楚是在什么情況的IOPS,也就是要說明讀寫的方式以及單次IO的大小亡哄,當(dāng)然在實際當(dāng)中枝缔,特別是在OLTP的系統(tǒng)的,隨機的小IO的讀寫是最有說服力的蚊惯。
另外愿卸,對于同一個磁盤(或者 LUN),隨著每次 I/O 讀寫數(shù)據(jù)的大小不通截型,IOPS 的數(shù)值也不是固定不變的趴荸。例如,每次 I/O 寫入或者讀出的都是連續(xù)的大數(shù)據(jù)塊菠劝,此時 IOPS 相對會低一些;在不頻繁換道的情況下,每次寫入或者讀出的數(shù)據(jù)塊小赶诊,相對來講 IOPS 就會高一些笼平。也就是說,IOPS 也取決與I/O塊的大小舔痪,采用不同I/O塊的大小測出的IOPS值是不同的寓调。 對一個具體的IOPS, 可以了解它當(dāng)時測試的I/O塊的尺寸。并且IOPS都具有極限值锄码,表1列出了各種磁盤的 IOPS 極限值夺英。
表 1. 常見磁盤類型及其 IOPS
三、I/O 讀寫的類型
大體上講滋捶,I/O 的類型可以分為:讀 / 寫 I/O痛悯、大 / 小塊 I/O、連續(xù) / 隨機 I/O, 順序 / 并發(fā) I/O重窟。在這幾種類型中载萌,我們主要討論一下:大 / 小塊 I/O、連續(xù) / 隨機 I/O, 順序 / 并發(fā) I/O巡扇。
大 / 小塊 I/O
這個數(shù)值指的是控制器指令中給出的連續(xù)讀出扇區(qū)數(shù)目的多少扭仁。如果數(shù)目較多,如 64厅翔,128 等乖坠,我們可以認(rèn)為是大塊 I/O;反之刀闷,如果很小熊泵,比如 4,8涩赢,我們就會認(rèn)為是小塊 I/O戈次,實際上,在大塊和小塊 I/O 之間筒扒,沒有明確的界限怯邪。
連續(xù) / 隨機 I/O
連續(xù) I/O 指的是本次 I/O 給出的初始扇區(qū)地址和上一次 I/O 的結(jié)束扇區(qū)地址是完全連續(xù)或者相隔不多的。反之花墩,如果相差很大悬秉,則算作一次隨機 I/O
連續(xù) I/O 比隨機 I/O 效率高的原因是:在做連續(xù) I/O 的時候,磁頭幾乎不用換道冰蘑,或者換道的時間很短和泌;而對于隨機 I/O,如果這個 I/O 很多的話祠肥,會導(dǎo)致磁頭不停地?fù)Q道武氓,造成效率的極大降低。
順序 / 并發(fā) I/O
從概念上講,并發(fā) I/O 就是指向一塊磁盤發(fā)出一條 I/O 指令后县恕,不必等待它回應(yīng)东羹,接著向另外一塊磁盤發(fā) I/O 指令。對于具有條帶性的 RAID(LUN)忠烛,對其進行的 I/O 操作是并發(fā)的属提,例如:raid 0+1(1+0),raid5 等。反之則為順序 I/O美尸。
四冤议、磁盤 I/O 性能的監(jiān)控
監(jiān)控磁盤的 I/O 性能,我們可以使用 AIX 的系統(tǒng)命令师坎,例如:sar -d, iostat, topas, nmon 等恕酸。下面,我將以 nmon 和 topas 為例屹耐,講述在系統(tǒng)中如何觀察磁盤 I/O 的性能尸疆。
topas
登錄 AIX 操作系統(tǒng),輸入 topas惶岭,然后按 D寿弱,會出現(xiàn)如下界面:
在上圖中,TPS 即為磁盤的 IOPS按灶,KBPS 即為磁盤每秒的吞吐量症革。由于服務(wù)器處于空閑的狀態(tài),我們可以看到 IOPS鸯旁,KBPS 的數(shù)據(jù)都非常低噪矛。
我們使用 dd if 命令向磁盤 hdisk2 發(fā)讀 I/O,block 大小為 1MB:
利用 topas 進行監(jiān)控:
此時铺罢,hdisk2 的吞吐量為 163.9M艇挨,IOPS 為 655。
我們再啟動一個 dd if韭赘,使 hdisk 的 busy 數(shù)值達到 100%:
image
從上圖可以看出缩滨,在磁盤 busy 達到 100% 的時候,其吞吐量為 304.1M泉瞻,IOPS 為 1200脉漏。
hdisk2 是本地集成的 SAS 盤,我們可以查出本地集成 SAS 通道的帶寬為 3Gb:
image
對于 3Gb 的 SAS 通道袖牙,304.1M 的磁盤吞吐量已經(jīng)接近其 I/O 帶寬的峰值了侧巨。
需要指出的是,使用 dd if 測量磁盤的帶寬是可行的鞭达,但是由此來確定業(yè)務(wù) I/O 的 IOPS 和吞吐量是不科學(xué)的司忱。因為皇忿,dd if 所發(fā)起的讀寫僅為順序 I/O 讀寫,在 OLTP 的業(yè)務(wù)中坦仍,這種讀寫是不常見的禁添,而是隨機小 I/O 比較多,因此桨踪,測量業(yè)務(wù)的磁盤 I/O 性能,需要在運行業(yè)務(wù)的時候進行監(jiān)控芹啥。
nmon
在系統(tǒng)中輸入 nmon锻离,按 d,可以得到如下界面 :
Figure xxx. Requires a heading
可以得到此時磁盤 hdisk2 吞吐量為 318M墓怀。
使用 nmon 收集一個時間段的數(shù)據(jù)汽纠,然后使用 nmon analyzer 進行分析,可以得出更為直接的圖表:
image
將收集好的 nmon 文件使用 nmon analyzer 進行分析傀履,得出如下報表:
圖 2.nmon 圖表顯示磁盤性能
五虱朵、磁盤 I/O 性能調(diào)優(yōu)
確認(rèn)磁盤 I/O 存在性能問題
對于隨機負(fù)載,當(dāng)遇到余下情況時钓账,我們那通常認(rèn)為存在 I/O 性能問題:
1. 平均讀時間大于 15ms
- 在具有寫 cache 的條件下碴犬,平均寫時間大于 2.5ms
對于順序負(fù)載,當(dāng)遇到余下情況時梆暮,我們那通常認(rèn)為存在 I/O 性能問題:
1. 在一個磁盤上有兩個連續(xù)的 I/O 流
2. 吞吐量不足(即遠遠小于磁盤 I/O 帶寬)
對于一塊磁盤來講服协,隨著 IOPS 數(shù)量的增加,I/O service 也會增加啦粹,并且會有一個飽和點偿荷,即 IOPS 達到某個點以后,IOPS 再增加將會引起 I/O service time 的顯著增加唠椭。
圖 3. 磁盤 IOPS 與 IO service time 關(guān)系圖
從經(jīng)驗上講跳纳,我們在測試工作中,我們主要關(guān)注 IOPS 和吞吐量以及磁盤的 busy% 這三個數(shù)值贪嫂。如果 IOPS 和吞吐量均很低寺庄,磁盤的 busy% 也很低,我們會認(rèn)為磁盤壓力過小撩荣,造成吞吐量和 IOPS 過低铣揉;只有在 IOPS 和吞吐量均很低,磁盤的 busy% 很高(接近 100%)的時候餐曹,我們才會從磁盤 I/O 方面分析 I/O 性能逛拱。
轉(zhuǎn)自:https://blog.csdn.net/hanchengxi/article/details/19089589