IO性能分析

一.單磁盤I/O性能分析

1.IO:輸入輸出

input(寫入)  output(讀出)

 

2.單個IO讀寫:完成一個寫IO或者是讀IO的操作。

一個讀IO的操作:當控制磁盤的控制器接到操作系統的讀IO操作指令的時候》控制器就會給磁盤發出一個讀數據的指令—》並同時將要讀取的數據塊的地址傳遞給磁盤》然後磁盤會將讀取到的數據傳給控制器—》並由控制器返回給操作系統,完成

一個寫IO的操作:控制器接到寫的IO操作的指令和要寫入的數據》並將其傳遞給磁盤》磁盤在數據寫入完成之後將操作結果傳遞迴控制器》再由控制器返回給操作系統,完成。

3.隨機訪問(Random Access)與連續訪問(Sequential Access)

隨機訪問指的是本次IO所給出的扇區地址和上次IO給出扇區地址相差比較大,這樣的話磁頭在兩次IO操作之間需要作比較大的移動動作才能重新開始讀/寫數據。

連續訪問指的是這次IO給出的扇區地址與上次IO結束的扇區地址一致或者是接近的話,那磁頭就能很快的開始這次IO操作,這樣的多個IO操作稱爲連續訪問。

因此儘管相鄰的兩次IO操作在同一時刻發出,但如果它們的請求的扇區地址相差很大的話也只能稱爲隨機訪問,而非連續訪問。

4.順序IO模式(Queue Mode)/併發IO模式(Burst Mode)

磁盤控制器可能會一次對磁盤組發出一連串的IO命令。

如果磁盤組一次只能執行一個IO命令時稱爲順序IO

當磁盤組能同時執行多個IO命令時,稱爲併發IO

併發IO只能發生在由多個磁盤組成的磁盤組上,單塊磁盤只能一次處理一個IO命令。

5.單次IO的大小(IO Chunk Size)

數據庫存儲有個基本的塊大小(Block Size),不管是SQL Server還是Oracle,默認的塊大小都是8KB,就是數據庫每次讀寫都是以8k爲單位的。那麼對於數據庫應用發出的固定8k大小的單次讀寫到了磁盤這個層面會是怎麼樣的呢,就是對於讀寫磁盤來說單個IO操作操作數據的大小是多少不是一個固定的值。

原因:首先操作系統爲了提高 IO的性能而引入了文件系統緩存(File System Cache),系統會根據請求數據的情況將多個來自IO的請求先放在緩存裏面,然後再一次性的提交給磁盤,也就是說對於數據庫發出的多個8K數據塊的讀操作有可能放在一個磁盤讀IO裏就處理了。

還有對於有些存儲系統也是提供了緩存(Cache)的,接收到操作系統的IO請求之後也是會將多個操作系統的 IO請求合併成一個來處理。

      不管是操作系統層面的緩存還是磁盤控制器層面的緩存,目的都只有一個,提高數據讀寫的效率。因此每次單獨的IO操作大小都是不一樣的,它主要取決於系統對於數據讀寫效率的判斷。

當一次IO操作大小比較小的時候我們稱爲小的IO操作,比如說1K4K8K這樣的;當一次IO操作的數據量比較大的時候稱爲大IO操作,比如說32K64K甚至更大。

在我們說到塊大小(Block Size)的時候通常我們會接觸到多個類似的概念,像我們上面提到的那個在數據庫裏面的數據最小的管理單位,Oralce稱之爲塊(Block),大小一般爲8KSQL Server稱之爲頁(Page),一般大小也爲8k

在文件系統裏面我們也能碰到一個文件系統的塊,在現在很多的Linux系統中都是4K(通過 /usr/bin/time -v可以看到),它的作用其實跟數據庫裏面的塊/頁是一樣的,都是爲了方便數據的管理。但是說到單次IO的大小,跟這些塊的大小都是沒有直接關係的,在英文裏單次IO大小通常被稱爲是IO Chunk Size,不會說成是IO Block Size的。

 

6.IOPS(IO per Second)

      IO系統每秒所執行IO操作的次數稱爲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。尋道時間是影響隨機IO性能的首要因素

  第二個旋轉延時,和尋址一樣,當磁頭定位到磁道之後有可能正好在要讀寫扇區之上,這時候是不需要額外額延時就可以立刻讀寫到數據,但是最壞的情況確實要磁盤旋轉整整一圈之後磁頭才能讀取到數據,所以這裏我們也考慮的是平均旋轉延時,對於10krpm的磁盤就是(60s/15k)*(1/2) = 2ms

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

