优化本地 SSD 性能

优化本地 SSD

各种磁盘类型的性能图表中描述了本地 SSD 设备可实现的性能上限。如需优化应用和虚拟机实例以达到这些速度,请使用以下最佳做法:

对本地 SSD 使用访客环境优化功能

默认情况下,大多数由 Compute Engine 提供的 Linux 映像将自动运行一个优化脚本,该脚本会对实例进行配置以实现本地 SSD 的最大性能。该脚本会启用某些队列 sysfs 设置(用于增强机器的整体性能),并屏蔽对某些特定虚拟 CPU (vCPU) 的中断请求 (IRQ)。此脚本只针对 Compute Engine 本地 SSD 设备进行性能优化。

Ubuntu、SLES 和其他较旧的映像可能未配置为包含此性能优化功能。如果您使用的是这些映像中的任何一个或 v20141218 之前的映像,则可以安装访客环境来启用这些优化功能。

为 NVMe 或 SCSI 接口选择最佳映像

本地 SSD 在采用 NVMe 或 SCSI 接口时运行得最好,具体取决于您使用的操作系统。为您的本地 SSD 设备选择一个最适合您的启动磁盘映像的接口。如果您的实例使用 SCSI 接口连接到本地 SSD,则可以在访客操作系统上启用多队列 SCSI,以通过 SCSI 接口实现最佳性能。

在具有自定义映像和本地 SSD 的实例上启用多队列 SCSI

某些公共映像支持多队列 SCSI。如果您要求导入到项目中的自定义映像具备多队列 SCSI 功能,则必须自行启用该功能。只有包含内核版本 3.19 或更高版本的导入的 Linux 映像才能使用多队列 SCSI。

如需在某个自定义映像上启用多队列 SCSI,请在启用了 VIRTIO_SCSI_MULTIQUEUE 访客操作系统功能的情况下导入该映像,并向 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. 创建一个本地 SSD 实例,该实例针对每个设备具有四个或八个 vCPU,具体取决于您的工作负载。例如,如果您要将四个本地 SSD 设备附加到一个实例,请使用具有 16 或 32 个 vCPU 的机器类型。

    以下命令将创建一个具有 8 个 vCPU 和一个本地 SSD 的虚拟机:

    gcloud compute instances create ssd-test-instance \
    --machine-type "n1-standard-8" \
    --local-ssd interface="SCSI"
    
  2. 在您的虚拟机上运行以下脚本。该脚本将复制用于达到“性能”部分中提供的 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 文档