基準化本機 SSD 效能


選擇儲存空間選項一節中提供的本機 SSD 效能限制是使用本機 SSD 執行個體的特定設定時達成的。如果您的虛擬機器 (VM) 執行個體無法達到這些效能上限,且執行個體已採用建議的本機 SSD 設定,您可以複製 Compute Engine 小組使用的設定,藉此將您的效能上限與本文所列的上限進行比較。

這些操作說明假設您使用的是 Linux 作業系統,且已安裝 apt 套件管理工具。

建立具有一個本機 SSD 裝置的 VM

VM 可擁有的本機 SSD 數量取決於您用來建立 VM 的機器類型。詳情請參閱「選擇有效的本機 SSD 數量」。

  1. 為每個裝置建立含有四或八個 vCPU (視工作負載而定) 的本機 SSD 執行個體。

    舉例來說,下列指令會建立具有 4 個 vCPU 和 1 個本機 SSD 的 C3 VM。

    gcloud compute instances create c3-ssd-test-instance \
        --machine-type "c3-standard-4-lssd"
    

    針對第二代及更早的機器類型,您可以使用 --local-ssd 標記指定要連接至 VM 的本機 SSD 數量。下列指令會建立 N2 VM,其中含有 8 個 vCPU 和 1 個使用 NVMe 磁碟介面的本機 SSD:

    gcloud compute instances create ssd-test-instance \
        --machine-type "n2-standard-8" \
        --local-ssd interface=nvme
    
  2. 在您的 VM 上執行下列指令碼。這個指令碼所複製的設定,是用來達成在效能一節中 SSD 效能數據的設定。請注意,--bs 參數定義的是區塊大小,會影響不同類型讀寫作業的結果。

    # install tools
    sudo apt-get -y update
    sudo apt-get install -y fio util-linux
    
    # discard Local SSD sectors
    sudo blkdiscard /dev/disk/by-id/google-local-nvme-ssd-0
    
    # full write pass - measures write bandwidth with 1M blocksize
    sudo fio --name=writefile \
    --filename=/dev/disk/by-id/google-local-nvme-ssd-0 --bs=1M --nrfiles=1 \
    --direct=1 --sync=0 --randrepeat=0 --rw=write --end_fsync=1 \
    --iodepth=128 --ioengine=libaio
    
    # rand read - measures max read IOPS with 4k blocks
    sudo fio --time_based --name=readbenchmark --runtime=30 --ioengine=libaio \
    --filename=/dev/disk/by-id/google-local-nvme-ssd-0  --randrepeat=0 \
    --iodepth=128 --direct=1 --invalidate=1 --verify=0 --verify_fatal=0 \
    --numjobs=4 --rw=randread --blocksize=4k --group_reporting
    
    # rand write - measures max write IOPS with 4k blocks
    sudo fio --time_based --name=writebenchmark  --runtime=30 --ioengine=libaio \
    --filename=/dev/disk/by-id/google-local-nvme-ssd-0 --randrepeat=0 \
    --iodepth=128 --direct=1 --invalidate=1 --verify=0 --verify_fatal=0 \
    --numjobs=4 --rw=randwrite --blocksize=4k --group_reporting
    

