怎樣測試云硬盤的性能
操作須知
測試性能時,若分區的初始磁柱編號是非4KiB對齊,則對性能影響較大,請先確保分區的初始磁柱編號已經4KiB對齊,再開始測試。
說明測試共享云硬盤性能時,必須滿足以下要求:
共享云硬盤必須同時掛載至多臺云主機(彈性云主機或者裸金屬服務器)。
當共享云硬盤掛載至多臺彈性云主機時,這些彈性云主機必須位于同一個策略為“反親和性”的云主機組內。如果彈性云主機不滿足反親和性,則共享云硬盤性能無法達到最佳。
測試共享云硬盤性能時,必須滿足以下要求:
- 共享云硬盤必須同時掛載至多臺云主機(彈性云主機或者裸金屬服務器)。
- 當共享云硬盤掛載至多臺彈性云主機時,這些彈性云主機必須位于同一個策略為“反親和性”的云主機組內。
如果彈性云主機不滿足反親和性,則共享云硬盤性能無法達到最佳。
測試方法分為以下兩種:
- Windows
- Linux
Windows
本文以“Windows 7 Professional 64位”操作系統為例,不同操作系統的格式化操作可能不同,本文僅供參考,具體操作步驟和差異請參考對應操作系統的產品文檔。
測試性能前請先安裝Iometer性能測試工具,Iometer官網地址為 。
步驟 1 登錄云主機。
步驟 2 使用“win+r”組合鍵打開運行窗口,并輸入“msinfo32”,單擊“確定”。 彈出系統信息窗口。
步驟 3 選擇“組件 > 存儲 > 磁盤”,在右側區域查看分區起始偏移值。
- 若4096能被該參數值整除,則表示已經4KiB對齊,請執行步驟 4 。
- 若4096不能被該參數值整除,則表示未4KiB對齊,如需繼續測試請重新按照4KiB對齊分區。
注意刪除分區并重新按照4KiB對齊選取初始磁柱編號時會導致磁盤原有數據的丟失,請謹慎操作。
步驟 4 使用Iometer工具測試磁盤性能,具體方法請參見Iometer產品文檔。
在進行IOPS和吞吐量測試時,Iometer參數配置和fio工具的參數相同,具體請參考表fio參數說明。
以下為使用Iometer工具測試磁盤性能的一個示例:
- 設置工作流。

- 設置測試時間。
示例中測試時間為10分鐘,前60秒不做計算,等待寫入穩定后開始計算磁盤性能。

- 設置64 KB塊寫入,采用100%的順序寫。

- 查看測試結果。

