I/O的概念,從字義來理解就是輸入輸出。操作系統從上層到底層,各個層次之間均存在I/O。比如,CPU有I/O,內存有I/O,VMM有I/O,底層磁盤上也有I/O,這是廣義上的I/O。通常來講,一個上層的人I/O可能會產生針對磁盤的多個問題I/O,也就是說,上層的I/O是稀疏的,下層的I/O是密集的。
磁盤的I/O,顧名思義就是磁盤的輸入輸出。輸入指的是對磁盤寫入數據,輸出指的是從磁盤讀出數據。我們常見的磁盤類型有ATA、SATA、FC、SCSI、SAS,如圖1所示。這幾種磁盤中,服務器常用的是SAS和FC磁盤,一些高端存儲設備也使用SSD盤。每一種磁盤的性能是不一樣的。
圖1.物理磁盤的架構以及常見磁盤類型二、性能評價指標SAN(StorageAreaNetwork,存儲區域網絡)和NAS存儲(NetworkAttachedStorage,網絡附加存儲)一般都具備2個評價指標:IOPS和帶寬(throughput),兩個指標互相獨立又相互關聯。體現存儲系統性能的最主要指標是IOPS。下面,將介紹一下這兩個參數的含義。
IOPS(Input/OutputPerSecond)即每秒的輸入輸出量(或讀寫次數),是衡量磁盤性能的主要指標之一。IOPS是指單位時間內系統能處理的I/O請求數量,I/O請求通常為讀或寫數據操作請求。隨機讀寫頻繁的應用,如OLTP(OnlineTransactionProcessing),IOPS是關鍵衡量指標。另一個重要指標是數據吞吐量(Throughput),指單位時間內可以成功傳輸的數據數量。對于大量順序讀寫的應用,如VOD(VideoOnDemand),則更關注吞吐量指標。
簡而言之:
更多linux內核視頻教程文本資料免費獲取后臺私信【內核】。
磁盤的IOPS,也就是在一秒內,磁盤進行多少次I/O讀寫。
磁盤的吞吐量,也就是每秒磁盤I/O的流量,即磁盤寫入加上讀出的數據的大小。
IOPS與吞吐量的關系每秒I/O吞吐量=IOPS*平均I/OSIZE。從公式可以看出:I/OSIZE越大,IOPS越高,那么每秒I/O吞吐量就越高。因此,我們會認為IOPS吞吐量的數值越高越好。實際上,對于一個磁盤來講,這兩個參數均有其最大值,而且這兩個參數也存在著一定的關系。
IOPS可細分為如下幾個指標:
ToatalIOPS,混合讀寫和順序隨機I/O負載情況下的磁盤IOPS,這個與實際I/O情況最為相符,大多數應用關注此指標。RandomReadIOPS,100%隨機讀負載情況下的IOPS。RandomWriteIOPS,100%隨機寫負載情況下的IOPS。SequentialReadIOPS,100%順序讀負載情況下的IOPS。SequentialWriteIOPS,100%順序寫負載情況下的IOPS。下圖為一個典型的NFS測試結果:
IOPS的測試benchmark工具主要有Iometer,IoZone,FIO等,可以綜合用于測試磁盤在不同情形下的IOPS。對于應用系統,需要首先確定數據的負載特征,然后選擇合理的IOPS指標進行測量和對比分析,據此選擇合適的存儲介質和軟件系統。
IOPS計算公式對于磁盤來說一個完整的IO操作是這樣進行的:當控制器對磁盤發出一個IO操作命令的時候,磁盤的驅動臂(ActuatorArm)帶讀寫磁頭(Head)離開著陸區(LandingZone,位于內圈沒有數據的區域),移動到要操作的初始數據塊所在的磁道(Track)的正上方,這個過程被稱為尋址(Seeking),對應消耗的時間被稱為尋址時間(SeekTime);但是找到對應磁道還不能馬上讀取數據,這時候磁頭要等到磁盤盤片(Platter)旋轉到初始數據塊所在的扇區(Sector)落在讀寫磁頭正上方的之后才能開始讀取數據,在這個等待盤片旋轉到可操作扇區的過程中消耗的時間稱為旋轉延時(RotationalDelay);接下來就隨著盤片的旋轉,磁頭不斷的讀/寫相應的數據塊,直到完成這次IO所需要操作的全部數據,這個過程稱為數據傳送(DataTransfer),對應的時間稱為傳送時間(TransferTime)。完成這三個步驟之后一次IO操作也就完成了。
在我們看硬盤廠商的宣傳單的時候我們經常能看到3個參數,分別是平均尋址時間、盤片旋轉速度以及最大傳送速度,這三個參數就可以提供給我們計算上述三個步驟的時間。
第一個尋址時間,考慮到被讀寫的數據可能在磁盤的任意一個磁道,極有可能在磁盤的最內圈(尋址時間最短),也可能在磁盤的最外圈(尋址時間最長),所以在計算中我們只考慮平均尋址時間,也就是磁盤參數中標明的那個平均尋址時間,這里就采用當前最多的10krmp硬盤的5ms。
第二個旋轉延時,和尋址一樣,當磁頭定位到磁道之后有可能正好在要讀寫扇區之上,這時候是不需要額外額延時就可以立刻讀寫到數據,但是最壞的情況確實要磁盤旋轉整整一圈之后磁頭才能讀取到數據,所以這里我們也考慮的是平均旋轉延時,對于10krpm的磁盤就是(60s/10k)*(1/2)=2ms。
第三個傳送時間,磁盤參數提供我們的最大的傳輸速度,當然要達到這種速度是很有難度的,但是這個速度卻是磁盤純讀寫磁盤的速度,因此只要給定了單次IO的大小,我們就知道磁盤需要花費多少時間在數據傳送上,這個時間就是IOChunkSize/MaxTransferRate。
現在我們就可以得出這樣的計算單次IO時間的公式。
IOTime=SeekTime+60sec/RotationalSpeed/2+IOChunkSize/TransferRate
于是我們可以這樣計算出IOPS。
IOPS=1/IOTime=1/(SeekTime+60sec/RotationalSpeed/2+IOChunkSize/TransferRate)
對于給定不同的IO大小我們可以得出下面的一系列的數據
4K(1/7.1ms=140IOPS) 5ms+(60sec/15000RPM/2)+4K/40MB=5+2+0.1=7.1 8k(1/7.2ms=139IOPS) 5ms+(60sec/15000RPM/2)+8K/40MB=5+2+0.2=7.2 16K(1/7.4ms=135IOPS) 5ms+(60sec/15000RPM/2)+16K/40MB=5+2+0.4=7.4 32K(1/7.8ms=128IOPS) 5ms+(60sec/15000RPM/2)+32K/40MB=5+2+0.8=7.8 64K(1/8.6ms=116IOPS) 5ms+(60sec/15000RPM/2)+64K/40MB=5+2+1.6=8.6
從上面的數據可以看出,當單次IO越小的時候,單次IO所耗費的時間也越少,相應的IOPS也就越大。
上面我們的數據都是在一個比較理想的假設下得出來的,這里的理想的情況就是磁盤要花費平均大小的尋址時間和平均的旋轉延時,這個假設其實是比較符合我們實際情況中的隨機讀寫,在隨機讀寫中,每次IO操作的尋址時間和旋轉延時都不能忽略不計,有了這兩個時間的存在也就限制了IOPS的大小。現在我們考慮一種相對極端的順序讀寫操作,比如說在讀取一個很大的存儲連續分布在磁盤的的文件,因為文件的存儲的分布是連續的,磁頭在完成一個讀IO操作之后,不需要從新的尋址,也不需要旋轉延時,在這種情況下我們能到一個很大的IOPS值,如下。
4K(1/0.1ms=10000IOPS) 0ms+0ms+4K/40MB=0.1 8k(1/0.2ms=5000IOPS) 0ms+0ms+8K/40MB=0.2 16K(1/0.4ms=2500IOPS) 0ms+0ms+16K/40MB=0.4 32K(1/0.8ms=1250IOPS) 0ms+0ms+32K/40MB=0.8 64K(1/1.6ms=625IOPS) 0ms+0ms+64K/40MB=1.6
相比第一組數據來說差距是非常的大的,因此當我們要用IOPS來衡量一個IO系統的系能的時候我們一定要說清楚是在什么情況的IOPS,也就是要說明讀寫的方式以及單次IO的大小,當然在實際當中,特別是在OLTP的系統的,隨機的小IO的讀寫是最有說服力的。
另外,對于同一個磁盤(或者LUN),隨著每次I/O讀寫數據的大小不通,IOPS的數值也不是固定不變的。例如,每次I/O寫入或者讀出的都是連續的大數據塊,此時IOPS相對會低一些;在不頻繁換道的情況下,每次寫入或者讀出的數據塊小,相對來講IOPS就會高一些。也就是說,IOPS也取決與I/O塊的大小,采用不同I/O塊的大小測出的IOPS值是不同的。對一個具體的IOPS,可以了解它當時測試的I/O塊的尺寸。并且IOPS都具有極限值,表1列出了各種磁盤的IOPS極限值。表1.常見磁盤類型及其IOPS三、I/O讀寫的類型大體上講,I/O的類型可以分為:讀/寫I/O、大/小塊I/O、連續/隨機I/O,順序/并發I/O。在這幾種類型中,我們主要討論一下:大/小塊I/O、連續/隨機I/O,順序/并發I/O。
大/小塊I/O這個數值指的是控制器指令中給出的連續讀出扇區數目的多少。如果數目較多,如64,128等,我們可以認為是大塊I/O;反之,如果很小,比如4,8,我們就會認為是小塊I/O,實際上,在大塊和小塊I/O之間,沒有明確的界限。
連續/隨機I/O連續I/O指的是本次I/O給出的初始扇區地址和上一次I/O的結束扇區地址是完全連續或者相隔不多的。反之,如果相差很大,則算作一次隨機I/O
連續I/O比隨機I/O效率高的原因是:在做連續I/O的時候,磁頭幾乎不用換道,或者換道的時間很短;而對于隨機I/O,如果這個I/O很多的話,會導致磁頭不停地換道,造成效率的極大降低。
順序/并發I/O從概念上講,并發I/O就是指向一塊磁盤發出一條I/O指令后,不必等待它回應,接著向另外一塊磁盤發I/O指令。對于具有條帶性的RAID(LUN),對其進行的I/O操作是并發的,例如:raid0+1(1+0),raid5等。反之則為順序I/O。
四、磁盤I/O性能的監控監控磁盤的I/O性能,我們可以使用AIX的系統命令,例如:sar-d,iostat,topas,nmon等。下面,我將以nmon和topas為例,講述在系統中如何觀察磁盤I/O的性能。
topas登錄AIX操作系統,輸入topas,然后按D,會出現如下界面:
在上圖中,TPS即為磁盤的IOPS,KBPS即為磁盤每秒的吞吐量。由于服務器處于空閑的狀態,我們可以看到IOPS,KBPS的數據都非常低。
我們使用ddif命令向磁盤hdisk2發讀I/O,block大小為1MB:
利用topas進行監控:
此時,hdisk2的吞吐量為163.9M,IOPS為655。
我們再啟動一個ddif,使hdisk的busy數值達到100%:
從上圖可以看出,在磁盤busy達到100%的時候,其吞吐量為304.1M,IOPS為1200。
hdisk2是本地集成的SAS盤,我們可以查出本地集成SAS通道的帶寬為3Gb:
對于3Gb的SAS通道,304.1M的磁盤吞吐量已經接近其I/O帶寬的峰值了。
需要指出的是,使用ddif測量磁盤的帶寬是可行的,但是由此來確定業務I/O的IOPS和吞吐量是不科學的。因為,ddif所發起的讀寫僅為順序I/O讀寫,在OLTP的業務中,這種讀寫是不常見的,而是隨機小I/O比較多,因此,測量業務的磁盤I/O性能,需要在運行業務的時候進行監控。
nmon可以得到此時磁盤hdisk2吞吐量為318M。
使用nmon收集一個時間段的數據,然后使用nmon***yzer進行分析,可以得出更為直接的圖表:
將收集好的nmon文件使用nmon***yzer進行分析,得出如下報表:
圖2.nmon圖表顯示磁盤性能五、磁盤I/O性能調優確認磁盤I/O存在性能問題對于隨機負載,當遇到余下情況時,我們那通常認為存在I/O性能問題:
1.平均讀時間大于15ms
2.在具有寫cache的條件下,平均寫時間大于2.5ms
對于順序負載,當遇到余下情況時,我們那通常認為存在I/O性能問題:
1.在一個磁盤上有兩個連續的I/O流
2.吞吐量不足(即遠遠小于磁盤I/O帶寬)
對于一塊磁盤來講,隨著IOPS數量的增加,I/Oservice也會增加,并且會有一個飽和點,即IOPS達到某個點以后,IOPS再增加將會引起I/Oservicetime的顯著增加。
圖3.磁盤IOPS與IOservicetime關系圖從經驗上講,我們在測試工作中,我們主要關注IOPS和吞吐量以及磁盤的busy%這三個數值。如果IOPS和吞吐量均很低,磁盤的busy%也很低,我們會認為磁盤壓力過小,造成吞吐量和IOPS過低;只有在IOPS和吞吐量均很低,磁盤的busy%很高(接近100%)的時候,我們才會從磁盤I/O方面分析I/O性能
介紹通常在討論不同RAID保護類型的性能的時候,結論都會是RAID-1提供比較好的讀寫性能,RAID-5讀性能不錯,但是寫入性能就不如RAID-1,RAID-6保護級別更高,但寫性能相對更加差,RAID10是提供最好的性能和數據保護,不過成本最高等等。其實決定這些性能考慮的因素很簡單,它就是RAIDWritePenalty(寫懲罰)。本文從原理上解釋了不同RAID保護級別的寫懲罰,以及通過寫懲罰計算可用IOPS的***。
更多信息RAID-5WritePenalty的例子:
存儲方案規劃的過程中,最基本的考慮因素有兩個,性能和容量。性能上的計算看可以分為IOPS和帶寬需求。計算IOPS,拋開存儲陣列的緩存和前端口不談。計算后端物理磁盤的IOPS不能簡單的把物理磁盤的最大IOPS相加而獲得。原因是,對于不同的RAID級別,為了保證當有物理磁盤損壞的情況下可以恢復數據,數據寫入的過程中都需要有一些特別的計算。比如對于RAID-5,條帶上的任意磁盤上的數據改變,都會重新計算校驗位。如下圖所示,一個7+1的RAID-5的條帶中,七個磁盤存儲數據,最后一個磁盤存儲校驗位。
對于一個數據的寫入,我們假設在第五個磁盤上寫入的數據為1111,如下圖所示。那么整個RAID-5需要完成寫入的過程分為以下幾步:
讀取原數據0110,然后與新的數據1111做XOR操作:0110XOR1111=1001讀取原有的校驗位0010用第一步算出的數值與原校驗位再做一次XOR操作:0010XOR1001=1011然后將1111新數據寫入到數據磁盤,將第三步計算出來的新的校驗位寫入校驗盤。由上述幾個步驟可見,對于任何一次寫入,在存儲端,需要分別進行兩次讀+兩次寫,所以說RAID-5的WritePenalty的值是4。
不同RAID級別的WritePenalty:
下表列出了各種RAID級別的WritePenalty值:
RAID
WritePenalty
0
1
1
2
5
4
6
6
10
2
RAID-0:直接的條帶,數據每次寫入對應物理磁盤上的一次寫入
RAID-1和10:RAID-1和RAID-10的寫懲罰很簡單理解,因為數據的鏡像存在的,所以一次寫入會有兩次。
RAID-5:RAID-5由于要計算校驗位的機制存在,需要讀數據、讀校驗位、寫數據、寫校驗位四個步驟,所以RAID-5的寫懲罰值是4。
RAID-6:RAID-6由于有兩個校驗位的存在,與RAID-5相比,需要讀取兩次校驗位和寫入兩次校驗位,所以RAID-6的寫懲罰值是6。
計算IOPS:
根據上文的描述,在實際存儲方案設計的過程中,計算實際可用IOPS的過程中必須納入RAID的寫懲罰計算。計算的公式如下:
物理磁盤總的IOPS=物理磁盤的IOPS×磁盤數目
可用的IOPS=(物理磁盤總的IOPS×寫百分比÷RAID寫懲罰)+(物理磁盤總的IOPS×讀百分比)
假設組成RAID-5的物理磁盤總共可以提供500IOPS,使用該存儲的應用程序讀寫比例是50%/50%,那么對于前端主機而言,實際可用的IOPS是:
(500×50%÷4)+(500*50%)=312.5IOPS
具體不同應用程序的讀寫比例,可以參考:關于不同應用程序存儲IO類型的描述
===================================
機械硬盤的連續讀寫性很好,但隨機讀寫性能很差。這是因為磁頭移動至正確的磁道上需要時間,隨機讀寫時,磁頭不停的移動,時間都花在了磁頭尋道上,所以性能不高。如下圖:
在存儲小文件(圖片)、OLTP數據庫應用時,隨機讀寫性能(IOPS)是最重要指標。
學習它,有助于我們分析存儲系統的性能互瓶頸。下面我們來認識隨機讀寫性能指標--IOPS(每秒的輸入輸出次數)。
磁盤性能指標--IOPS----------------------------------------------------------IOPS(Input/OutputPerSecond)即每秒的輸入輸出量(或讀寫次數),是衡量磁盤性能的主要指標之一。IOPS是指單位時間內系統能處理的I/O請求數量,一般以每秒處理的I/O請求數量為單位,I/O請求通常為讀或寫數據操作請求。隨機讀寫頻繁的應用,如小文件存儲(圖片)、OLTP數據庫、郵件服務器,關注隨機讀寫性能,IOPS是關鍵衡量指標。順序讀寫頻繁的應用,傳輸大量連續數據,如電視臺的視頻編輯,視頻點播VOD(VideoOnDemand),關注連續讀寫性能。數據吞吐量是關鍵衡量指標。IOPS和數據吞吐量適用于不同的場合:讀取10000個1KB文件,用時10秒Throught(吞吐量)=1MB/s,IOPS=1000追求IOPS讀取1個10MB文件,用時0.2秒Throught(吞吐量)=50MB/s,IOPS=5追求吞吐量磁盤服務時間--------------------------------------傳統磁盤本質上一種機械裝置,如FC,SAS,SATA磁盤,轉速通常為5400/7200/10K/15Krpm不等。影響磁盤的關鍵因素是磁盤服務時間,即磁盤完成一個I/O請求所花費的時間,它由尋道時間、旋轉延遲和數據傳輸時間三部分構成。尋道時間Tseek是指將讀寫磁頭移動至正確的磁道上所需要的時間。尋道時間越短,I/O操作越快,目前磁盤的平均尋道時間一般在3-15ms。旋轉延遲Trotation是指盤片旋轉將請求數據所在扇區移至讀寫磁頭下方所需要的時間。旋轉延遲取決于磁盤轉速,通常使用磁盤旋轉一周所需時間的1/2表示。比如,7200rpm的磁盤平均旋轉延遲大約為60*1000/7200/2=4.17ms,而轉速為15000rpm的磁盤其平均旋轉延遲為2ms。數據傳輸時間Ttransfer是指完成傳輸所請求的數據所需要的時間,它取決于數據傳輸率,其值等于數據大小除以數據傳輸率。目前IDE/ATA能達到133MB/s,SATAII可達到300MB/s的接口數據傳輸率,數據傳輸時間通常遠小于前兩部分消耗時間。簡單計算時可忽略。
常見磁盤平均物理尋道時間為:7200轉/分的STAT硬盤平均物理尋道時間是9ms10000轉/分的STAT硬盤平均物理尋道時間是6ms15000轉/分的SAS硬盤平均物理尋道時間是4ms
常見硬盤的旋轉延遲時間為:
7200rpm的磁盤平均旋轉延遲大約為60*1000/7200/2=4.17ms
10000rpm的磁盤平均旋轉延遲大約為60*1000/10000/2=3ms,
15000rpm的磁盤其平均旋轉延遲約為60*1000/15000/2=2ms。
最大IOPS的理論計算***--------------------------------------IOPS=1000ms/(尋道時間+旋轉延遲)。可以忽略數據傳輸時間。7200rpm的磁盤IOPS=1000/(9+4.17)=76IOPS10000rpm的磁盤IOPS=1000/(6+3)=111IOPS15000rpm的磁盤IOPS=1000/(4+2)=166IOPS影響測試的因素-----------------------------------------實際測量中,IOPS數值會受到很多因素的影響,包括I/O負載特征(讀寫比例,順序和隨機,工作線程數,隊列深度,數據記錄大小)、系統配置、操作系統、磁盤驅動等等。因此對比測量磁盤IOPS時,必須在同樣的測試基準下進行,即便如此也會產生一定的隨機不確定性。隊列深度說明NCQ、SCSITCQ、PATATCQ和SATATCQ技術解析----------------------------------------是一種命令排序技術,一把喂給設備更多的IO請求,讓電梯算法和設備有機會來安排合并以及內部并行處理,提高總體效率。SCSITCQ的隊列深度支持256級ATATCQ的隊列深度支持32級(需要8M以上的緩存)NCQ最高可以支持命令深度級數為32級,NCQ可以最多對32個命令指令進行排序。大多數的軟件都是屬于同步I/O軟件,也就是說程序的一次I/O要等到上次I/O操作的完成后才進行,這樣在硬盤中同時可能僅只有一個命令,也是無法發揮這個技術的優勢,這時隊列深度為1。隨著Intel的超線程技術的普及和應用環境的多任務化,以及異步I/O軟件的大量涌現。這項技術可以被應用到了,實際隊列深度的增加代表著性能的提高。在測試時,隊列深度為1是主要指標,大多數時候都參考1就可以。實際運行時隊列深度也一般不會超過4.IOPS可細分為如下幾個指標:-----------------------------------------數據量為n字節,隊列深度為k時,隨機讀取的IOPS數據量為n字節,隊列深度為k時,隨機寫入的IOPSIOPS的測試benchmark工具------------------------------------------IOPS的測試benchmark工具主要有Iometer,IoZone,FIO等,可以綜合用于測試磁盤在不同情形下的IOPS。對于應用系統,需要首先確定數據的負載特征,然后選擇合理的IOPS指標進行測量和對比分析,據此選擇合適的存儲介質和軟件系統。