7.IOPS計算公式

  現在我們就可以得出這樣的計算單次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的讀寫是最有說服力的。

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

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

  Transfer Rate = IOPS * IO Chunk Size

  還是那上面的第一組IOPS的數據我們可以得出相應的傳輸速度如下

  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%

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

  這裏一定要明確一個概念,那就是儘管上面我們使用IOPS來計算傳輸速度,但是實際上傳輸速度和IOPS是沒有直接關係,在沒有緩存的情況下它們共同的決定因素都是對磁盤系統的訪問方式以及單個IO的大小。對磁盤進行隨機訪問時候我們可以利用IOPS來衡量一個磁盤系統的性能,此時的傳輸速度不會太大;但是當對磁盤進行連續訪問時,此時的IOPS已經沒有了參考的價值,這個時候限制實際傳輸速度卻是磁盤的最大傳輸速度。因此在實際的應用當中,只會IOPS來衡量小IO的隨機讀寫的性能而當要衡量大IO連續讀寫的性能的時候就要採用傳輸速度而不能是IOPS了。

8.IO響應時間(IO Response Time)

  最後來關注一下能直接描述IO性能的IO響應時間。IO響應時間也被稱爲IO延時(IO Latency)IO響應時間就是從操作系統內核發出的一個讀或者寫的IO命令到操作系統內核接收到IO迴應的時間,注意不要和單個IO時間混淆了,單個IO時間僅僅指的是IO操作在磁盤內部處理的時間,而IO響應時間還要包括IO操作在IO等待隊列中所花費的等待時間。

  計算IO操作在等待隊列裏面消耗的時間有一個衍生於利托氏定理(Little’s Law)的排隊模型M/M/1模型可以遵循,由於排隊模型算法比較複雜,到現在還沒有搞太明白(如果有誰對M/M/1模型比較精通的話歡迎給予指導),這裏就羅列一下最後的結果,還是那上面計算的IOPS數據來說:

  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 => 沒響應了
……
  
105 => 88.6 ms
  
75 => 24.6 ms
  45 => 14.6 ms

  從上面的數據可以看出,隨着系統實際IOPS越接近理論的最大值,IO的響應時間會成非線性的增長,越是接近最大值,響應時間就變得越大,而且會比預期超出很多。一般來說在實際的應用中有一個70%的指導值,也就是說在IO讀寫的隊列中,當隊列大小小於最大IOPS70%的時候,IO的響應時間增加會很小,相對來說讓人比較能接受的,一旦超過70%,響應時間就會戲劇性的暴增,所以當一個系統的IO壓力超出最大可承受壓力的70%的時候就是必須要考慮調整或升級了。

另外補充說一下這個70%的指導值也適用於CPU響應時間,這也是在實踐中證明過的,一旦CPU超過70%,系統將會變得受不了的慢。很有意思的東西。

9.單碟容量

  單碟容量也是影響磁盤性能的一個間接因素。單碟容量越高,證明相同空間內的數據量越大,也就是數據密度越大。在相同的轉速和尋道速度條件下,具有高數據密度的磁盤會顯示出更高的性能。因爲在相同的開銷下,單碟容量高的磁盤會讀出更多的數據。

10.接口速度

   接口速度是影響磁盤性能最不重要的一個因素。目前的接口速度理論上都已經滿足了磁盤所能達到的最高外部傳輸帶寬。在隨機IO情況下,接口速度顯的更加不重要,因爲此時瓶頸機會全部在尋道速度上。

11.轉速

   轉速是影響硬盤連續IO時吞吐量性能的首要因素。讀寫數據時,磁頭不會動,全靠盤片的轉動來將對應扇區中的數據感應給磁頭。所以盤片裝的越快,數據傳輸時間就越短。在連續IO情況下,磁頭臂尋道次數很少,所以要提高吞吐量或者IOPS的值,轉速就是首要影響因素了。

二.緩存和raid如何提高IO

從上一篇文章:IO系統性能之一:衡量性能的幾個指標的計算中我們可以看到一個15k轉速的磁盤在隨機讀寫訪問的情況下IOps竟然只有140左右,但在實際應用中我們卻能看到很多標有5000IOPS甚至更高的存儲系統,有這麼大IOPS的存儲系統怎麼來的呢?這就要歸結於各種存儲技術的使用了,在這些存儲技術中使用最廣的就是高速緩存(Cache)和磁盤冗餘陣列(RAID)了,本文就將探討緩存和磁盤陣列提高存儲IO性能的方法。

