对本地 SSD 的性能进行基准化分析

“选择存储选项”部分中提供的本地 SSD 性能限制是通过在本地 SSD 实例上使用特定的设置而得到的。如果您的虚拟机实例无法达到这些性能限制,并且您已经使用推荐的本地 SSD 设置配置了该实例,则可以复制 Compute Engine 团队使用的设置,然后将您的性能限制与已发布的限制进行比较。

以下说明假定您使用的是安装了 apt 软件包管理器的 Linux 操作系统。

创建一个具有 8 个 vCPU 和 1 个本地 SSD 分区的虚拟机

  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=nvme
    
  2. 在您的虚拟机上运行以下脚本。该脚本将复制用于达到“性能”部分中提供的 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 --size=100G --filesize=100G \
    --filename=/dev/disk/by-id/google-local-nvme-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-nvme-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-nvme-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
    

创建一个具有 32 个 vCPU 和 24 个本地 SSD 分区的虚拟机

  1. 如果您要将 24 个本地 SSD 分区挂接到实例,请使用具有 32 个或更多 vCPU 的机器类型。

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

    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
    
  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. 使用 lsblk 命令标识要一起装载的所有本地 SSD:

    lsblk
    

    输出类似于以下内容:

    NAME    MAJ:MIN  RM  SIZE RO TYPE MOUNTPOINT
    sda       8:0     0   10G  0 disk
    └─sda1    8:1     0   10G  0 part /
    nvme0n1 259:0     0  375G  0 disk
    nvme0n2 259:1     0  375G  0 disk
    nvme0n3 259:2     0  375G  0 disk
    nvme0n4 259:3     0  375G  0 disk
    nvme0n5 259:4     0  375G  0 disk
    nvme0n6 259:5     0  375G  0 disk
    nvme0n7 259:6     0  375G  0 disk
    nvme0n8 259:7     0  375G  0 disk
    nvme0n9 259:8     0  375G  0 disk
    nvme0n10 259:9    0  375G  0 disk
    nvme0n11 259:10   0  375G  0 disk
    nvme0n12 259:11   0  375G  0 disk
    nvme0n13 259:12   0  375G  0 disk
    nvme0n14 259:13   0  375G  0 disk
    nvme0n15 259:14   0  375G  0 disk
    nvme0n16 259:15   0  375G  0 disk
    nvme0n17 259:16   0  375G  0 disk
    nvme0n18 259:17   0  375G  0 disk
    nvme0n19 259:18   0  375G  0 disk
    nvme0n20 259:19   0  375G  0 disk
    nvme0n21 259:20   0  375G  0 disk
    nvme0n22 259:21   0  375G  0 disk
    nvme0n23 259:22   0  375G  0 disk
    nvme0n24 259:23   0  375G  0 disk
    

    SCSI 模式下的本地 SSD 具有类似于 sdb 的标准名称。NVMe 模式下的本地 SSD 具有与 nvme0n1 类似的名称。

  4. 使用 mdadm 工具将多个本地 SSD 设备合并到一个名为 /dev/md0 的阵列中。本示例合并 NVMe 模式下的 24 个本地 SSD 设备。对于 SCSI 模式下的本地 SSD 设备,请指定从 lsblk 命令获取的名称:

    sudo mdadm --create /dev/md0 --level=0 --raid-devices=24 \
    /dev/nvme0n1 /dev/nvme0n2 /dev/nvme0n3 /dev/nvme0n4 \
    /dev/nvme0n5 /dev/nvme0n6 /dev/nvme0n7 /dev/nvme0n8 \
    /dev/nvme0n9 /dev/nvme0n10 /dev/nvme0n11 /dev/nvme0n12 \
    /dev/nvme0n13 /dev/nvme0n14 /dev/nvme0n15 /dev/nvme0n16 \
    /dev/nvme0n17 /dev/nvme0n18 /dev/nvme0n19 /dev/nvme0n20 \
    /dev/nvme0n21 /dev/nvme0n22 /dev/nvme0n23 /dev/nvme0n24
    

    响应类似于以下示例:

    mdadm: Defaulting to version 1.2 metadata
    mdadm: array /dev/md0 started.
    
  5. 在您的虚拟机上运行以下脚本。该脚本将复制用于达到性能部分中提供的 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 --size=100G --filesize=100G \
    --filename=/dev/md0 --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/md0 --ioengine=libaio --randrepeat=0 \
    --iodepth=128 --direct=1 --invalidate=1 --verify=0 --verify_fatal=0 \
    --numjobs=32 --rw=randread --blocksize=4k --group_reporting --norandommap
    
    # rand write - measures max write IOPS with 4k blocks
    sudo fio --time_based --name=benchmark --size=100G --runtime=30 \
    --filename=/dev/md0 --ioengine=libaio --randrepeat=0 \
    --iodepth=128 --direct=1 --invalidate=1 --verify=0 --verify_fatal=0 \
    --numjobs=32 --rw=randwrite --blocksize=4k --group_reporting --norandommap
    

后续步骤