全部產品
Search
文件中心

Elastic Compute Service:測試ESSD雲端硬碟IOPS效能

更新時間:Dec 06, 2024

阿里雲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壓測會導致檔案系統異常以及資料丟失,請在測試前提前建立快照做好資料備份。具體操作,請參見建立快照

    • 強烈建議您不要將作業系統所在的系統硬碟或含有資料的資料盤作為測試對象,以避免資料丟失。建議在新建立的空資料盤上使用工具測試Block Storage效能。

    • 效能測試結果均在測試環境下獲得,僅供參考。在真實生產環境中,受網路環境、並發訪問量等因素影響,雲端硬碟的效能表現可能存在差異,請您以實際情況為準。

操作步驟

  1. 遠端連線ECS執行個體。

    具體操作,請參見使用Workbench工具以SSH協議登入Linux執行個體

  2. 運行以下命令,查詢Block Storage的裝置名稱。

    sudo fdisk -lu

    截屏2024-12-05 09如上圖所示,表示該執行個體有3塊Block Storage裝置,系統硬碟/dev/vda、資料盤/dev/vdb/dev/vdc

  3. 運行以下命令,查詢Block Storage裝置是否存在分區和檔案系統。

    sudo blkid

    截屏2024-12-05 09如上圖所示,Block Storage裝置/dev/vda/dev/vdb上存在分區及檔案系統,而結果中未存在/dev/vdc相關的回執資訊,表明/dev/vdc沒有分區及檔案系統。

  4. 在測試Block Storage效能前,請確保已經對測試對象進行資料備份,避免資料丟失。具體操作,請參見建立快照

    說明

    使用快照會產生計費,更多資訊,請參見快照計費

  5. 運行以下命令,安裝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
  6. 運行以下命令,切換路徑。

    cd /tmp
  7. 運行以下命令,建立test100w.sh指令碼。

    sudo vim test100w.sh
  8. 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
  9. 因測試環境而異,根據實際情況修改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
  10. 運行以下命令,測試ESSD雲端硬碟效能。

    sudo sh test100w.sh
    • 您可以在返回結果中查看IOPS=***內容,表示ESSD雲端硬碟的IOPS。image

    • 如果返回結果為如下樣本所示,表示當前測試對象存在分區或檔案系統,為保證資料安全,fio指令碼停止執行,建議您使用新建立的空資料盤進行測試。

      [[ecs-user@ecs tmp]$ sudo sh test100w.sh
      /dev/vdb 包含分區表或檔案系統,停止 fio 指令碼!
      警告

      如果測試對象含有分區、檔案系統以及其他資料,直接使用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。