建立具有最大本機 SSD 數量的 VM

  1. 如果您想將 24 個以上本機 SSD 裝置連接至執行個體,請使用含有 32 個以上 vCPU 的機器類型。

    下列指令會使用 NVMe 介面,建立可容納最多允許本機 SSD 磁碟數量的 VM:

    將本機 SSD 連接至 VM

    gcloud compute instances create ssd-test-instance \
        --machine-type "n1-standard-32" \
        --local-ssd interface=nvme \
        --local-ssd interface=nvme \
        --local-ssd interface=nvme \
        --local-ssd interface=nvme \
        --local-ssd interface=nvme \
        --local-ssd interface=nvme \
        --local-ssd interface=nvme \
        --local-ssd interface=nvme \
        --local-ssd interface=nvme \
        --local-ssd interface=nvme \
        --local-ssd interface=nvme \
        --local-ssd interface=nvme \
        --local-ssd interface=nvme \
        --local-ssd interface=nvme \
        --local-ssd interface=nvme \
        --local-ssd interface=nvme \
        --local-ssd interface=nvme \
        --local-ssd interface=nvme \
        --local-ssd interface=nvme \
        --local-ssd interface=nvme \
        --local-ssd interface=nvme \
        --local-ssd interface=nvme \
        --local-ssd interface=nvme \
        --local-ssd interface=nvme
    

    使用 -lssd 機器類型

    較新的機器系列提供 -lssd 機器類型,內含預先決定數量的本機 SSD 磁碟。舉例來說,如要對配備 32 個 Local SSD (12 TiB 容量) 的 VM 進行基準測試,請使用下列指令:

    gcloud compute instances create ssd-test-instance \
        --machine-type "c3-standard-176-lssd"
    
  2. 安裝 mdadm 工具。這個 mdadm 安裝程序包含會停止指令碼的使用者提示,因此請手動執行這個程序:

    Debian 和 Ubuntu

    sudo apt update && sudo apt install mdadm --no-install-recommends
    

    CentOS 和 RHEL

    sudo yum install mdadm -y
    

    SLES 和 openSUSE

    sudo zypper install -y mdadm
    
  3. 請使用 find 指令識別想要一同掛接的所有本機 SSD:

    find /dev/ | grep google-local-nvme-ssd
    

    輸出看起來類似以下內容:

    /dev/disk/by-id/google-local-nvme-ssd-23
    /dev/disk/by-id/google-local-nvme-ssd-22
    /dev/disk/by-id/google-local-nvme-ssd-21
    /dev/disk/by-id/google-local-nvme-ssd-20
    /dev/disk/by-id/google-local-nvme-ssd-19
    /dev/disk/by-id/google-local-nvme-ssd-18
    /dev/disk/by-id/google-local-nvme-ssd-17
    /dev/disk/by-id/google-local-nvme-ssd-16
    /dev/disk/by-id/google-local-nvme-ssd-15
    /dev/disk/by-id/google-local-nvme-ssd-14
    /dev/disk/by-id/google-local-nvme-ssd-13
    /dev/disk/by-id/google-local-nvme-ssd-12
    /dev/disk/by-id/google-local-nvme-ssd-11
    /dev/disk/by-id/google-local-nvme-ssd-10
    /dev/disk/by-id/google-local-nvme-ssd-9
    /dev/disk/by-id/google-local-nvme-ssd-8
    /dev/disk/by-id/google-local-nvme-ssd-7
    /dev/disk/by-id/google-local-nvme-ssd-6
    /dev/disk/by-id/google-local-nvme-ssd-5
    /dev/disk/by-id/google-local-nvme-ssd-4
    /dev/disk/by-id/google-local-nvme-ssd-3
    /dev/disk/by-id/google-local-nvme-ssd-2
    /dev/disk/by-id/google-local-nvme-ssd-1
    /dev/disk/by-id/google-local-nvme-ssd-0
    

    find 並不保證排序結果。裝置列出的順序不一定相同,只要輸出行數量與 SSD 分割區預期數量相符即可。

    如果使用 SCSI 裝置,請使用下列 find 指令:

    find /dev/ | grep google-local-ssd
    

    NVMe 裝置應全部採用 google-local-nvme-ssd-# 格式,而 SCSI 裝置應全部採用 google-local-ssd-# 格式。

  4. 請使用 mdadm 工具,將多個本機 SSD 裝置合併至名為 /dev/md0 的單一陣列。以下範例會合併使用 NVMe 介面的二十四個本機 SSD 裝置。對於使用 SCSI 的本機 SSD 裝置,請使用步驟 3 中 find 指令傳回的裝置名稱。

    sudo mdadm --create /dev/md0 --level=0 --raid-devices=24 \
    /dev/disk/by-id/google-local-nvme-ssd-0 \
    /dev/disk/by-id/google-local-nvme-ssd-1 \
    /dev/disk/by-id/google-local-nvme-ssd-2 \
    /dev/disk/by-id/google-local-nvme-ssd-3 \
    /dev/disk/by-id/google-local-nvme-ssd-4 \
    /dev/disk/by-id/google-local-nvme-ssd-5 \
    /dev/disk/by-id/google-local-nvme-ssd-6 \
    /dev/disk/by-id/google-local-nvme-ssd-7 \
    /dev/disk/by-id/google-local-nvme-ssd-8 \
    /dev/disk/by-id/google-local-nvme-ssd-9 \
    /dev/disk/by-id/google-local-nvme-ssd-10 \
    /dev/disk/by-id/google-local-nvme-ssd-11 \
    /dev/disk/by-id/google-local-nvme-ssd-12 \
    /dev/disk/by-id/google-local-nvme-ssd-13 \
    /dev/disk/by-id/google-local-nvme-ssd-14 \
    /dev/disk/by-id/google-local-nvme-ssd-15 \
    /dev/disk/by-id/google-local-nvme-ssd-16 \
    /dev/disk/by-id/google-local-nvme-ssd-17 \
    /dev/disk/by-id/google-local-nvme-ssd-18 \
    /dev/disk/by-id/google-local-nvme-ssd-19 \
    /dev/disk/by-id/google-local-nvme-ssd-20 \
    /dev/disk/by-id/google-local-nvme-ssd-21 \
    /dev/disk/by-id/google-local-nvme-ssd-22 \
    /dev/disk/by-id/google-local-nvme-ssd-23
    

    回應如下所示:

    mdadm: Defaulting to version 1.2 metadata
    mdadm: array /dev/md0 started.
    

    您可以使用 mdadm --detail 確認陣列的詳細資料。新增 --prefer=by-id 旗標會列出使用 /dev/disk/by-id 路徑的裝置。

     sudo mdadm --detail --prefer=by-id /dev/md0
    

    陣列中的每部裝置輸出內容應類似於以下內容。

     ...
     Number   Major   Minor   RaidDevice State
     0     259        0        0      active sync   /dev/disk/by-id/google-local-nvme-ssd-0
     ...
    
  5. 在您的 VM 上執行下列指令碼。這個指令碼所複製的設定,是用來達成在效能一節中 SSD 效能數據的設定。請注意,--bs 參數定義的是區塊大小,會影響不同類型讀寫作業的結果。

    # install tools
    sudo apt-get -y update
    sudo apt-get install -y fio util-linux
    
    # full write pass - measures write bandwidth with 1M blocksize
    sudo fio --name=writefile \
    --filename=/dev/md0 --bs=1M --nrfiles=1 \
    --direct=1 --sync=0 --randrepeat=0 --rw=write --end_fsync=1 \
    --iodepth=128 --ioengine=libaio
    
    # rand read - measures max read IOPS with 4k blocks
    sudo fio --time_based --name=benchmark  --runtime=30 \
    --filename=/dev/md0 --ioengine=libaio --randrepeat=0 \
    --iodepth=128 --direct=1 --invalidate=1 --verify=0 --verify_fatal=0 \
    --numjobs=48 --rw=randread --blocksize=4k --group_reporting --norandommap
    
    # rand write - measures max write IOPS with 4k blocks
    sudo fio --time_based --name=benchmark  --runtime=30 \
    --filename=/dev/md0 --ioengine=libaio --randrepeat=0 \
    --iodepth=128 --direct=1 --invalidate=1 --verify=0 --verify_fatal=0 \
    --numjobs=48 --rw=randwrite --blocksize=4k --group_reporting --norandommap
    

