測試ESSD雲端硬碟IOPS效能
阿里雲ESSD雲端硬碟結合25GE網路和RDMA技術,為您提供單盤高達100萬的隨機讀寫能力和單路低時延效能。您可以按照本樣本配置ESSD雲端硬碟效能的壓測條件,測試ESSD雲端硬碟作為裸盤時的IOPS。
壓測條件
-
測試載入器:使用FIO。
說明FIO(Flexible I/O Tester)是一個開源的、強大的I/O效能測試工具,可以用來對存放裝置進行隨機讀寫、順序讀寫等負載測試。
-
執行個體規格:推薦使用ecs.g7se.32xlarge。更多資訊,請參見通用型(g系列)。
-
鏡像:使用公用鏡像中高版本的Linux鏡像,本文使用Alibaba Cloud Linux 3。
說明經測試發現部分Linux發行版鏡像可能無法達到預期的效能,強烈推薦您使用阿里雲官方維護的Alibaba Cloud Linux 3鏡像。
-
ESSD雲端硬碟:
-
測試裸盤可以獲得較為真實的雲端硬碟效能,建議您直接通過FIO壓測裸盤進行雲端硬碟效能測試。
-
推薦使用ESSD PL3雲端硬碟。關於ESSD雲端硬碟的更多資訊,請參見ESSD雲端硬碟。
重要測試裸盤可以獲得較為真實的Block Storage效能。但如果Block Storage裝置中含有分區、檔案系統以及其他資料,直接使用FIO壓測會導致檔案系統異常以及資料丟失,請在測試前提前建立快照做好資料備份。具體操作,請參見手動建立單個快照。
-
操作步驟
遠端連線ECS執行個體。
具體操作,請參見使用Workbench登入Linux執行個體。
-
運行以下命令,查詢Block Storage的裝置名稱。
sudo fdisk -lu其中 /dev/vda 為系統硬碟,/dev/vdb 和 /dev/vdc 為資料盤。
[ecs-a ]$ sudo fdisk -lu Disk /dev/vda: 40 GiB, 42949672960 bytes, 83886080 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 Disklabel type: gpt Disk identifier: F51132A7-67B1-4650-806D-FD0DE6E1210C Device Start End Sectors Size Type /dev/vda1 2048 6143 4096 2M BIOS boot /dev/vda2 6144 415743 409600 200M EFI System /dev/vda3 415744 83886046 83470303 39.8G Linux filesystem Disk /dev/vdb: 30 GiB, 32212254720 bytes, 62914560 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 Disklabel type: gpt Disk identifier: C36DF120-8650-4188-8043-AEF9C85F31EF Device Start End Sectors Size Type /dev/vdb1 2048 62912511 62910464 30G Linux filesystem Disk /dev/vdc: 40 GiB, 42949672960 bytes, 83886080 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如上所示,該執行個體有3塊Block Storage裝置,系統硬碟/dev/vda、資料盤/dev/vdb、/dev/vdc。
-
運行以下命令,查詢Block Storage裝置是否存在分區和檔案系統。
sudo blkid[ecs-a]$ sudo blkid /dev/vdb1: UUID="9c32c24f-d2b8-4aa8-8xxx" BLOCK_SIZE="4096" TYPE="ext4" PARTLABEL="primary" PARTUUID="4bd66635-f5f4-4dc0-9bdd-664fd5b8d2fb" /dev/vda2: SEC_TYPE="msdos" UUID="7E" BLOCK_SIZE="512" TYPE="vfat" PARTUUID="82a50cd6-9899-41eb-91fe-7027bf257086" /dev/vda3: LABEL="root" UUID="beef9d8d-ba84-46d9-8xxx" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="e0d4fa20-912d-4e86-943e-6b0866xxx" /dev/vda1: PARTUUID="d083a7cd-a7ea-4898-89d5-8e1510bed584"如上所示,Block Storage裝置/dev/vda與/dev/vdb上存在分區及檔案系統,而結果中未存在/dev/vdc相關的回執資訊,表明/dev/vdc沒有分區及檔案系統。
-
在測試Block Storage效能前,請確保已經對測試對象進行資料備份,避免資料丟失。具體操作,請參見手動建立單個快照。
說明使用快照會產生計費,更多資訊,請參見快照計費。
-
運行以下命令,安裝libaio庫和測試載入器FIO。 樣本如下,請根據不同的系統選擇指令。
Alibaba Cloud Linux 2/3版本、CentOS 6及以上版本
說明CentOS 6作業系統版本結束了生命週期(EOL),按照社區規則,CentOS 6的源地址http://mirror.centos.org/centos-6/內容已移除,您在阿里雲上繼續使用預設配置的CentOS 6的源會發生報錯。如果您需要使用CentOS 6系統中的一些安裝包,則需要手動切換源地址。具體操作,請參見CentOS 6 EOL如何切換源?。
sudo yum install libaio libaio-devel fio -yDebian 9及以上版本、Ubuntu14及以上版本
重要由於Debain9和Debain10結束生命週期(EOL),所以如果您使用的是Debain9和Debain10系統的ECS執行個體,請先切換源地址。具體操作,請參見為CentOS/Debian EOL後切換源地址(合入到對應作業系統)。
sudo apt-get update sudo apt-get install libaio* fio -y -
切換路徑。
cd /tmp -
建立test100w.sh指令碼。
sudo vim test100w.sh -
在test100w.sh中粘貼以下內容。 詳細說明,請參見test100w.sh指令碼解讀。
#!/bin/bash DEV_NODE=your_device DEV_NAME=/dev/$DEV_NODE function CheckHasFS { local device=$1 # 裝置路徑 # 檢查裝置是否存在 if [ ! -b "$device" ]; then echo "錯誤: 裝置 $device 不存在" exit 1 fi # 使用 `blkid` 命令檢查分區表和檔案系統類型 local pt_type=$(sudo blkid -o value -s PTTYPE "$device") local fs_type=$(sudo blkid -o value -s TYPE "$device") if [ -n "$pt_type" ] || [ -n "$fs_type" ]; then return 1 else return 0 fi } CheckHasFS "$DEV_NAME" if [ $? -eq 1 ]; then echo "$DEV_NAME 包含分區表或檔案系統,停止 fio 指令碼!" exit 1 fi function RunFio { numjobs=$1 # 執行個體中的測試線程數,例如樣本中的10 iodepth=$2 # 同時發出I/O數的上限,例如樣本中的64 bs=$3 # 單次I/O的塊檔案大小,例如樣本中的4k rw=$4 # 測試時的讀寫策略,例如樣本中的randwrite size=$5 filename=$6 # 指定測試檔案的名稱,例如樣本中的/dev/your_device nr_cpus=`cat /proc/cpuinfo |grep "processor" |wc -l` if [ $nr_cpus -lt $numjobs ];then echo “Numjobs is more than cpu cores, exit!” exit -1 fi let nu=$numjobs+1 cpulist="" for ((i=1;i<10;i++)) do list=`cat /sys/block/$DEV_NODE/mq/*/cpu_list | awk '{if(i<=NF) print $i;}' i="$i" | tr -d ',' | tr '\n' ','` if [ -z $list ];then break fi cpulist=${cpulist}${list} done spincpu=`echo $cpulist | cut -d ',' -f 2-${nu}` echo $spincpu fio --ioengine=libaio --runtime=30s --numjobs=${numjobs} --iodepth=${iodepth} --bs=${bs} --size=${size} --rw=${rw} --filename=${filename} --time_based=1 --direct=1 --name=test --group_reporting --cpus_allowed=$spincpu --cpus_allowed_policy=split } echo 2 > /sys/block/$DEV_NODE/queue/rq_affinity sleep 5 RunFio 10 128 4k randwrite 1024g $DEV_NAME -
根據實際情況修改test100w.sh指令碼。
-
將所有
your_device設定為實際裝置名稱,例如nvme1n1。 -
根據實際情況設定
RunFio 10 64 4k randwrite /dev/your_device中的10(numjobs)、64(iodepth)、4k(bs)、randwrite(rw)和/dev/your_device。 -
numjobs的設定值不能超過cpu cores,您可以使用以下指令查看當前的cpu核心數。
cat /proc/cpuinfo |grep "processor" |wc -l
-
-
運行以下命令,測試ESSD雲端硬碟效能。
sudo sh test100w.sh-
您可以在返回結果中查看
IOPS=***內容,表示ESSD雲端硬碟的IOPS。job1: (g=0): rw=randwrite, bs=(R) 4096B-4096B, (W) 4096B-4096B, (T) 4096B-4096B, ioengine=libaio, iodepth=128 ... fio-3.7 Starting 6 processes Jobs: 6 (f=6): [w(6)][100.0%][r=0KiB/s,w=3932MiB/s][r=0,w=1007k IOPS][eta 00m:00s] job1: (groupid=0, jobs=6): err= 0: pid=42693: Thu Jun 23 15:32:28 2022 write: IOPS=1005k, BW=3925MiB/s (4116MB/s)(38.4GiB/10015msec) slat (nsec): min=728, max=9562.2k, avg=5157.38, stdev=47881.11 clat (usec): min=82, max=25001, avg=758.61, stdev=843.67 lat (usec): min=86, max=25042, avg=763.86, stdev=844.85 clat percentiles (usec): | 1.00th=[ 190], 5.00th=[ 347], 10.00th=[ 445], 20.00th=[ 537], | 30.00th=[ 586], 40.00th=[ 635], 50.00th=[ 652], 60.00th=[ 676], | 70.00th=[ 693], 80.00th=[ 717], 90.00th=[ 824], 95.00th=[ 1254], | 99.00th=[ 4424], 99.50th=[ 6849], 99.90th=[10814], 99.95th=[15008], | 99.99th=[19530] bw ( KiB/s): min=573448, max=732136, per=16.69%, avg=670799.74, stdev=26159.23, samples=120 iops : min=143362, max=183034, avg=167699.93, stdev=6539.81, samples=120 lat (usec) : 100=0.01%, 250=2.26%, 500=11.66%, 750=71.40%, 1000=8.11% lat (msec) : 2=3.38%, 4=2.02%, 10=1.04%, 20=0.11%, 50=0.01% cpu : usr=14.45%, sys=24.23%, ctx=401609, majf=0, minf=236 IO depths : 1=0.1%, 2=0.1%, 4=0.1%, 8=0.1%, 16=0.1%, 32=0.1%, >=64=110.0% submit : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0% complete : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.1% issued rwts: total=0,10062326,0,0 short=0,0,0,0 dropped=0,0,0,0 latency : target=0, window=0, percentile=100.00%, depth=128 Run status group 0 (all jobs): WRITE: bw=3925MiB/s (4116MB/s), 3925MiB/s-3925MiB/s (4116MB/s-4116MB/s), io=38.4GiB (41.2GB), run=10015-10015msec Disk stats (read/write): nvme1n1: ios=4Z/11063917, merge=0/0, ticks=5/8026436, in_queue=9632482, util=100.00% -
如果返回結果為如下樣本所示,表示當前測試對象存在分區或檔案系統,為保證資料安全,fio指令碼停止執行,建議您使用新建立的空資料盤進行測試。
[[ecs-user@ecs tmp]$ sudo sh test100w.sh /dev/vdb 包含分區表或檔案系統,停止 fio 指令碼!
-
test100w.sh指令碼解讀
-
以下命令將塊裝置的系統參數
rq_affinity取值修改為2。echo 2 > /sys/block/your_device/queue/rq_affinityrq_affinity取值
取值說明
1
表示塊裝置收到I/O完成(I/O Completion)的事件時,這個I/O被發送回處理這個I/O下發流程的vCPU所在Group上處理。在多線程並發的情況下,I/O Completion就可能集中在某一個vCPU上執行,造成瓶頸,導致效能無法提升。
2
表示塊裝置收到I/O Completion的事件時,這個I/O會在當初下發的vCPU上執行。在多線程並發的情況下,就可以充分發揮各個vCPU的效能。
-
以下命令分別將幾個
jobs綁定到不同的CPU Core上。fio -ioengine=libaio -runtime=30s -numjobs=${numjobs} -iodepth=${iodepth} -bs=${bs} -rw=${rw} -filename=${filename} -time_based=1 -direct=1 -name=test -group_reporting -cpus_allowed=$spincpu -cpus_allowed_policy=split說明普通模式下,一個裝置(Device)只有一個請求隊列(Request-Queue),在多線程並發處理I/O的情況下,這個唯一的Request-Queue就是一個效能瓶頸點。多隊列(Multi-Queue)模式下,一個裝置(Device)可以擁有多個處理I/O的Request-Queue,充分發揮後端儲存的效能。假設您有4個I/O線程,您需要將4個I/O線程分別綁定在不同的Request-Queue對應的CPU Core上,這樣就可以充分利用Multi-Queue提升效能。
參數
說明
取值樣本
numjobsI/O線程。
10
/dev/your_deviceESSD雲端硬碟裝置名稱。
/dev/nvme1n1
cpus_allowed_policyFIO提供了參數
cpus_allowed_policy以及cpus_allowed來綁定vCPU。split
以上命令一共運行了幾個
jobs,分別綁定在幾個CPU Core上,分別對應著不同的Queue_Id。關於如何查看Queue_Id綁定的cpu_core_id,您可以運行如下命令:-
運行
ls /sys/block/your_device/mq/。其中,your_device是您的裝置名稱,例如nvme1n1。運行該命令查看裝置名稱為vd*雲端硬碟的Queue_Id。 -
運行
cat /sys/block/your_device/mq/cpu_list。其中,your_device是您的裝置名稱,例如nvme1n1。運行該命令查看對應裝置名稱為vd*雲端硬碟的Queue*綁定到的cpu_core_id。
-