本文中含有需要您注意的重要提示信息,忽略該信息可能對您的業務造成影響,請務必仔細閱讀。
阿里云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云盤。
重要測試裸盤可以獲得較為真實的塊存儲性能。但如果塊存儲設備中含有分區、文件系統以及其他數據,直接使用FIO壓測會導致文件系統異常以及數據丟失,請在測試前提前創建快照做好數據備份。具體操作,請參見創建快照。
強烈建議您不要將操作系統所在的系統盤或含有數據的數據盤作為測試對象,以避免數據丟失。建議在新創建的空數據盤上使用工具測試塊存儲性能。
性能測試結果均在測試環境下獲得,僅供參考。在真實生產環境中,受網絡環境、并發訪問量等因素影響,云盤的性能表現可能存在差異,請您以實際情況為準。
操作步驟
遠程連接ECS實例。
具體操作,請參見使用Workbench工具以SSH協議登錄Linux實例。
運行以下命令,查詢塊存儲的設備名稱。
sudo fdisk -lu
如上圖所示,表示該實例有3塊塊存儲設備,系統盤/dev/vda、數據盤/dev/vdb、/dev/vdc。
運行以下命令,查詢塊存儲設備是否存在分區和文件系統。
sudo blkid
如上圖所示,塊存儲設備/dev/vda與/dev/vdb上存在分區及文件系統,而結果中未存在/dev/vdc相關的回執信息,表明/dev/vdc沒有分區及文件系統。
在測試塊存儲性能前,請確保已經對測試對象進行數據備份,避免數據丟失。具體操作,請參見創建快照。
說明使用快照會產生計費,更多信息,請參見快照計費。
運行以下命令,安裝libaio庫和測試工具FIO。 示例如下,請根據不同的系統選擇指令。
Alibaba Cloud Linux 2/3版本、CentOS 6及以上版本
重要由于CentOS 6和CentOS 8結束生命周期(EOL),所以如果您使用的是CentOS 6或者CentOS 8系統的ECS實例,請先切換源地址。具體操作,請參見CentOS 6 EOL如何切換源?和CentOS 8 EOL如何切換源?。
sudo yum install libaio libaio-devel fio -y
Debian 9及以上版本、Ubuntu14及以上版本
重要由于Debain9和Debain10結束生命周期(EOL),所以如果您使用的是Debain9和Debain10系統的ECS實例,請先切換源地址。具體操作,請參見Debian 9/10 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
設置為ESSD云盤實際的設備名,例如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。如果返回結果為如下示例所示,表示當前測試對象存在分區或文件系統,為保證數據安全,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_affinity
rq_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提升性能。
參數
說明
取值示例
numjobs
I/O線程。
10
/dev/your_device
ESSD云盤設備名。
/dev/nvme1n1
cpus_allowed_policy
FIO提供了參數
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。