儲存空間最佳化 VM 基準測試

  1. 儲存空間最佳化 VM (例如 Z3 系列) 應直接與裝置分區進行基準測試。您可以使用 lsblk 取得分區名稱

    lsblk -o name,size -lpn | grep 2.9T | awk '{print $1}'
    

    輸出看起來類似以下內容:

    /dev/nvme1n1
    /dev/nvme2n1
    /dev/nvme3n1
    /dev/nvme4n1
    /dev/nvme5n1
    /dev/nvme6n1
    /dev/nvme7n1
    /dev/nvme8n1
    /dev/nvme9n1
    /dev/nvme10n1
    /dev/nvme11n1
    /dev/nvme12n1
    
  2. 使用冒號分隔符,直接針對本機 SSD 分區執行基準測試。

    # install benchmarking tools
    sudo apt-get -y update
    sudo apt-get install -y fio util-linux
    
    # Full Write Pass.
    # SOVM achieves max read performance on previously written/discarded ranges.
    sudo  fio --readwrite=write --blocksize=1m --iodepth=4 --ioengine=libaio \
    --direct=1 --group_reporting \
    --name=job1 --filename=/dev/nvme1n1 --name=job2 --filename=/dev/nvme2n1 \
    --name=job3 --filename=/dev/nvme3n1 --name=job4 --filename=/dev/nvme4n1 \
    --name=job5 --filename=/dev/nvme5n1 --name=job6 --filename=/dev/nvme6n1 \
    --name=job7 --filename=/dev/nvme7n1 --name=job8 --filename=/dev/nvme8n1 \
    --name=job9 --filename=/dev/nvme9n1 --name=job10 --filename=/dev/nvme10n1 \
    --name=job11  --filename=/dev/nvme11n1 --name=job12 --filename=/dev/nvme12n1
    
    # rand read - measures max read IOPS with 4k blocks
    sudo fio --readwrite=randread --blocksize=4k --iodepth=128  \
    --numjobs=4 --direct=1 --runtime=30 --group_reporting  --ioengine=libaio \
    --name=job1 --filename=/dev/nvme1n1 --name=job2 --filename=/dev/nvme2n1 \
    --name=job3 --filename=/dev/nvme3n1 --name=job4 --filename=/dev/nvme4n1 \
    --name=job5 --filename=/dev/nvme5n1 --name=job6 --filename=/dev/nvme6n1 \
    --name=job7 --filename=/dev/nvme7n1 --name=job8 --filename=/dev/nvme8n1 \
    --name=job9 --filename=/dev/nvme9n1 --name=job10 --filename=/dev/nvme10n1 \
    --name=job11  --filename=/dev/nvme11n1 --name=job12 --filename=/dev/nvme12n1
    
    # rand write - measures max write IOPS with 4k blocks
    sudo fio --readwrite=randwrite --blocksize=4k --iodepth=128 \
    --numjobs=4 --direct=1 --runtime=30 --group_reporting --ioengine=libaio \
    --name=job1 --filename=/dev/nvme1n1 --name=job2 --filename=/dev/nvme2n1 \
    --name=job3 --filename=/dev/nvme3n1 --name=job4 --filename=/dev/nvme4n1 \
    --name=job5 --filename=/dev/nvme5n1 --name=job6 --filename=/dev/nvme6n1 \
    --name=job7 --filename=/dev/nvme7n1 --name=job8 --filename=/dev/nvme8n1 \
    --name=job9 --filename=/dev/nvme9n1 --name=job10 --filename=/dev/nvme10n1 \
    --name=job11  --filename=/dev/nvme11n1 --name=job12 --filename=/dev/nvme12n1
    

後續步驟