“选择存储选项”部分中提供的本地 SSD 性能限制是通过在本地 SSD 实例上使用特定的设置而得到的。如果您的虚拟机实例无法达到这些性能限制,并且您已经使用推荐的本地 SSD 设置配置了该实例,则可以复制 Compute Engine 团队使用的设置,然后将您的性能限制与已发布的限制进行比较。
以下说明假定您使用的是安装了 apt
软件包管理器的 Linux 操作系统。
创建具有一个本地 SSD 设备的虚拟机
虚拟机可以拥有的本地 SSD 数量取决于您用于创建虚拟机的机器类型。如需了解详情,请参阅选择有效的本地 SSD 数量。
创建一个本地 SSD 实例,该实例的每个设备配备四个或八个 vCPU,vCPU 的具体数量取决于您的工作负载。
例如,以下命令会创建一个具有 4 个 vCPU 和 1 个本地 SSD 的 C3 虚拟机。
gcloud compute instances create c3-ssd-test-instance \ --machine-type "c3-standard-4-lssd"
对于第二代及更早的机器类型,您可以使用
--local-ssd
标志指定要挂接到虚拟机的本地 SSD 数量。以下命令会创建一个具有 8 个 vCPU 和 1 个使用 NVMe 磁盘接口的本地 SSD 的 N2 虚拟机:gcloud compute instances create ssd-test-instance \ --machine-type "n2-standard-8" \ --local-ssd interface=nvme
在您的虚拟机上运行以下脚本。该脚本将复制用于达到“性能”部分中提供的 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 数量的虚拟机
如果您要将 24 个或更多本地 SSD 设备挂接到实例,请使用具有 32 个或更多 vCPU 的机器类型。
以下命令使用 NVMe 接口创建具有允许的最大本地 SSD 磁盘数量的虚拟机:
将本地 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
使用 -lssd 机器类型
较新的机器系列提供
-lssd
机器类型,这些机器类型带有预定数量的本地 SSD 磁盘。例如,如需对具有 32 个本地 SSD(12 TiB 容量)的虚拟机进行基准测试,请使用以下命令:gcloud compute instances create ssd-test-instance \ --machine-type "c3-standard-176-lssd"
安装
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
使用
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-#
格式。使用
mdadm
工具将多个本地 SSD 设备合并到一个名为/dev/md0
的阵列中。以下示例合并 24 个使用 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 ...
在您的虚拟机上运行以下脚本。该脚本将复制用于达到性能部分中提供的 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=32 --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=32 --rw=randwrite --blocksize=4k --group_reporting --norandommap
对存储优化型虚拟机进行基准测试
应直接针对设备分区来对存储优化型虚拟机(如 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
直接对本地 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
后续步骤
- 了解本地 SSD 的价格。