I/O 的概念,從字義來理解就是輸入輸出。操做系統從上層到底層,各個層次之間均存在 I/O。好比,CPU 有 I/O,內存有 I/O, VMM 有 I/O, 底層磁盤上也有 I/O,這是廣義上的 I/O。一般來說,一個上層的 I/O 可能會產生針對磁盤的多個 I/O,也就是說,上層的 I/O 是稀疏的,下層的 I/O 是密集的。ios
磁盤的 I/O,顧名思義就是磁盤的輸入輸出。輸入指的是對磁盤寫入數據,輸出指的是從磁盤讀出數據。咱們常見的磁盤類型有 ATA、SATA、FC、SCSI、SAS,如圖1所示。這幾種磁盤中,服務器經常使用的是 SAS 和 FC 磁盤,一些高端存儲也使用 SSD 盤。每一種磁盤的性能是不同的。服務器
SAN(Storage Area Network, 存儲區域網絡)和NAS存儲(Network Attached Storage,網絡附加存儲)通常都具有2個評價指標:IOPS和帶寬(throughput),兩個指標互相獨立又相互關聯。體現存儲系統性能的最主要指標是IOPS。下面,將介紹一下這兩個參數的含義。網絡
IOPS (Input/Output Per Second)即每秒的輸入輸出量(或讀寫次數),是衡量磁盤性能的主要指標之一。IOPS是指單位時間內系統能處理的I/O請求數量,I/O請求一般爲 讀或寫數據操做請求。隨機讀寫頻繁的應用,如OLTP(Online Transaction Processing),IOPS是關鍵衡量指標。另外一個重要指標是數據吞吐量(Throughput),指單位時間內能夠成功傳輸的數據數量。對於大量 順序讀寫的應用,如VOD(Video On Demand),則更關注吞吐量指標。架構
簡而言之:併發
磁盤的 IOPS,也就是在一秒內,磁盤進行多少次 I/O 讀寫。dom
磁盤的吞吐量,也就是每秒磁盤 I/O 的流量,即磁盤寫入加上讀出的數據的大小。ide
每秒 I/O 吞吐量= IOPS* 平均 I/O SIZE。從公式能夠看出: I/O SIZE 越大,IOPS 越高,那麼每秒 I/O 的吞吐量就越高。所以,咱們會認爲 IOPS 和吞吐量的數值越高越好。實際上,對於一個磁盤來說,這兩個參數均有其最大值,並且這兩個參數也存在着必定的關係。工具
IOPS可細分爲以下幾個指標:性能
Toatal IOPS,混合讀寫和順序隨機I/O負載狀況下的磁盤IOPS,這個與實際I/O狀況最爲相符,大多數應用關注此指標。測試
Random Read IOPS,100%隨機讀負載狀況下的IOPS。
Random Write IOPS,100%隨機寫負載狀況下的IOPS。
Sequential Read IOPS,100%順序讀負載狀況下的IOPS。
Sequential Write IOPS,100%順序寫負載狀況下的IOPS。
下圖爲一個典型的NFS測試結果:
IOPS的測試benchmark工具主要有Iometer, IoZone, FIO等,能夠綜合用於測試磁盤在不一樣情形下的IOPS。對於應用系統,須要首先肯定數據的負載特徵,而後選擇合理的IOPS指標進行測量和對比分析,據此選擇合適的存儲介質和軟件系統。
對於磁盤來講 一個完整的IO操做是這樣進行的:當控制器對磁盤發出一個IO操做命令的時候,磁盤的驅動臂(Actuator Arm)帶讀寫磁頭(Head)離開着陸區(Landing Zone,位於內圈沒有數據的區域),移動到要操做的初始數據塊所在的磁道(Track)的正上方,這個過程被稱爲尋址(Seeking),對應消耗的時 間被稱爲尋址時間(Seek Time);可是找到對應磁道還不能立刻讀取數據,這時候磁頭要等到磁盤盤片(Platter)旋轉到初始數據塊所在的扇區(Sector)落在讀寫磁頭 正上方的以後才能開始讀取數據,在這個等待盤片旋轉到可操做扇區的過程當中消耗的時間稱爲旋轉延時(Rotational Delay);接下來就隨着盤片的旋轉,磁頭不斷的讀/寫相應的數據塊,直到完成此次IO所須要操做的所有數據,這個過程稱爲數據傳送(Data Transfer),對應的時間稱爲傳送時間(Transfer Time)。完成這三個步驟以後一次IO操做也就完成了。
在咱們看硬盤廠商的宣傳單的時候咱們常常能看到3個參數,分別是平均尋址時間、盤片旋轉速度以及最大傳送速度,這三個參數就能夠提供給咱們計算上述三個步驟的時間。
第一個尋址時間,考慮到被讀寫的數據可能在磁盤的任意一個磁道,既有可能在磁盤的最內圈(尋址時間最短),也可能在磁盤的最外圈(尋址時間最長),因此在計算中咱們只考慮平均尋址時間,也就是磁盤參數中標明的那個平均尋址時間,這裏就採用當前最多的10krmp硬盤的5ms。
第二個旋轉延時, 和尋址同樣,當磁頭定位到磁道以後有可能正好在要讀寫扇區之上,這時候是不須要額外額延時就能夠馬上讀寫到數據,可是最壞的狀況確實要磁盤旋轉整整一圈之 後磁頭才能讀取到數據,因此這裏咱們也考慮的是平均旋轉延時,對於10krpm的磁盤就是(60s/10k)*(1/2) = 2ms。
第三個傳送時間, 磁盤參數提供咱們的最大的傳輸速度,固然要達到這種速度是頗有難度的,可是這個速度倒是磁盤純讀寫磁盤的速度,所以只要給定了單次 IO的大小,咱們就知道磁盤須要花費多少時間在數據傳送上,這個時間就是IO Chunk Size / Max Transfer Rate。
如今咱們就能夠得出這樣的計算單次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大小咱們能夠得出下面的一系列的數據
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
從上面的數據能夠看出,當單次IO越小的時候,單次IO所耗費的時間也越少,相應的IOPS也就越大。
上面咱們的數 據都是在一個比較理想的假設下得出來的,這裏的理想的狀況就是磁盤要花費平均大小的尋址時間和平均的旋轉延時,這個假設實際上是比較符合咱們實際狀況中的隨 機讀寫,在隨機讀寫中,每次IO操做的尋址時間和旋轉延時都不能忽略不計,有了這兩個時間的存在也就限制了IOPS的大小。如今咱們考慮一種相對極端的順 序讀寫操做,好比說在讀取一個很大的存儲連續分佈在磁盤的的文件,由於文件的存儲的分佈是連續的,磁頭在完成一個讀IO操做以後,不須要重新的尋址,也不 須要旋轉延時,在這種狀況下咱們能到一個很大的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
相比第一組數據來講差距是很是的大的,所以當咱們要用IOPS來衡量一個IO系統的系能的時候咱們必定要說清楚是在什麼狀況的IOPS,也就是要說明讀寫的方式以及單次IO的大小,固然在實際當中,特別是在OLTP的系統的,隨機的小IO的讀寫是最有說服力的。
大致上講,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 指令。對於具備條帶性的 RAID(LUN),對其進行的 I/O 操做是併發的,例如:raid 0+1(1+0),raid5 等。反之則爲順序 I/O。
監控磁盤的 I/O 性能,咱們可使用 AIX 的系統命令,例如:sar -d, iostat, topas, nmon 等。下面,我將以 nmon 和 topas 爲例,講述在系統中如何觀察磁盤 I/O 的性能。
登陸 AIX 操做系統,輸入 topas,而後按 D,會出現以下界面:
在上圖中,TPS 即爲磁盤的 IOPS,KBPS 即爲磁盤每秒的吞吐量。因爲服務器處於空閒的狀態,咱們能夠看到 IOPS,KBPS 的數據都很是低。
咱們使用 dd if 命令向磁盤 hdisk2 發讀 I/O,block 大小爲 1MB:
利用 topas 進行監控:
此時,hdisk2 的吞吐量爲 163.9M,IOPS 爲 655。
咱們再啓動一個 dd if,使 hdisk 的 busy 數值達到 100%:
從上圖能夠看出,在磁盤 busy 達到 100% 的時候,其吞吐量爲 304.1M,IOPS 爲 1200。
hdisk2 是本地集成的 SAS 盤,咱們能夠查出本地集成 SAS 通道的帶寬爲 3Gb:
對於 3Gb 的 SAS 通道,304.1M 的磁盤吞吐量已經接近其 I/O 帶寬的峯值了。
須要指出的是,使用 dd if 測量磁盤的帶寬是可行的,可是由此來肯定業務 I/O 的 IOPS 和吞吐量是不科學的。由於,dd if 所發起的讀寫僅爲順序 I/O 讀寫,在 OLTP 的業務中,這種讀寫是不常見的,而是隨機小 I/O 比較多,所以,測量業務的磁盤 I/O 性能,須要在運行業務的時候進行監控。
在系統中輸入 nmon,按 d,能夠獲得以下界面 :
能夠獲得此時磁盤 hdisk2 吞吐量爲 318M。
使用 nmon 收集一個時間段的數據,而後使用 nmon analyzer 進行分析,能夠得出更爲直接的圖表:
將收集好的 nmon 文件使用 nmon analyzer 進行分析,得出以下報表:
對於隨機負載,當遇到餘下狀況時,咱們那一般認爲存在 I/O 性能問題:
1. 平均讀時間大於 15ms
2. 在具備寫 cache 的條件下,平均寫時間大於 2.5ms
對於順序負載,當遇到餘下狀況時,咱們那一般認爲存在 I/O 性能問題:
1. 在一個磁盤上有兩個連續的 I/O 流
2. 吞吐量不足(即遠遠小於磁盤 I/O 帶寬)
對於一塊磁盤來說,隨着 IOPS 數量的增長,I/O service 也會增長,而且會有一個飽和點,即 IOPS 達到某個點之後,IOPS 再增長將會引發 I/O service time 的顯著增長。
從經驗上講, 咱們在測試工做中,咱們主要關注 IOPS 和吞吐量以及磁盤的 busy% 這三個數值。若是 IOPS 和吞吐量均很低,磁盤的 busy% 也很低,咱們會認爲磁盤壓力太小,形成吞吐量和 IOPS 太低;只有在 IOPS 和吞吐量均很低,磁盤的 busy% 很高(接近 100%)的時候,咱們纔會從磁盤 I/O 方面分析 I/O 性能。