如何对DigitalOcean卷进行基准测试
介绍
基准测试允许您估计基础架构性能,以便您可以确定特定设置是否可以满足您的工作负载需求。 这是保持高服务器性能和扩展以满足不断增长的计算需求的重要组成部分。 通过基准测试,您可以监控服务器资源、优化性能、管理利用率并预测可能发生的问题。
在本教程中,我们将通过模拟模拟您的应用程序的工作负载,介绍对您的 DigitalOcean 块存储卷进行基准测试的最佳实践。
液滴和块存储卷测试设置
您需要确定您正在测试的工作负载的规格,以便配置适当的 Droplet 和块存储卷设置。 如果您要针对替代产品对 DigitalOcean Volumes 进行基准测试,请确保选择具有类似配置的计划,以便获得更接近的比较。
有关设置 Droplet 的指导,请参阅我们的教程“如何创建您的第一个 DigitalOcean Droplet”。 块存储卷可以与 Droplet 同时创建,在某些情况下,您可以稍后从 控制面板 中 Droplets 下的 Volumes 选项卡创建它。 要了解有关创建和管理卷的更多信息,您可以阅读“DigitalOcean 块存储简介”。
使用满足性能要求的文件系统格式化卷。 最流行的默认文件系统是 Ext4,它比前几代 Ext3 和 Ext2 性能更高。 XFS 文件系统专门用于处理性能和大型数据文件。 您可以在“How To Partition and Format DigitalOcean Block Storage Volumes in Linux”中阅读有关文件系统的更多信息。 如果您没有特定的文件系统或配置首选项,则为您创建和安装块卷的过程会在控制面板中自动进行。
设置到位后,我们可以继续讨论可用于充分利用性能测试的基准测试工具和配置。
基准测试工具和配置
我们将讨论用于测试性能的性能测量工具 fio,因为它非常灵活并且受到大多数发行版的支持。 您可能想要研究和使用的其他基准测试工具包括 Bonnie++、btest 和 Filebench。
要在 Ubuntu 服务器上安装 fio,您应该首先更新您的软件包列表,然后使用以下命令进行安装:
sudo apt update sudo apt install fio
每个基准测试工具都带有各种参数,您可以调整这些参数以获得测试的最佳性能。
一个值得调优的参数是队列深度,它是卷表现出最佳性能的并行度。 通常,1
的队列深度表示工作负载在前一个事务完成之前无法启动另一个事务。 如果要模拟高度并行化的应用程序,请仅在测试中使用低队列深度数。 否则,请继续提高队列深度,直到获得应用程序所需的性能。
使用基准测试工具 fio,一些典型的配置选项包括:
选项 | 建议 |
---|---|
iodepth
|
fio 将向文件发出的队列深度。 为了达到最佳输入/输出 (I/O) 速率,建议使用大于 iodepth=64 的数字。
|
bs
|
供 I/O 使用的块大小(以字节为单位)。 文件系统使用 4K 存储元数据,但倾向于以更大的块大小存储文件。 数据库通常发出 8-16K 大小的 I/O。 对于峰值带宽测试,我们建议使用 bs=64k 或更大的块大小。
|
runtime
|
运行基准测试的时间(以秒为单位)。 我们建议运行时间大于 60 秒,通常在 runtime=120s 到 runtime=300s 的范围内。
|
ioengine
|
ioengine 选项定义作业如何向文件发出 I/O。 我们推荐 ioengine=libaio ,它指的是 Linux 原生异步 I/O。
|
direct
|
采用布尔值:0 使用文件系统缓存返回一个最接近应用程序行为的值,这可能导致高于典型的基准测试结果; 和 1 跳过任何文件系统缓存行为,返回最接近块卷可以执行的性能。 我们推荐 direct=1 。
|
sync
|
使用同步 I/O 进行缓冲写入。 此选项采用布尔值:0 表示不强制单元访问,允许写回缓存行为像在 fio 行为更像文件系统的普通磁盘驱动器上那样运行; 1 强制单元访问,这意味着 I/O 在磁盘保证物理放置之前不会完成。 我们推荐 sync=0 。
|
size
|
测试文件的大小,取整数。 我们通常建议至少 20 GB。 请注意,DigitalOcean 的性能不会随卷大小而变化。 |
考虑到这些配置,我们现在可以查看您可能想要运行的一些示例基准测试。
运行基准测试
以下是您可以运行的一些示例基准测试。 在本教程的下一部分中,我们将讨论如何更深入地检查您收到的输出。
在以下命令中,我们指向基于 NYC3 数据中心的卷上的 fio.test
文件,请务必将其更新为指向您要使用的特定文件系统。
写带宽
此测试对块卷执行 1MB 的随机写入。
fio --filename=/mnt/volume-nyc3-04/fio.test \ --direct=1 \ --rw=randwrite \ --ioengine=libaio \ --bs=1024K \ --iodepth=32 \ --name=bw-test \ --runtime=120s \
对于标准 Droplet,我们期望输出 200MB/sec
。 如果您正在使用高 CPU 液滴,您应该期待 300MB/sec
的输出。
随机读取测试
这将衡量从设备读取多个小文件的速度。
fio --filename=/mnt/volume-nyc3-04/fio.test \ --direct=1 \ --rw=randread \ --ioengine=libaio \ --bs=4K \ --iodepth=128 \ --name=rand-r \ --runtime=120s \
对于标准 Droplet,我们期望每秒输出 5000
I/O 操作 (IOPS)。 对于高 CPU 液滴,我们期望输出大于 6000
IOPS。
随机写测试
这将衡量写入多个小文件的速度。
fio --filename=/mnt/volume-nyc3-04/fio.test \ --direct=1 \ --rw=randwrite \ --ioengine=libaio \ --bs=4K \ --iodepth=128 \ --name=rand-w \ --runtime=120s \
5000
IOPS 的输出是我们对标准液滴的期望,而大于 6000
IOPS 的输出是我们对高 CPU 液滴的期望。
读取延迟测试
我们将通过读取延迟测试确定在磁盘上查找和访问正确数据块所需的时间。
fio --filename=/mnt/volume-nyc3-04/fio.test \ --direct=1 \ --rw=randread \ --ioengine=libaio \ --bs=4K \ --iodepth=1 \ --name=lat-read \ --runtime=120s \
对于此测试,我们期望返回小于 5ms
的输出。
写延迟测试
此测试测量从创建磁盘写入请求到完成的延迟。
fio --filename=/mnt/volume-nyc3-04/fio.test \ --direct=1 \ --rw=randwrite \ --ioengine=libaio \ --bs=4K \ --iodepth=1 \ --name=lat-write \ --runtime=120s \
在这里,我们还期望此测试的输出小于 5ms
。
检查输出
运行测试后,您将检查结果输出,以检查 DigitalOcean Volumes 服务了多少读取和写入操作。 您需要注意完成每个测试需要多长时间。
以下是写入带宽测试的示例输出。
fio --filename=/mnt/volume-nyc3-04/test.fio --direct=1 --rw=randwrite --ioengine=libaio --bs=1024k --iodepth=32 --name=bw-test --runtime=120s
Outputbw-test: (groupid=0, jobs=1): err= 0: pid=2584: Fri Apr 20 17:14:19 2018 write: io=22937MB, bw=195468KB/s, iops=190, runt=120160msec slat (usec): min=54, max=622, avg=135.46, stdev=23.21 clat (msec): min=7, max=779, avg=167.48, stdev=26.28 lat (msec): min=7, max=779, avg=167.62, stdev=26.28 clat percentiles (msec): | 1.00th=[ 101], 5.00th=[ 155], 10.00th=[ 159], 20.00th=[ 163], | 30.00th=[ 165], 40.00th=[ 167], 50.00th=[ 167], 60.00th=[ 167], | 70.00th=[ 169], 80.00th=[ 169], 90.00th=[ 172], 95.00th=[ 178], | 99.00th=[ 306], 99.50th=[ 363], 99.90th=[ 420], 99.95th=[ 474], | 99.99th=[ 545] bw (KB /s): min=137730, max=254485, per=100.00%, avg=195681.88, stdev=9590.24 lat (msec) : 10=0.01%, 20=0.03%, 50=0.37%, 100=0.58%, 250=97.55% lat (msec) : 500=1.44%, 750=0.03%, 1000=0.01% cpu : usr=1.76%, sys=1.83%, ctx=22777, majf=0, minf=11 IO depths : 1=0.1%, 2=0.1%, 4=0.1%, 8=0.1%, 16=0.1%, 32=99.9%, >=64=0.0% submit : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0% complete : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.1%, 64=0.0%, >=64=0.0% issued : total=r=0/w=22937/d=0, short=r=0/w=0/d=0, drop=r=0/w=0/d=0 latency : target=0, window=0, percentile=100.00%, depth=32 Run status group 0 (all jobs): WRITE: io=22937MB, aggrb=195468KB/s, minb=195468KB/s, maxb=195468KB/s, mint=120160msec, maxt=120160msec
上面输出中突出显示的行显示我们的平均带宽为 bw=195468KB/s
,以及我们的每秒 I/O 操作 (IOPS) 为 iops=190
。 在这个特定场景中,IOPS 很低,因为我们以每秒 200MB 的峰值速率执行 1MB 写入(190iops * 1M =~ 190MB/sec
)。
执行读取延迟测试时,您将收到如下行的指标:
Outputlat-read: (groupid=0, jobs=1): err= 0: pid=2628: Fri Apr 20 17:32:51 2018 read : io=855740KB, bw=7131.2KB/s, iops=1782, runt=120001msec slat (usec): min=8, max=434, avg=16.77, stdev= 5.92 clat (usec): min=2, max=450994, avg=539.15, stdev=2188.85 lat (usec): min=53, max=451010, avg=556.61, stdev=2188.91
在上面的示例中,我们可以看到 I/O 延迟为 556 微秒或微秒(或 0.5 毫秒或毫秒)。 这表示对块卷执行单个 4K I/O 所需的时间。
延迟受多种因素的影响,包括存储系统的性能、I/O 的大小、队列深度以及触发的任何节流限制。
基准测试完成后,您可以删除 Droplet 和音量。
了解性能结果
注意:DigitalOcean 块存储卷具有额外的性能增强功能(如突发),可能导致高于典型基准。 运行配置文件的时间长于几秒钟可以减轻这种影响。
DigitalOcean 块存储卷是基于 SAN 的 SSD 存储。 因此,给定卷的性能随块大小和队列深度而变化。 也就是说,当同时有大量工作要做时,存储性能最好。
下图显示了并行性能的示例。 单击图像以将其展开。
DigitalOcean 性能受到最大 IOPS 和最大带宽的限制,以先达到者为准。 在 DigitalOcean 上,性能不会随卷大小而变化。 但是,由于 IOPS 和带宽以特定速率设置上限,因此存在交叉效应。 也就是说,增加小型 I/O 上的队列深度不会达到 200MB/秒的峰值带宽,因为它会达到 IOPS 限制。 对于大块,不会达到 5000 的峰值 IOPS,因为它将达到 200MB/秒的带宽限制。
根据经验,使用 32K 或更大的块大小将导致小于 5000 IOPS,因为它将达到 200MB/秒的带宽限制,而使用 16K 或更小的块大小将导致小于带宽限制200MB/秒,因为它将达到 5000 IOPS。
作为一个实际的例子,让我们比较一下 IOPS 和带宽。
第一张图显示了给定应用程序块大小和队列深度的典型带宽。 我们将考虑 4K 和 256K 这两种不同的块大小。
查看 4K 值时,我们看到它在队列深度为 4 时达到了 5000 IOPS,但我们只看到它达到了 20MB/秒的带宽。 那是因为 5000 IOPS * 4K = 20MB/sec
。 这意味着 4K 工作负载永远不会超过 20MB/秒,因为它有 I/O 上限。
在查看 256K 工作负载时,我们看到它在队列深度为 2 时达到 200MB/秒,但它永远不会看到 IOPS 速率高于 800 IOPS,因为 200MB/sec / 256K = 800 IOPS
。
DigitalOcean 块存储卷针对 16K-64K 的典型文件系统工作负载进行了调整。 在这些块大小下,我们看到了 IOPS 和带宽之间的良好折衷。
块大小 | IOPS | 带宽 |
---|---|---|
4K | ~5000 IOPS | ~20MB/秒 |
16K | ~5000 IOPS | ~80MB/秒 |
32K | ~5000 IOPS | ~160MB/秒 |
64K | ~3200 IOPS | ~200MB/秒 |
256K | ~800 IOPS | ~200MB/秒 |
一旦您收到对模拟 I/O 工作负载进行基准测试的输出,您将能够根据您的应用程序的需求分析最佳设置。
结论
在本指南中,我们介绍了如何对 DigitalOcean Droplets 和 Block Storage Volumes 进行基准测试,以模拟预期的工作流程。 将基准测试作为工作流程的一部分可以确保您为应用程序保持适当的规模并在问题出现之前进行预测。
要继续了解有关如何使用 DigitalOcean 块存储的更多信息,您可以阅读“如何在 DigitalOcean 块存储卷 上创建加密文件系统”和“如何使用 DigitalOcean 块存储使用Doctl。”