1.高速緩存(Cache

在當下的各種存儲產品中,按照速度從快到慢應該就是內存>閃存>磁盤>磁帶了,然而速度越快也就意味着價格越高,閃存雖然說是發展勢頭很好,但目前來說卻還是因爲價格問題無法普及,因此現在還是一個磁盤作霸王的時代。與CPU和內存速度相比,磁盤的速度無疑是計算機系統中最大的瓶頸了,所以在必須使用磁盤而又想提高性能的情況下,人們想出了在磁盤中嵌入一塊高速的內存用來保存經常訪問的數據從而提高讀寫效率的方法來折中的解決,這塊嵌入的內存就被稱爲高速緩存。

說到緩存,這東西應用現在已經是無處不在,從處於上層的應用,到操作系統層,再到磁盤控制器,還有CPU內部,單個磁盤的內部也都存在緩存,所有這些緩存存在的目的都是相同的,就是提高系統執行的效率。

當然在這裏我們只關心跟IO性能相關的緩存,與IO性能直接相關的幾個緩存分別是文件系統緩存(File System Cache)、磁盤控制器緩存(Disk Controller Cache)和磁盤緩存(Disk Cache,也稱爲Disk Buffer),不過當在計算一個磁盤系統性能的時候文件系統緩存也是不會考慮在內的,因此我們重點考察的就是磁盤控制器緩存和磁盤緩存。

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

緩存數據
首先是系統讀取過的數據會被緩存在高速緩存中,這樣下次再次需要讀取相同的數據的時候就不用在訪問磁盤,直接從緩存中取數據就可以了。當然使用過的數據也不可能在緩存中永久保留的,緩存的數據一般那是採取LRU算法來進行管理,目的是將長時間不用的數據清除出緩存,那些經常被訪問的卻能一直保留在緩存中,直到緩存被清空。

2.預讀

預讀是指採用預讀算法在沒有系統的IO請求的時候事先將數據從磁盤中讀入到緩存中,然後在系統發出讀IO請求的時候,就會實現去檢查看看緩存裏面是否存在要讀取的數據,如果存在(即命中)的話就直接將結果返回,這時候的磁盤不再需要尋址、旋轉等待、讀取數據這一序列的操作了,這樣是能節省很多時間的;如果沒有命中則再發出真正的讀取磁盤的命令去取所需要的數據。

緩存的命中率跟緩存的大小有很大的關係,理論上是緩存越大的話,所能緩存的數據也就越多,這樣命中率也自然越高,當然緩存不可能太大,畢竟成本在那兒呢。如果一個容量很大的存儲系統配備了一個很小的讀緩存的話,這時候問題會比較大的,因爲小緩存緩存的數據量非常小,相比整個存儲系統來說比例非常低,這樣隨機讀取(數據庫系統的大多數情況)的時候命中率也自然就很低,這樣的緩存不但不能提高效率(因爲絕大部分讀IO都還要讀取磁盤),反而會因爲每次去匹配緩存而浪費時間。

執行讀IO操作是讀取數據存在於緩存中的數量與全部要讀取數據的比值稱爲緩存命中率(Read Cache Hit Radio),假設一個存儲系統在不使用緩存的情況下隨機小IO讀取能達到150IOps,而它的緩存能提供10%的緩存命中率的話,那麼實際上它的IOPS可以達到150/1-10%=166

3.回寫

首先說一下,用於回寫功能的那部分緩存被稱爲寫緩存(Write Cache)。在一套寫緩存打開的存儲中,操作系統所發出的一系列寫IO命令並不會被挨個的執行,這些寫IO的命令會先寫入緩存中,然後再一次性的將緩存中的修改推到磁盤中,這就相當於將那些相同的多個IO合併成一個,多個連續操作的小IO合併成一個大的IO,還有就是將多個隨機的寫IO變成一組連續的寫IO,這樣就能減少磁盤尋址等操作所消耗的時間,大大的提高磁盤寫入的效率。

讀緩存雖然對效率提高是很明顯的,但是它所帶來的問題也比較嚴重,因爲緩存和普通內存一樣,掉點以後數據會全部丟失,當操作系統發出的寫IO命令寫入到緩存中後即被認爲是寫入成功,而實際上數據是沒有被真正寫入磁盤的,此時如果掉電,緩存中的數據就會永遠的丟失了,這個對應用來說是災難性的,目前解決這個問題最好的方法就是給緩存配備電池了,保證存儲掉電之後緩存數據能如數保存下來。

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

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

RAIDRedundant Array Of Inexpensive Disks
如果你是一位數據庫管理員或者經常接觸服務器,那對RAID應該很熟悉了,作爲最廉價的存儲解決方案,RAID早已在服務器存儲中得到了普及。在RAID的各個級別中,應當以RAID10RAID5(不過RAID5已經基本走到頭了,RAID6正在崛起中,看看這裏瞭解下原因)應用最廣了。下面將就RAID0RAID1RAID5RAID6RAID10這幾種級別的RAID展開說一下磁盤陣列對於磁盤性能的影響,當然在閱讀下面的內容之前你必須對各個級別的RAID的結構和工作原理要熟悉纔行,這樣纔不至於滿頭霧水,推薦查看wikipedia上面的如下條目:RAIDStandard RAID levelsNested RAID levels

4.RAID0

RAID0將數據條帶化(striping)將連續的數據分散在多個磁盤上進行存取,系統發出的IO命令(不管讀IO和寫IO都一樣)就可以在磁盤上被並行的執行,每個磁盤單獨執行自己的那一部分請求,這樣的並行的IO操作能大大的增強整個存儲系統的性能。假設一個RAID0陣列有nn>=2)個磁盤組成,每個磁盤的隨機讀寫的IO能力都達到140的話,那麼整個磁盤陣列的IO能力將是140n。同時如果在陣列總線的傳輸能力允許的話RAID0的吞吐率也將是單個磁盤的n倍。

5.RAID1

