如何测试DigitalOcean卷

在本教程中,我们将介绍最佳实践,通过模拟模拟您的应用程序的工作负载来对您的DigitalOcean Block存储卷进行基准测试。

介绍

基准测试允许您评估基础架构性能,以便您可以确定特定设置是否可满足您的工作负载需求。 这是维持高服务器性能和扩展以满足日益增长的计算需求的重要组成部分。 通过基准测试,您可以监控服务器资源,优化性能,管理利用率并预测可能发生的问题。

在本教程中,我们将介绍最佳实践,通过模拟模拟您的应用程序的工作负载来对您的DigitalOcean Block存储卷进行基准测试。

Droplet和块存储容量测试设置

您需要确定您正在测试的工作负载的规格,以配置适当的Droplet和Block Storage Volume设置。 如果您正在将DigitalOcean卷对照替代产品进行基准测试,请确保选择具有类似配置的计划,以便获得更接近的比较结果。

有关设置Droplet的指导,请参阅我们的教程“ 如何创建您的第一个DigitalOceanDroplet ”。可以使用Droplet同时创建块储存卷,并且在某些情况下,您可以稍后从Droplets下的Volumes选项卡创建它控制面板 要了解有关创建和管理卷的更多信息,请阅读“ DigitalOcean块存储简介 ”。

使用符合您的性能要求的文件系统格式化卷。 最流行的默认文件系统是Ext4,比前几代Ext3和Ext2更高效。 XFS文件系统专注于性能和大型数据文件。 您可以在“ 如何在Linux中分区和格式化DigitalOcean Block存储卷 ”中阅读有关文件系统的更多信息。如果您没有特定的文件系统或配置首选项,则可以在控制面板中自动为您创建和装入数据块卷。

DigitalOcean控制面板设置卷的视图

利用您的设置,我们可以继续讨论可用于充分利用性能测试的基准测试工具和配置。

基准测试工具和配置

我们将讨论用于测试性能的性能测量工具fio ,因为它非常灵活并且受到大多数发行版的支持。 您可能想要研究和使用的备用基准测试工具包括Bonnie ++btestFilebench

要在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=120sruntime=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千兆字节。 请注意,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输出(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是我们对标准Droplet的期望,而输出大于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卷提供的读写操作数。 您需要注意每个测试完成需要多长时间。

以下是写入带宽测试的示例输出。

fio --filename=/mnt/volume-nyc3-04/test.fio --direct=1 --rw=randwrite --ioengine=libaio --bs=1024k --iodepth=32  --name=bw-test --runtime=120s
bw-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 ,以及iops=190每秒I / O操作数(IOPS)。 在这种特殊情况下,IOPS低,因为我们以200MB每秒的峰值速率( 190iops * 1M =~ 190MB/sec )执行1MB写入。

执行读取延迟测试时,您将收到如下所示的行上的指标:

lat-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微秒或微秒(或.5毫秒或毫秒)。 这表示执行单个4K I / O到块卷所需的时间。

延迟受多种因素影响,包括存储系统性能,I / O大小,队列深度以及触发的任何节流限制。

当您的基准测试完成后,您可以删除Droplet和音量。

了解性能结果

注意 :Dig​​italOcean数据块存储卷有额外的性能增强功能(如突发),可能会导致高于典型的基准。 这可以通过运行一个配置文件几秒钟来缓解。

DigitalOcean块存储卷是基于SAN的SSD存储。 因此,给定卷的性能随着块大小和队列深度而变化。 也就是说,当存储在同一时间完成所有工作时,存储性能最佳。

以下是一个显示并行性性能示例的图表。 点击图片展开它。

队列深度对IOPS图的影响

DigitalOcean的性能受限于最大IOPS和最大带宽,以先达到者为准。 在DigitalOcean上,性能不会随着音量大小而改变。 但是,由于IOPS和带宽以一定的速率上限,因此存在交叉效应。 也就是说,增加小尺寸I / O上的队列深度不会达到200MB /秒的峰值带宽,因为它将达到IOPS限制。 对于大块,5000的IOPS峰值将不会达到,因为它会达到200MB /秒的带宽限制。

根据经验,使用32K或更大的块大小将导致小于5000 IOPS,因为它将达到200MB /秒的带宽限制,而使用块大小或16K或更小将导致小于带宽限制200MB /秒,因为它会达到5000 IOPS。

作为一个实际的例子,我们来比较IOPS和带宽。

读取吞吐量图

读取IOPS图

第一张图显示了给定应用程序的块大小和队列深度的典型带宽。 我们将考虑两种不同的4K和256K块大小。

在查看4K值时,我们发现它在队列深度为4时达到5000 IOPS,但我们只看到它达到了20MB /秒的带宽。 这是因为5000 IOPS * 4K = 20MB/sec 这意味着,由于I / O限制,4K工作负载不会超过20MB /秒。

在查看256K工作负载时,我们发现它在队列深度为2时达到200MB /秒,但由于200MB/sec / 256K = 800 IOPS ,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工作负载中收到输出结果,就可以根据您的应用程序需求分析最佳设置。

结论

在本指南中,我们介绍了如何对DigitalOceanDroplet和块存储卷进行基准测试,以模拟预期的工作流程。 将基准测试作为工作流程的一部分结合起来可以确保您的应用程序保持适当的规模,并在出现问题之前对其进行预测。

要继续学习如何使用DigitalOcean Block Storage,请阅读“ 如何在DigitalOcean Block存储卷上创建加密文件系统 ”和“ 如何使用Doctl处理DigitalOcean块存储 ”。


分享按钮