Linux
CentOS 6.5等較老版本的操作系統用fdisk創建分區時,默認為非4KiB對齊選擇初始磁柱編號,對性能有較大的影響,建議針對該類操作系統,在創建分區時4KiB對齊選取初始磁柱編號。
本文以“CentOS 7.2 64位”操作系統為例,不同操作系統的格式化操作可能不同,本文僅供參考,具體操作步驟和差異請參考對應操作系統的產品文檔。
測試性能前請先安裝fio性能測試工具。
步驟 1 登錄云主機并切換為root用戶。
步驟 2 進行性能測試之前,請執行以下步驟,確認磁盤分區的初始磁柱編號是否已經4KiB對齊。
fdisk -lu
回顯類似如下信息:
[root@ecs-centos sdc]# fdisk -lu
Disk /dev/xvda: 10.7 GiB, 10737418240 bytes, 20971520 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x7db77aa5
Device Boot Start End Blocks Id System
/dev/xvda1 * 2048 20968919 10483436 83 Linux
Disk /dev/xvdb: 10.7 GiB, 10737418240 bytes, 20971520 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk /dev/xvdc: 53.7 GiB, 53687091200 bytes, 104857600 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x3cf3265c
Device Boot Start End Blocks Id System
/dev/xvdc1 2048 41943039 20970496 83 Linux
- 若start對應的初始磁柱編號能被8整除,則表示4KiB對齊,請執行步驟3進行性能測試。
- 若start對應的初始磁柱編號不能被8整除,則表示未4KiB對齊,如需繼續測試請刪除原有分區,重新按照4KiB對齊選擇初始磁柱編號。
注意刪除分區并重新按照4KiB對齊選取初始磁柱編號會導致磁盤原有數據的丟失,請謹慎操作。
步驟 3 執行以下命令,使用fio工具測試磁盤性能。
- 測試隨機寫IOPS:fio -direct= 1 -iodepth= 128 -rw= randwrite -ioengine= libaio -bs= 4k -size= 10G -numjobs= 1 -runtime= 600 -group_reporting -filename= /opt/fiotest/fiotest.txt -name= Rand_Write_IOPS_Test
- 測試隨機讀IOPS: fio -direct= 1 -iodepth= 128 -rw= randread -ioengine= libaio -bs= 4k -size= 10G -numjobs= 1 -runtime= 600 -group_reporting -filename= /opt/fiotest/fiotest.txt * -name= Rand_Read_IOPS_Test
- 測試寫吞吐量: fio -direct= 1 -iodepth= 32 -rw= write -ioengine= libaio -bs= 1024k -size= 10G -numjobs= 1 -runtime= 600 -group_reporting -filename= /opt/fiotest/fiotest.txt -name= Write_BandWidth_Test
- 測試讀吞吐量: fio -direct= 1 -iodepth= 32 -rw= read -ioengine= libaio -bs= 1024k -size= 10G -numjobs= 1 -runtime= 600 -group_reporting -filename= /opt/fiotest/fiotest.txt -name= Read_BandWidth_Test
- 測試單隊列隨機讀時延: fio -direct= 1 -iodepth= 1 -rw= randread -ioengine =libaio -bs= 4k -size= 10G -numjobs= 1 -runtime= 60 -group_reporting -filename= /opt/fiotest/fiotest.txt -name= Rand_Read_LATE_Test
注意
使用fio工具進行裸盤性能測試時,不能在已創建文件系統的磁盤上測試,因為fio性能測試會破壞文件系統,導致磁盤變為只讀,需要刪除后重新購買。
請盡量不要在保存業務數據的磁盤上進行測試。如果需要,請按照以下建議操作:
在測試開始前對磁盤數據進行備份,防止誤操作造成數據丟失。
在測試命令中指定filename參數為某個文件,例如 -filename=/opt/fiotest/fiotest.txt 。
測試fio相關參數說明如下表所示。
表: 參數說明
| 參數 | 說明 |
|---|---|
| direct | 定義是否使用direct IO,可選值如下: 值為0,表示使用buffered IO 值為1,表示使用direct IO |
| iodepth | 定義測試時的IO隊列深度。此處定義的隊列深度是指每個線程的隊列深度,如果有多個線程測試,意味著每個線程都是此處定義的隊列深度。fio總的IO并發數=iodepth * numjobs。 例如: 單線程,且-iodepth=32,則該線程的IO隊列深度為32,fio總的IO并發數=32*1=32。 多線程(3個線程),且-iodepth=32,則3個線程的IO隊列深度均為32,fio總的IO并發數=32*3=96。 |
| rw | 定義測試時的讀寫策略,可選值如下: 隨機讀:randread 隨機寫:randwrite 順序讀:read 順序寫:write 混合隨機讀寫:randrw |
| ioengine | 定義fio如何下發IO請求,通常有同步IO和異步IO: 同步IO一次只能發出一個IO請求,等待內核完成后才返回。這樣對于單個線程IO隊列深度總是小于1,但是可以透過多個線程并發執行來解決。通常會用16~32個線程同時工作把IO隊列深度塞滿。 異步IO則通常使用libaio這樣的方式一次提交一批IO請求,然后等待一批的完成,減少交互的次數,會更有效率。 |
| bs | 定義IO的塊大小(block size),單位是k、K、m和M等,默認IO塊大小為4 KB。 |
| size | 定義測試IO操作的數據量,若未指定runtime這類參數,fio會將指定大小的數據量全部讀/寫完成,然后才停止測試。該參數的值,可以是帶單位的數字,比如size=10G,表示讀/寫的數據量為10GiB;也可是百分數,比如size=20%,表示讀/寫的數據量占該設備總文件的20%的空間。 |
| numjobs | 定義測試的并發線程數。 |
| runtime | 定義測試時間。如果未配置,則持續將size指定的文件大小,以每次bs值為分塊大小讀/寫完。 |
| group_reporting | 定義測試結果顯示模式,group_reporting表示匯總每個進程的統計信息,而非以不同job匯總展示信息。 |
| filename | 定義測試文件(設備)的名稱。 此處選擇文件,則代表測試文件系統的性能。例如:-filename=/opt/fiotest/fiotest.txtl 此處選擇設備名稱,則代表測試裸盤的性能。例:-filename=/dev/vdb須知 如果在已經分區、并創建文件系統,且已寫入數據的磁盤上進行性能測試,請注意filename選擇指定文件,以避免覆蓋文件系統和原有數據。 |
| name | 定義測試任務名稱。 |
使用fio工具測試性能,測試結果不對怎么辦
問題描述
根據性能測試的方法,得到的測試結果與預期不符。
排查思路
測試云硬盤性能時,云硬盤本身以及壓測條件都起著重要的作用。
以下排查思路根據原因的出現概率進行排序,建議您從高頻率原因往低頻率原因排查,從而幫助您快速找到問題的原因。
如果解決完某個可能原因仍未解決問題,請繼續排查其他可能原因。
注意部分操作會導致磁盤原有數據丟失,建議使用裸盤進行性能測試。
圖:排查思路