RAID1在容量上相當於是將兩個磁盤合併成一個磁盤來使用了,互爲鏡像的兩個磁盤裏面保存的數據是完全一樣的,因此在並行讀取的時候速度將是n個磁盤速度的總和,但是寫入就不一樣了,每次寫入都必須同時寫入到兩個磁盤中,因此寫入速度只有n/2

6.RAID5

我們那一個有nn>=3)個磁盤的RAID5陣列來看,首先看看RAID5陣列的讀IORAID5是支持並行IO的,而磁盤上的數據呈條帶狀的分佈在所有的磁盤上,因此讀IO的速度相當於所有磁盤速度的總和。不過這是在沒有磁盤損壞的情況下,當有一個磁盤故障的時候讀取速度也是會下降的,因爲中間需要花時間來計算丟失磁盤上面的數據。
讀取數據的情況相對就要複雜的多了,先來看下RAID5奇偶校驗數據寫入的過程,我們把寫入的數據稱爲D1,當磁盤拿到一個寫IO的命令的時候,它首先會讀取一次要入的地址的數據塊中修改之前的數據D0,然後再讀取到當前條帶中的校驗信息P0,接下來就根據D0P0D1這三組數據計算出數據寫入之後的條帶的奇偶校驗信息P1,最後發出兩個寫IO的命令,一個寫入D1,另一個寫入奇偶校驗信息P1。可以看出陣列在實際操作的時候需要讀、讀、寫、寫一共4IO才能完成一次寫IO操作,也就是實際上的寫入速度只有所有磁盤速度總和的1/4。從這點可以看出RAID5是非常不適合用在要大批量寫入數據的系統上的。

7.RAID6

RAID6RAID5很類似,差別就在於RAID6多了一個用於校驗的磁盤。就寫IO速度上來說這兩個是完全一樣的,都是所有磁盤IO速度的總和。
在寫IO上也很是類似,不同的是RAID將一個命令分成了三次讀、三次寫一共6IO命令才能完成,也就是RAID6實際寫入磁盤的速度是全部磁盤速度之和的1/6。可以看出從寫IORAID6RAID5差別是很大的。

8.RAID10

RAID0讀寫速度都很好,卻沒有冗餘保護;RAID5RAID6都有同樣的毛病就是寫入的時候慢,讀取的時候快。那麼RAID1呢?嗯,這裏要說的就是RAID1,其實不管是RAID10還是RAID01,其實都是組合大於2塊磁盤時候的RAID1,當先鏡像後條帶時候就稱爲RAID10,先條帶後鏡像的時候稱爲RAID01。從性能上看RAID01RAID10都是一樣的,都是RAID1嘛,但是RAID10在重建故障磁盤的時候性能比RAID01要快。
因爲RAID10其實就是RAID1,所以它的性能與RAID1也就是一樣的了,這裏不需要再做過多的討論。

四個性能指標的變化

