最佳化本機 SSD 效能

最佳化本機 SSD

各個磁碟類型的效能表說明了本機 SSD 裝置可達到的效能上限。如要最佳化應用程式和 VM 執行個體以達到此速度,請使用下列最佳做法:

針對本機 SSD 使用訪客環境最佳化

根據預設,Compute Engine 提供的 Linux 映像檔大多會自動執行最佳化指令碼,設定執行個體以獲得最佳本機 SSD 效能。該指令碼會啟用特定佇列 sysfs 設定,以提高機器的整體效能,並為特定虛擬 CPU (vCPU) 套用中斷要求 (IRQ)遮罩。這個指令碼只會最佳化 Compute Engine 本機 SSD 裝置的效能。

Ubuntu、SLES 和較舊的映像檔可能不包含這類效能最佳化設定。如果您使用任何這些映像檔或比 v20141218 更舊的映像檔,您可以安裝訪客環境,改為啟用這些最佳化。

針對 NVMe 或 SCSI 介面選擇最適合的映像檔

本機 SSD 在搭配 NVMe 或 SCSI 介面類型使用時效能最佳,而適合的介面類型取決於您在執行個體的開機磁碟中使用的映像檔。 請為本機 SSD 裝置選擇最適合與您開機磁碟映像檔搭配使用的介面。 如果執行個體是使用 SCSI 介面連結至本機 SSD,您可以在訪客 OS 中啟用多佇列 SCSI,以針對 SCSI 介面達到最佳效能。

透過自訂映像檔和本機 SSD 在執行個體上啟用多佇列 SCSI

某些公開映像檔支援多佇列 SCSI。如果待匯入專案的自訂映像檔需要多佇列 SCSI 功能,您必須自行啟用。匯入的 Linux 映像檔必須包含 3.19 以上核心版本才能使用多佇列 SCSI。

如要在自訂映像檔上啟用多佇列 SCSI,請啟用 VIRTIO_SCSI_MULTIQUEUE 訪客 OS 功能並匯入映像檔,然後在 GRUB 設定中新增相關項目:

CentOS

僅適用於 CentOS7。

  1. 使用 API 匯入自訂映像檔,並加入 type 值為 VIRTIO_SCSI_MULTIQUEUEguestOsFeatures 項目。

  2. 使用自訂映像檔建立執行個體,並連接一或多個本機 SSD

  3. 透過安全殼層 (SSH) 連結至您的執行個體

  4. 查看 /sys/module/scsi_mod/parameters/use_blk_mq 檔案的值。

    $ cat /sys/module/scsi_mod/parameters/use_blk_mq
    

    如果該檔案的值為 Y,表示匯入的映像檔已啟用多佇列 SCSI。如果該檔案的值為 N,請在 GRUB 設定檔的 GRUB_CMDLINE_LINUX 項目中加入 scsi_mod.use_blk_mq=Y,然後重新啟動系統。

    1. 在文字編輯器上開啟 /etc/default/grub GRUB 設定檔。

      $ sudo vi /etc/default/grub
      
    2. scsi_mod.use_blk_mq=Y 新增至 GRUB_CMDLINE_LINUX 項目。

      GRUB_CMDLINE_LINUX=" vconsole.keymap=us console=ttyS0,38400n8 vconsole.font=latarcyrheb-sun16 scsi_mod.use_blk_mq=Y"
      
    3. 儲存設定檔。

    4. 執行 grub2-mkconfig 指令來重新產生 GRUB 檔案,然後完成設定。

      $ sudo grub2-mkconfig -o /boot/grub2/grub.cfg
      
    5. 重新啟動執行個體。

      $ sudo reboot
      

Ubuntu

  1. 使用 Compute Engine API 匯入自訂映像檔,並加入 type 值為 VIRTIO_SCSI_MULTIQUEUEguestOsFeatures 項目。

  2. 使用自訂映像檔建立執行個體,並使用 SCSI 介面連接一或多個本機 SSD

  3. 透過安全殼層 (SSH) 連結至您的執行個體

  4. 檢查 /sys/module/scsi_mod/parameters/use_blk_mq 檔案的值。

    $ cat /sys/module/scsi_mod/parameters/use_blk_mq
    

    如果該檔案的值為 Y,表示匯入的映像檔已啟用多佇列 SCSI。如果該檔案的值為 N,請在 GRUB 設定檔的 GRUB_CMDLINE_LINUX 項目中加入 scsi_mod.use_blk_mq=Y,然後重新啟動系統。

    1. 在文字編輯器上開啟 sudo nano /etc/default/grub GRUB 設定檔。

      $ sudo nano /etc/default/grub
      
    2. scsi_mod.use_blk_mq=Y 新增至 GRUB_CMDLINE_LINUX 項目。

      GRUB_CMDLINE_LINUX="scsi_mod.use_blk_mq=Y"
      
    3. 儲存設定檔。

    4. 執行 update-grub 指令來重新產生 GRUB 檔案,然後完成設定。

      $ sudo update-grub
      
    5. 重新啟動執行個體。

      $ sudo reboot
      

