本文中含有需要您注意的重要提示信息,忽略該信息可能對您的業務造成影響,請務必仔細閱讀。
阿里云ESSD PL-X云盤是一款具備超高IOPS、超高吞吐量和超低時延等多維度高性能的云盤。您可以按照本示例配置ESSD PL-X云盤性能的壓測條件,測試ESSD PL-X云盤作為裸盤時的訪問時延和IOPS。
壓測條件
測試工具:使用FIO。
說明FIO(Flexible I/O Tester)是一個開源的、強大的I/O性能測試工具,可以用來對存儲設備進行隨機讀寫、順序讀寫等負載測試。
實例規格:推薦使用ecs.g8ise.12xlarge。更多信息,請參見存儲增強通用型實例規格族g8ise。
鏡像:使用公共鏡像中高版本的Linux鏡像,本文使用Alibaba Cloud Linux 3。
說明經測試發現部分Linux發行版鏡像可能無法達到預期的性能,強烈推薦您使用阿里云官方維護的Alibaba Cloud Linux 3鏡像。
ESSD PL-X云盤:
測試裸盤可以獲得較為真實的云盤性能,建議您直接通過FIO壓測裸盤進行云盤性能測試。
為確保云盤性能測試的準確性,請預先準備好足夠的IOPS。有關ESSD PL-X云盤規格信息,請參見ESSD PL-X云盤(邀測)。
壓測時延時,建議至少準備40,000 IOPS。
壓測IOPS時,建議準備3,000 GiB以上的云盤和3,000,000 IOPS。
重要測試裸盤可以獲得較為真實的塊存儲性能。但如果塊存儲設備中含有分區、文件系統以及其他數據,直接使用FIO壓測會導致文件系統異常以及數據丟失,請在測試前提前創建快照做好數據備份。具體操作,請參見創建快照。
強烈建議您不要將操作系統所在的系統盤或含有數據的數據盤作為測試對象,以避免數據丟失。建議在新創建的空數據盤上使用工具測試塊存儲性能。
性能測試結果均在測試環境下獲得,僅供參考。在真實生產環境中,受網絡環境、并發訪問量等因素影響,云盤的性能表現可能存在差異,請您以實際情況為準。
測試ESSD PL-X云盤時延
遠程連接ECS實例。
具體操作,請參見使用Workbench工具以SSH協議登錄Linux實例。
運行以下命令,查詢塊存儲的設備名稱。
sudo fdisk -lu
如上圖所示,表示該實例有3塊塊存儲設備,系統盤/dev/vda、數據盤/dev/vdb、/dev/vdc。
運行以下命令,查詢塊存儲設備是否存在分區和文件系統。
sudo blkid
如上圖所示,塊存儲設備/dev/vda與/dev/vdb上存在分區及文件系統,而結果中未存在/dev/vdc相關的回執信息,表明/dev/vdc沒有分區及文件系統。
在測試ESSD PL-X云盤性能前,請確保已經對測試對象進行數據備份,避免數據丟失。ESSD PL-X云盤不支持快照,您可依照本地盤備份方式,將數據通過云備份定期備份、備份至OSS、備份至云盤或NAS來實現數據備份。具體操作可參考備份本地盤文件。
運行以下命令,安裝libaio庫和測試工具FIO。
sudo yum install libaio libaio-devel fio -y
調整內核啟動參數。
重要調整內核啟動參數是在grub配置文件中添加
idle=poll
參數,目的是改變Linux系統的CPU空閑循環處理方式,從而提升I/O響應速度,對I/O延時敏感的應用至關重要。調整內核啟動參數過程中的誤操作可能會讓操作系統無法正常使用,具有一定風險,請您在測試前提前創建快照做好數據備份。運行以下命令,打開
/etc/default/grub
。sudo vim /etc/default/grub
運行以下命令,找到
GRUB_CMDLINE_LINUX="XXX"
所在行,在最末尾添加idle=poll
內容。如果內核配置中已有其他的
idle=xxx
參數項,請刪除。運行以下命令,更新grub配置。
sudo grub2-mkconfig -o /boot/grub2/grub.cfg
運行以下命令,重啟實例使配置生效。
sudo reboot
運行以下命令,切換路徑。
cd /tmp
運行以下命令,新建test_plx_lat.sh腳本。
sudo vim test_plx_lat.sh
在test_plx_lat.sh腳本中添加以下內容。
#!/bin/bash DEV_NODE=$1 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 echo 2 > /sys/block/$DEV_NODE/queue/rq_affinity sleep 5 DEVICE=`ls -al /sys/block/$DEV_NODE/device | awk '{print $11}' | sed 's%../%%g'` INTERRUPT=`cat /proc/interrupts | grep $DEVICE | shuf -n 1 | awk '{print $1}' | sed 's/://g'` EFFECTIVE_SMP=`cat /proc/irq/$INTERRUPT/effective_affinity_list` fio --ioengine=libaio --runtime=30s --numjobs=1 --iodepth=1 --bs=4k --rw=randwrite --filename=$DEV_NAME --time_based=1 --direct=1 --name=test --group_reporting=1 --cpus_allowed_policy=split --cpus_allowed=$EFFECTIVE_SMP
關于腳本內容的詳細說明,請參見如下test_plx_lat.sh腳本說明。
單擊展開test_plx_lat.sh腳本說明
以下為ESSD PL-X云盤的時延性能測試腳本test_plx_lat.sh的詳細說明,請您根據實際情況進行配置。
以下命令將塊設備的系統參數
rq_affinity
取值修改為2。echo 2 > /sys/block/$DEV_NODE/queue/rq_affinity
命令中的
rq_affinity
參數取值說明如下表所示。rq_affinity取值
取值說明
0
表示塊設備收到I/O 完成(I/O Completion)的事件時,不限制I/O 被發送回的vCPU。在測試時延的情況下,可能有較大的內核切換與調度開銷,對單路時延產生影響。
1
表示塊設備收到I/O完成的事件時,這個I/O被發送回處理這個I/O下發流程的vCPU所在Group上處理。在測試時延的情況下,可能有一定的內核切換與調度開銷,對單路時延有影響。
2
表示塊設備收到I/O完成的事件時,這個I/O會在當初下發的vCPU上執行。在測試時延的情況下,能最小化內核切換與調度開銷,就可最大限度提升單路時延。
以下命令獲取塊設備的
device name
。DEVICE=`ls -al /sys/block/$DEV_NODE/device | awk '{print $11}' | sed 's%../%%g'`
以下命令獲取塊設備I/O隊列的一個中斷號。
INTERRUPT=`cat /proc/interrupts | grep $DEVICE | shuf -n 1 | awk '{print $1}' | sed 's/://g'`
以下命令獲取響應中斷的vCPU的線程號。
EFFECTIVE_SMP=`cat /proc/irq/$INTERRUPT/effective_affinity_list`
以下命令啟動FIO測試隨機寫單路時延,并將限制在已獲取的vCPU線程上下發I/O請求。
fio --ioengine=libaio --runtime=30s --numjobs=1 --iodepth=1 --bs=4k --rw=randwrite --filename=/dev/$DEV_NODE --time_based=1 --direct=1 --name=test --group_reporting=1 --cpus_allowed_policy=split --cpus_allowed=$EFFECTIVE_SMP
命令中的各參數說明如下表所示。
參數
說明
取值示例
numjobs
I/O線程數。由于這里的測試目的為單路時延,故采用1個I/O線程。
1
iodepth
I/O隊列深度。由于這里的測試目的為單路時延,故隊列深度為1。
1
filename
被壓測的文件。對ESSD PL-X云盤進行裸盤測試時,應配置為云盤的實際設備名。
/dev/vdc
cpus_allowed
指定壓測使用的vCPU線程號,與
cpus_allowed_policy=split
一起使用。測試單路時延時,建議配置為處理中斷的vCPU線程號。4
測試ESSD PL-X云盤的時延性能。
sudo sh test_plx_lat.sh your_device
請您根據實際情況,將your_device修改為ESSD PL-X云盤實際的設備名,例如vdc。
您可以在返回結果中查看
lat (usec): min=xx, max=xxxx, avg=xx.xx, stdev=x.xx
內容,表示ESSD PL-X云盤的時延。如果返回結果為如下示例所示,表示當前測試對象存在分區或文件系統,為保證數據安全,fio腳本停止執行,建議您使用新創建的空數據盤進行測試。
[[ecs-user@ecs tmp]$ sudo sh test_plx_lat.sh vdc /dev/vdc 包含分區表或文件系統,停止 fio 腳本!
壓測ESSD PL-X云盤IOPS
遠程連接ECS實例。
具體操作,請參見使用Workbench工具以SSH協議登錄Linux實例。
運行以下命令,查詢塊存儲的設備名稱。
sudo fdisk -lu
如上圖所示,表示該實例有3塊塊存儲設備,系統盤/dev/vda、數據盤/dev/vdb、/dev/vdc。
運行以下命令,查詢塊存儲設備是否存在分區和文件系統。
sudo blkid
如上圖所示,塊存儲設備/dev/vda與/dev/vdb上存在分區及文件系統,而結果中未存在/dev/vdc相關的回執信息,表明/dev/vdc沒有分區及文件系統。
在測試ESSD PL-X云盤性能前,請確保已經對測試對象進行數據備份,避免數據丟失。ESSD PL-X云盤不支持快照,您可依照本地盤備份方式,將數據通過云備份定期備份、備份至OSS、備份至云盤或NAS來實現數據備份。具體操作可參考備份本地盤文件。
運行以下命令,安裝libaio庫和測試工具FIO。
sudo yum install libaio libaio-devel fio -y
運行以下命令,切換路徑。
cd /tmp
運行以下命令,新建test_plx_iops.sh腳本。
sudo vim test_plx_iops.sh
在test_plx_iops.sh腳本中添加以下內容。
#!/bin/bash DEV_NODE=$1 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 echo 0 > /sys/block/$DEV_NODE/queue/rq_affinity sleep 5 fio --ioengine=libaio --runtime=30s --numjobs=64 --iodepth=64 --bs=4k --rw=randwrite --filename=/dev/$DEV_NODE --time_based=1 --direct=1 --name=test --group_reporting=1
關于腳本內容的詳細說明,請參見如下test_plx_iops.sh腳本說明。
單擊展開test_plx_iops.sh腳本說明
以下為ESSD PL-X云盤的IOPS性能測試腳本test_plx_iops.sh的詳細說明,請您根據實際情況進行配置。
可選:以下命令將塊設備的系統參數
rq_affinity
取值修改為0。echo 0 > /sys/block/$DEV_NODE/queue/rq_affinity
命令中的
rq_affinity
參數說明如下表所示。rq_affinity取值
取值說明
0
表示塊設備收到I/O完成的事件時,不限制I/O被發送回的vCPU。該行為能最大程度提升Guest CPU收發I/O的并行度。由于云盤控制器能力的提升,Guest內的并行度需要同時提升,以避免造成性能瓶頸。
1
表示塊設備收到I/O完成的事件時,這個I/O被發送回處理這個I/O下發流程的vCPU所在Group上處理。該行為對Guest處理I/O的并行度有一定影響。
2
表示塊設備收到I/O Completion的事件時,這個I/O會在當初下發的vCPU上執行。該行為對 Guest處理I/O的并行度影響最大。
以下命令啟動FIO測試隨機寫IOPS。
fio --ioengine=libaio --runtime=30s --numjobs=64 --iodepth=64 --bs=4k --rw=randwrite --filename=/dev/$DEV_NODE --time_based=1 --direct=1 --name=test --group_reporting=1
命令中的各參數說明如下表所示。
參數
說明
取值示例
numjobs
I/O線程數。由于這里的目的為測試 IOPS,需要盡量提升Guest內的并發度,故選擇 64。
64
iodepth
I/O隊列深度。由于這里的測試目的為測試IOPS,需要提升單隊列壓力,故隊列深度為 64。
64
filename
被壓測的文件。對ESSD PL-X云盤進行裸盤測試時,應配置為云盤的實際設備名。
/dev/vdc
運行以下命令,測試ESSD PL-X云盤的IOPS性能。
sudo sh test_plx_iops.sh your_device
請您根據實際情況,將
your_device
修改為ESSD PL-X云盤實際的設備名,例如vdc。您可以在返回結果中查看
IOPS=***
內容,表示ESSD PL-X云盤的IOPS。說明您可以根據測試出來的IOPS大小計算該云盤的吞吐量。計算公式請參見ESSD PL-X云盤(邀測)。
如果返回結果為如下示例所示,表示當前測試對象存在分區或文件系統,為保證數據安全,fio腳本停止執行,建議您使用新創建的空數據盤進行測試。
[[ecs-user@ecs tmp]$ sudo sh test_plx_iops.sh vdc /dev/vdc 包含分區表或文件系統,停止 fio 腳本!