9. IO響應時間(IO Response Time

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

10.估算磁盤總體IOPS

綜合上面兩個部分的討論我們來估算一下陣列下的磁盤總體IOPS,在這裏我們先假設組成陣列的單個磁盤的隨機讀寫的IOPS140,讀寫緩存命中率都爲10%,組成陣列的磁盤個數爲4

因爲不管是那種陣列,磁盤的讀取性能都是所有磁盤之和,所以可以得出下面的讀取IOPS

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

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

  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

由此我們也可以計算出寫入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

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

本篇最後附送一個計算磁盤系統IOPS的網站――wmarow’s disk & disk array calculator,這個網站提供的計算公式還考慮了諸如陣列條帶大小以及主機方面的因素,很有參考價值,至於怎麼選擇合適的條帶大小,以後還會撰文解釋。

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

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

  random_throughtput = random_IOPS IO_chunk_size

三.磁盤陣列讀寫性能

Cache命中率、是否併發IO、隨機或連續讀寫、raid級別、單次IO大小、數據塊大小、IOPS大小(尋道時間+盤片延遲+傳輸時間)、IO響應時間、IO吞吐量有關

1.Raid0

無冗餘、無校驗 

       至少需要2塊磁盤

       理論連續讀寫速度是單磁盤的2倍,隨機讀寫速度按理論是有可能增加的,這取決於數據分片大小和讀寫的大小

       raid0持續讀寫僅在併發IO+分割塊很大的時候,iops會增加很多

       raid0隨機讀寫僅在併發IO+分割塊很大的時候,iops顯著增加

       安全性下降2

       容量是所有磁盤的總和

2.Raid1

通過磁盤數據鏡像實現數據冗餘

       至少需要2塊或者2的倍數的磁盤

       讀速度爲單磁盤的2倍,隨機和連續寫速度與單磁盤相同(同時寫入到兩個磁盤)

       安全性能提高

       容量是所有磁盤的一半

3.Raid1+0

2個鏡像結構組合成1個帶區結構,也就是raid1+raid0的組合(先做raid1,再做raid0

         至少4塊盤

         容量是所有盤的一半

         主要用於容量不大,要求速度和容錯的小IO數據庫環境下

         Raid1+0raid0+1容錯方面更高

4.Raid0+1

2個冗餘結構組合成1個鏡像結構,也是raid0+raid1的組合(先做的raid0,再做raid1

         至少4塊盤

         容量是所有盤的一半

5.Raid5

擁有校驗數據,校驗數據分佈在每個磁盤上,每個條帶組中有一個校驗條帶

      容量等於所有磁盤的總容量—1塊磁盤的容量(校驗數據佔用一塊盤容量)

至少需要三塊磁盤

允許損壞一塊盤,數據不會丟失

      用於大型文件存儲,數據倉庫,如醫療系統、視頻編輯系統等從空間利用的角度建議採用raid5

      寫性能較差,因爲每次寫數據多要計算校驗並寫入新校驗:

把一個數字2變成數字4,那麼對於RAID5,實際發生了4io
先讀出2與校驗6,可能發生讀命中
然後在cache中計算新的校驗
寫入新的數字4與新的校驗8

同樣的單個操作,最終RAID10只需要2io

      讀性能很好

6.Raid寫懲罰

寫速度上的性能損失。

      RAID 5要經過5個步驟,差不多就是“讀”--“算”--“寫”的過程

        讀出老數據

讀出校驗數據

計算新校驗數據

寫新數據

寫新校驗數據

      普通硬盤的寫操作當然就是有一個步驟:“寫”

      假設你是4塊盤做的RAID5,條帶大小爲1MB

那麼,如果寫入一個2MB的數據,那麼DISK11MBDISK21MBDISK3不動,DISK41MB校驗碼,如果再寫2MB數據,那麼爲了充分利用空間,DISK31MB,下一個條帶:DISK11MB校驗碼,DISK21MBDISK3/4不動。

問題出現在:第二次寫入數據時,DISK31MB,那麼該條帶的DISK1DISK2的數據沒變,但是DISK4記錄的是校驗碼,校驗碼是改變了點,那麼具體操作爲——寫DISK3、讀DISK1/DISK2/DISK4、計算校驗碼、寫校驗碼——這就是OVERHEAD,多一次讀寫

      RAID 5盤陣中有一塊盤損壞,如果還要寫數據,就要對所有的未損壞盤全部進行寫操作。當然恢復一個損壞的磁盤,要把所有的數據全部讀一邊才能計算出損壞磁盤上的數據。例如,一個由5塊磁盤構成的RAID 5,進行修復時需要把其他四塊盤上的數據全部讀一遍;由10塊盤構成的RAID5,進行修復時需要把其他9塊盤上的數據全部讀一遍。

      5塊盤構成的RAID5中,差不多恢復一個146G的磁盤需要2個小時的時間。而在這兩個小時過程中一定不能發生第二塊盤損壞,否則就只能是“丟數據”了。

四.磁盤陣列瓶頸

我們知道,在存儲系統的採購過程中,廠商往往能夠提供漂亮的性能參數,但實際運行中,該系統的實際性能表現並不能達到我們所期望的狀態,那麼在運行環境中存儲系統的實際性能究竟受哪些環節和瓶頸的影響呢?

之所以要和大家來討論這個問題,是因爲在本人的工作中曾遇到一個實際的Case,在這個case中,一個恢復壓力很大的standby(這裏主要是寫,而且是小io的寫),採用了RAID5的方案,發現性能很差,後來改造成了RAID10,就很好的避免了性能的問題。
陣列的瓶頸主要體現在2個方面:帶寬 IOPS(單位時間傳輸的數據量,和單位時間完成的I/O數)

1.影響帶寬的主要因素

存儲系統的帶寬主要取決於陣列的構架,光纖通道的大小(我們今天討論的陣列一般都是光纖陣列, SCSI這樣的SSA陣列,暫時不在討論範圍之列)以及硬盤的個數。

所謂陣列構架影響存儲系統帶寬,指的是存儲系統內部架構會存在一些內部帶寬,類似於PC的系統總線,儘管陣列的構架因不同廠商不同型號的產品而各有不同,不過一般情況下,內部帶寬都設計的很充足,不會是瓶頸的所在。

光纖通道對帶寬的影響還是比較大的,例如數據倉庫環境中,對數據的流量要求很大,而一塊2Gb的光纖卡,所能支撐的最大流量應當是2GB/8= 250Mb/s的實際流量,必須配備4塊光纖卡才能達到1Gb/s的實際流量,所以對於數據倉庫的環境來說,升級到光纖4Gb並非是廠商過於超前的產品更新,在大流量的數據環境下絕對有必要考慮更換4GB的光纖卡。

但是對於存儲系統的帶寬來說,硬盤接口的帶寬限制是最重要的。當前面的瓶頸不再存在的時候,帶寬就完全取決於硬盤的個數了,我下面列一下不同規格的硬盤所能支撐的流量大小,數據取自硬盤廠商的標準參數:

eee

如果我們假定一個陣列有12015K rpm轉速的光纖硬盤,那麼硬盤上最大的可以支撐的數據流量爲120*13=1560Mb/s,當前端接口不成爲瓶頸的時候,1560Mb/s就是理論上的最大數據流量。

而如果要實現上述的最大帶寬,如果前端採用2GB的光纖卡,可能需要配置6塊才能夠,而4GB的光纖卡,配置3-4塊就夠了。因此我們可以知道,前端的光纖接口必須與後端磁盤個數相匹配。

但是否考慮到這些因素就足夠了呢,存儲系統的整體性能還受到多方面因素的影響,下面我們將分析存儲系統的另外一個重要的性能指標:IOPS

2.影響IOPS的主要因素

我們前面已經說過了,廠商所提供的IOPS值是在理想狀態下測試出來的,對實際的運行性能的參考並不大,所以我們有必要通過以下幾個方面來衡量該系統的實際IOPS的可能表現。

決定IOPS的主要因素取決於陣列的算法,cache命中率,以及磁盤個數。

陣列的算法也因爲不同廠商不同型號的產品而不同,如我們最近遇到在HDS USP上面,可能因爲ldev(lun)存在隊列或者資源限制,而單個ldevIOPS就上不去。所以,決定採購某型號的存儲之前,有必要了解這個存儲的一些算法規則與限制。

cache命中率對實際IOPS有決定性的影響,Cache命中率取決於數據的分佈,cache size的大小,數據訪問的規則,以及cache的算法,如果完整的討論下來,這裏將變得很複雜,可以有一天來慢慢討論。

我們這裏把這些內部原理都省略掉,只強調:對於一個存儲陣列來說,讀cache的命中率越高,一般就表示它可以支持更多的IOPS,爲什麼這麼說呢?這個就與我們下面要討論的硬盤IOPS有關係了。

每個物理硬盤能處理的IOPS是有限制的,如

fff


同樣,如果一個陣列有12015K rpm轉速的光纖硬盤,那麼,它能支撐的最大IOPS120*150=18000,這個爲硬件限制的理論值,如果超過這個值,硬盤的響應可能會變的非常緩慢而不能正常提供業務。較高的讀cache命中率,能降低硬盤的IOPS負荷,讓硬盤在較小的壓力下良好工作。

 

五.不同RAIDIOPS性能的影響

在我們的上一篇文章“RAID5RAID10,哪種RAID適合你()”中曾經討論過,在RAID5RAID10的不同機制上,讀數據時,IOPS性能其實沒有差別。但是,相同的業務,在寫入數據時,採用不同的RAID機制最終落在磁盤上的IOPS是有差別的,我們評估的正是磁盤的整體IOPS,如果達到了磁盤的限制,性能肯定是上不去了。

那我們假定一個case,業務應用的IOPS10000,讀cache命中率是30%,讀IOPS60%,寫IOPS40%,磁盤個數爲120,那麼分別計算在RAID5RAID10的情況下,每個磁盤的IOPS爲多少。

RAID5:
1.
單塊盤的IOPS = (10000*(1-0.3)*0.6 + 4 * (10000*0.4))/120
2. = (4200 + 16000)/120
3. = 168

這裏的10000*(1-0.3)*0.6表示是讀的IOPS,比例是0.6,除掉cache命中,實際只有4200個讀IOPS

4 * (10000*0.4) 表示寫的IOPS,因爲每一個寫,在RAID5中,實際發生了4io,所以寫的IOPS16000個。

爲了考慮RAID5在寫操作的時候,那2個讀操作也可能發生命中,所以更精確的計算應該爲:
1.
單塊盤的IOPS = (10000*(1-0.3)*0.6 + 2 * (10000*0.4)*(1-0.3) + 2 * (10000*0.4))/120
2. = (4200 + 5600 + 8000)/120
3. = 148

這樣我們計算出來單個盤的IOPS148個,基本達到磁盤IOPS極限,在這種情況下,磁盤的工作狀態是非常不理想的。

RAID10IOPS性能的影響
1.
單塊盤的IOPS = (10000*(1-0.3)*0.6 + 2 * (10000*0.4))/120
2. = (4200 + 8000)/120
3. = 102

可以看到,因爲RAID10對於一個寫操作,只發生2io,所以,同樣的壓力,同樣的磁盤,每個盤的IOPS只有102個,還遠遠低於磁盤的極限IOPS

這裏回到我們先前討論的case上來,在我們先前採用RAID5的時候,通過分析,每個磁盤的IOPS在高峯時期,快達到200了,導致響應速度巨慢無比。改造成RAID10,每個磁盤的IOPS降到100左右,很好的避免了這個性能問題。

因此,綜合本文的上篇“RAID5RAID10,哪種RAID適合你,我們可以得出結論:

影響讀數據的關鍵因素是cache命中率,在讀數據的情況下,RAID5RAID10性能本身沒有太大差別。但是對於寫數據的一些應用,尤其是小I/O頻繁寫入的一些應用,如企業ERP生產系統等等,RAID10相比RAID5可能產生較大的性能差異。而大型文件存儲,數據倉庫,如醫療PACS系統、視頻編輯系統則從空間利用的角度,建議採用RAID5

下面我們來說說什麼是 RAID

RAID是英文Redundant Array of Independent Disks的縮寫,翻譯成中文意思是獨立磁盤冗餘陣列,有時也簡稱磁盤陣列(Disk Array)。

簡單的說,RAID是一種把多塊獨立的硬盤(物理硬盤)按不同的方式組合起來形成一個硬盤組(邏輯硬盤),從而提供比單個硬盤更高的存儲性能和提供數據備份技術。組成磁盤陣列的不同方式成爲RAID級別(RAID Levels)。數據備份的功能是在用戶數據一旦發生損壞後,利用備份信息可以使損壞數據得以恢復,從而保障了用戶數據的安全性。在用戶看起來,組成的磁盤組就像是一個硬盤,用戶可以對它進行分區,格式化等等。總之,對磁盤陣列的操作與單個硬盤一模一樣。不同的是,磁盤陣列的存儲速度要比單個硬盤高很多,而且可以提供自動數據備份。

  RAID技術的兩大特點:一是速度、二是安全,由於這兩項優點,RAID技術早期被應用於高級服務器中的SCSI接口的硬盤系統中,隨着近年計算機技術的發展,PC機的CPU的速度已進入GHz 時代。IDE接口的硬盤也不甘落後,相繼推出了ATA66ATA100硬盤。這就使得RAID技術被應用於中低檔甚至個人PC機上成爲可能。RAID通常是由在硬盤陣列塔中的RAID控制器或電腦中的RAID卡來實現的。

RAID技術經過不斷的發展,現在已擁有了從 RAID 0 6 七種基本的RAID 級別。另外,還有一些基本RAID級別的組合形式,如RAID 10RAID 0RAID 1的組合),RAID 50RAID 0RAID 5的組合)等。不同RAID 級別代表着不同的存儲性能、數據安全性和存儲成本。但我們最爲常用的是下面的幾種RAID形式。

(1) RAID 0
(2) RAID 1
(3) RAID 0+1
(4) RAID 3
(5) RAID 5

ggg


RAID
級別的選擇有三個主要因素:可用性(數據冗餘)、性能和成本。如果不要求可用性,選擇RAID0以獲得最佳性能。如果可用性和性能是重要的而成本不是一個主要因素,則根據硬盤數量選擇RAID 1。如果可用性、成本和性能都同樣重要,則根據一般的數據傳輸和硬盤的數量選擇RAID3、RAID5。

 

原帖出處:it168(http://storage.it168.com/h/2007-06-12/200706121108656.shtml)

raid10寫入不用依賴cache命中率,只要一味的寫入、讀取即可

raid5寫入要通過一系列的計算、校驗,過程比較複雜,但是讀取時候的性能一般都比較好

存儲是目前IT產業發展的一大熱點,而RAID技術是構造高性能、海量存儲的基礎技術,也是構建網絡存儲的基礎技術。專家認爲,磁盤陣列的性能優勢得益於磁盤運行的並行性,提高設備運行並行度可以提高磁盤的性能和數據安全性

20年來,RAID 推出了一系列級別,包括RAID 0RAID 1RAID 2RAID 3RAID4RAID 5,以及各種組合如 RAID 0+1 等。其中最廣泛的包括RAID5RAID10。但是一直以來,關於RAID5RAID10的性能優劣的爭端還是非常多的,甚至很多人包括很多公司都那拿出了測試數據。而這些測試數據複雜難懂相互矛盾,更加讓用戶感到迷惑,不知道如何選擇。

在這裏,我將就這兩種RAID的內部運行原理來分析一下,看看我們在什麼情況下應當適合選哪一種RAID方式。根據我的經驗與分析:象小io數據庫類型操作,如ERP等等應用,建議採用RAID10,而大型文件存儲,數據倉庫,如醫療PACS系統、視頻編輯系統則從空間利用的角度,建議採用RAID5。下面請看詳細的性能對比:

本文分爲上下兩篇,上文側重分析兩種RAID的內部運行原理,下文將根據不同的影響磁盤性能的因素來分析,RAID方案對磁盤系統的影響,參考“RAID5RAID10,哪種RAID更適合你() ”

爲了方便對比,我這裏拿同樣多驅動器的磁盤來做對比,RAID5選擇3D+1PRAID方案,RAID10選擇2D+2DRaid方案,分別如圖

RAID5+RAID10

那麼,我們分析如下三個過程:讀,連續寫,隨機寫,但是,在介紹這三個過程之前,我需要介紹另外一個磁盤陣列中的重要概念:cache.

1.磁盤讀寫速度的關鍵之一:Cache

cache技術最近幾年,在磁盤存儲技術上,發展的非常迅速,作爲高端存儲,cache已經是整個存儲的核心所在,就是中低端存儲,也有很大的cache存在,包括最簡單的RAID卡,一般都包含有幾十,甚至幾百兆的RAID cache

cache的主要作用是什麼呢?作爲緩存,cache的作用具體體現在讀與寫兩個不同的方面:作爲寫,一般存儲陣列只要求數據寫到cache就算完成了寫操作,當寫cache的數據積累到一定程度,陣列才把數據刷到磁盤,可以實現批量的寫入。所以,陣列的寫是非常快速的。至於cache數據的保護,一般都依賴於鏡相與電池(或者是UPS)。

cache在讀數據方面的作用一樣不可忽視,因爲如果所需要讀取的數據能在cache中命中的話,將大大減少磁盤尋道所需要的時間。因爲磁盤從開始尋道到找到數據,一般都在6ms以上,而這個時間,對於那些密集型I/O的應用可能不是太理想。但是,如果能在cache保存的數據中命中,一般響應時間則可以縮短在1ms以內。

//不要迷信存儲廠商的IOPS(每秒的io數)數據,他們可能全部在cache命中的基礎上做到的,但是實際上,你的cache命中率可能只有10%//

介紹完cache,我們就可以解釋RAID5RAID10在不同的模式下,工作效率問題了,那麼我們來分別分析讀操作、連續寫和離散寫三方面的問題。

2.讀操作方面的性能差異

如我上文的介紹,磁盤陣列讀操作的關鍵更多的體現在cache的命中率上。所以,RAID5RAID10在讀數據上面,他們基本是沒有差別的,除非是讀的數據能影響cache命中率,導致命中率不一樣。

連續寫方面的性能差異
連續寫的過程,一般表示寫入連續的大批量的數據,如媒體數據流,很大的文件等等。連續寫操作大多數產生於醫療PACS系統、高教圖書館系統、視頻編輯系統等等應用環境下。

根據我本人的經驗,在連續寫操作過程,如果有寫cache存在,並且算法沒有問題的話,RAID5RAID10甚至會更好一些,雖然也許並沒有太大的差別。(這裏要假定存儲有一定大小足夠的寫cache,而且計算校驗的cpu不會出現瓶頸)。

因爲這個時候的RAID校驗是在cache中完成,如4塊盤的RAID5,可以先在內存中計算好校驗,同時寫入3個數據+1個校驗。而RAID10只能同時寫入2個數據+2個鏡相。

連續寫

如上圖所示,4塊盤的RAID5可以在同時間寫入123cache,並且在cache計算好校驗之後,我這裏假定是6(實際的校驗計算並不是這樣的,我這裏僅僅是假設),同時把三個數據寫到磁盤。而4塊盤的RAID10不管cache是否存在,寫的時候,都是同時寫2個數據與2個鏡相。

根據我前面對緩存原理的介紹,寫cache是可以緩存寫操作的,等到緩存寫數據積累到一定時期再寫到磁盤。但是,寫到磁盤陣列的過程是遲早也要發生的,所以RAID5RAID10在連續寫的情況下,從緩存到磁盤的寫操作速度會有較小的區別。不過,如果不是連續性的強連續寫,只要不達到磁盤的寫極限,差別並不是太大。

3.離散寫方面的性能差異

這裏可能會較難理解,但是,這一部分也是最重要的部分。企業中的絕大部分數據庫應用,如ERP系統等等在數據寫入的時候其實都是離散寫。

例如oracle數據庫每次寫一個數據塊的數據,如8K;由於每次寫入的量不是很大,而且寫入的次數非常頻繁,因此聯機日誌看起來會像是連續寫。但是因爲不保證能夠添滿RAID5的一個條帶(保證每張盤都能寫入),所以很多時候更加偏向於離散寫入。

ddd

我們從上圖看一下離散寫的時候,RAID5RAID10工作方式有什麼不同。如上圖:我們假定要把一個數字2變成數字4,那麼對於RAID5,實際發生了4io
先讀出2與校驗6,可能發生讀命中
然後在cache中計算新的校驗
寫入新的數字4與新的校驗8

如上圖我們可以看到:對於RAID10,同樣的單個操作,最終RAID10只需要2io,而RAID5需要4io

這裏我忽略了RAID5在那兩個讀操作的時候,可能會發生讀命中操作的情況。也就是說,如果需要讀取的數據已經在cache中,可能是不需要4io的。這也證明了cacheRAID5 的重要性,不僅僅是計算校驗需要,而且對性能的提升尤爲重要。我本人曾經測試過,在RAID5的陣列中,如果關閉寫cacheRAID5的性能將差很多倍。

當然,我並不是說cacheRAID10就不重要了,因爲寫緩衝,讀命中等,都是提高速度的關鍵所在,不過的是,RAID10cache的依賴性沒有RAID5那麼明顯而已。

到這裏,大家應當也大致明白了RAID5RAID10的原理與差別了,一般來說,象小io的數據庫類型操作,建議採用RAID10,而大型文件存儲,數據倉庫,則從空間利用的角度,可以採用RAID5

 

Raid-dp加盤和raid5加盤區別

1.raid-dp加盤

Raid-dp加盤,兩塊獨立的校驗盤不需要重新計算,不用重組raid,原來有數據的磁盤不需要重做條帶,當新數據寫入的時候,新次磁盤生成條帶,隨後校驗盤有update

2.raid5加盤

Raid5加盤,需要重新計算校驗數據,需要重組raid。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章