表:排查思路
| 可能原因 | 處理措施 |
|---|---|
| 分區的初始磁柱編號4KiB對齊 | 檢查分區的初始磁柱編號是否4KiB對齊。非4KiB對齊請刪除原有分區,重新按照4KiB對齊選擇初始磁柱編號。 |
| 測試盤不是裸盤 | 請重新購買裸盤掛載至云主機進行測試。 |
| 壓測條件設置不合理 | 為了發揮出多核并發的系統性能,壓測出目標性能指標,建議設置為多核,并且合理安排隊列。 |
| 數據塊大小設置不合理 | 重新設置數據塊大小。l 測試IOPS時,建議將數據塊設置為一個較小的值,如4k。l 測試吞吐量時,建議將數據塊設置為一個較大的值,如1024k。 |
檢查分區的初始磁柱編號是否4KiB對齊
步驟 1 登錄云主機并切換為root用戶。
步驟 2 進行性能測試之前,請執行以下步驟,確認磁盤分區的初始磁柱編號是否已經4KiB對齊。
fdisk -lu
回顯類似如下信息:
[root@ecs-centos sdc]# fdisk -lu
Disk /dev/xvda: 10.7 GiB, 10737418240 bytes, 20971520 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x7db77aa5
Device Boot Start End Blocks Id System
/dev/xvda1 * 2048 20968919 10483436 83 Linux
Disk /dev/xvdb: 10.7 GiB, 10737418240 bytes, 20971520 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk /dev/xvdc: 53.7 GiB, 53687091200 bytes, 104857600 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x3cf3265c
Device Boot Start End Blocks Id System
/dev/xvdc1 2048 41943039 20970496 83 Linux
- 若start對應的初始磁柱編號能被8整除,則表示4KiB對齊。
- 若start對應的初始磁柱編號不能被8整除,則表示未4KiB對齊,如需繼續測試請刪除原有分區,重新按照4KiB對齊選擇初始磁柱編號。
注意刪除分區并重新按照4KiB對齊選取初始磁柱編號會導致磁盤原有數據的丟失,請謹慎操作。
云硬盤讀寫慢、IO升高怎么辦
問題現象
當您感知到業務變慢時,可以通過以下方法進行檢查:
- Windows:查看“任務管理器”中的“平均響應時間”。
- Linux:執行iostat -dx命令查看IO性能。
如果云硬盤出現讀寫慢、IO升高、await值變大等現象,說明云硬盤的性能出現了瓶頸。
解決辦法
建議您更換性能更高的磁盤類型。
如果您的云硬盤中有重要數據,可以通過云硬盤備份創建新的云硬盤,從而保留云硬盤數據。方法如下:
- 通過云硬盤創建備份。
圖:創建備份

- 再從備份創建新的云硬盤,創建過程中可以為云硬盤重新選擇“磁盤類型”和“高級配置”,包括共享盤、SCSI和加密。
圖:從備份創建云硬盤

為什么磁盤的I/O使用率已接近100%,但磁盤的讀IOPS沒有達到IOPS上限?
問題現象:
單塊500GiB的超高IO磁盤,磁盤I/O使用率為99.94%時,磁盤的讀IOPS只有12000,沒有達到磁盤的IOPS上限。
原因說明:
- 磁盤I/O使用率達到100%,不能代表磁盤的IOPS也達到上限。
磁盤I/O使用率,用于統計測量對象在測量周期內提交讀取或寫入操作的占比,不能代表磁盤的I/O性能數據,僅代表磁盤的繁忙程度。
由于云硬盤具有可以并行處理多個I/O請求的能力,因此當磁盤的I/O使用率達到100%時,也不表示達到了磁盤的瓶頸。例如:某個云硬盤處理單個I/O請求需要0.1秒,且可以同時處理10個I/O請求,那么當10個I/O請求依次按順序(串行)提交時,需要1秒才可以全部完成,則在1秒的采樣周期中,磁盤的I/O使用率達到了100%;而如果10個I/O請求一次性全部(并行)提交時,需要0.1秒就可以全部完成,則在1秒的采樣周期中,磁盤的I/O使用率僅達到10%。由此可見,即使磁盤的I/O使用率達到100%,磁盤仍然有余力可以處理更多的I/O請求,即沒有達到飽和狀態。
- 磁盤的讀IOPS沒有達到IOPS上限的原因
對于500GiB的超高IO磁盤,其IOPS性能上限=min (單個云硬盤最大IOPS, 單個云硬盤最小IOPS + 每GiB云硬盤的IOPS × 云硬盤容量 ) = min (33000, 1500 + 50 × 500 ) = 26500
磁盤的讀IOPS,用于統計每秒從測量對象讀取數據的請求次數。IOPS實際是由時延控制的,目前在數據塊大小為4KiB的情況下,超高IO磁盤的單隊列訪問時延為1ms,那么在單隊列場景下,1秒可以處理的IOPS為1000,即當IOPS為12000時,隊列深度大約為12,如果要達到IOPS上限26500,則隊列深度大約需要達到26。