停用寫入快取清除功能

檔案系統、資料庫和其他應用程式會使用快取清除功能,確保資料在不同檢查點皆可長久保存。 對於大部分的儲存裝置而言,這項預設設定很合理。不過在本機 SSD 上,快取清除作業的速度相當緩慢。如要提高部分應用程式的寫入效能,您可以在這些應用程式中停用自動清除指令,或在檔案系統層級停用清除選項。

無論您為檔案系統和應用程式設定的清除指令為何,本機 SSD 一律會在兩秒內清除快取寫入資料,因此即使發生暫時性的硬體錯誤,您最多也只會遺失兩秒的快取寫入資料。永久性的硬體錯誤仍可能會導致裝置上的資料全部遺失,無論資料是否已遭清除皆然,因此您仍應將重要資料備份至永久磁碟Cloud Storage 值區

如要停用 ext4 檔案系統的寫入快取清除功能,請在掛接選項或 /etc/fstab 項目中加入 nobarrier 設定。例如:

$ sudo mount -o discard,defaults,nobarrier /dev/[LOCAL_SSD_ID] /mnt/disks/[MNT_DIR]

其中:[LOCAL_SSD_ID] 是要掛接的本機 SSD 裝置 ID,[MNT_DIR] 則代表您要掛接至哪個目錄。

基準化本機 SSD 效能

效能一節中提供的本機 SSD 效能數據是使用本機 SSD 執行個體的特定設定時達成的。如果您的執行個體無法達到這些效能上限,且執行個體已採用建議的本機 SSD 設定,您可以複製 Compute Engine 小組使用的設定,藉此將您的效能上限與本文所列的上限進行比較。

  1. 為每個裝置建立含有四或八個 vCPU (視工作負載而定) 的本機 SSD 執行個體。舉例來說,如果您想將四個本機 SSD 裝置連接至執行個體,請使用含有 16 或 32 個 vCPU 的機器類型。

    下列指令會建立含有 8 個 vCPU 的虛擬機器和一個本機 SSD:

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

    # install dependencies
    sudo apt-get update -y
    sudo apt-get install -y build-essential git libtool gettext autoconf \
    libgconf2-dev libncurses5-dev python-dev fio bison autopoint
    
    # blkdiscard
    git clone https://git.kernel.org/pub/scm/utils/util-linux/util-linux.git
    cd util-linux/
    ./autogen.sh
    ./configure --disable-libblkid
    make
    sudo mv blkdiscard /usr/bin/
    sudo blkdiscard /dev/disk/by-id/google-local-ssd-0
    
    # full write pass - measures write bandwidth with 1M blocksize
    sudo fio --name=writefile --size=100G --filesize=100G \
    --filename=/dev/disk/by-id/google-local-ssd-0 --bs=1M --nrfiles=1 \
    --direct=1 --sync=0 --randrepeat=0 --rw=write --refill_buffers --end_fsync=1 \
    --iodepth=200 --ioengine=libaio
    
    # rand read - measures max read IOPS with 4k blocks
    sudo fio --time_based --name=benchmark --size=100G --runtime=30 \
    --filename=/dev/disk/by-id/google-local-ssd-0 --ioengine=libaio --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=benchmark --size=100G --runtime=30 \
    --filename=/dev/disk/by-id/google-local-ssd-0 --ioengine=libaio --randrepeat=0 \
    --iodepth=128 --direct=1 --invalidate=1 --verify=0 --verify_fatal=0 \
    --numjobs=4 --rw=randwrite --blocksize=4k --group_reporting
    

後續步驟

本頁內容對您是否有任何幫助?請提供意見:

傳送您對下列選項的寶貴意見...

這個網頁
Compute Engine 說明文件