TLDR; Azure、GCP 和 AWS 上的 MongoDB Atlas M20-M40 的性能非常相似,不同集群/存储大小的性能水平(持续时间更短)和稳定性(异常值、可变性)略有不同:

  • M20:AWS > Azure > GCP(有时 Azure 和 AWS 的可变性更高)

  • M30:AWS > Azure > GCP(GCP 的可变性更高)

  • M40:AWS > Azure ~> GCP(GCP 和 AWS 的可变性更高)。

简介

这篇文章的目的是比较 MongoDB M20-M40 在 Azure、GCP 和 AWS 上运行的真实性能。如果您想获得多天/一周练习1的浓缩结果,请进一步阅读。

负载测试的触发因素是 surAzure上的各种与磁盘相关的性能问题,并反复声明 MongoDB 在 AWS 和 GCP 上运行得更好。

重要笔记:

  1. 这篇文章只讨论小型专用实例 - 仅具有 128 和 256 GB 存储的 M20-M40(不需要/体验更大的实例)

  2. 读者应该只关注结果的相对方面,即不同的云如何相互比较,或者不同的实例/存储大小提高了性能。以毫秒等为单位的绝对请求持续时间将被忽略,因为它们仅对测试中的特定自定义代码有效。

  3. 这不是一个“科学”或正确完成的基准测试(我是一个业余性能/负载测试员)。如果您发现该方法是错误的或/并且可以改进 - 请在评论中让我知道我可以做得更好(赞赏)。

  4. 被测软件的架构细节超出了本文的范围(我可能会也可能不会写另一篇文章)。负载测试自动化工具也是如此,它基本上是使用 Azure DevOps Pipelines 和大量 bash 脚本实现的。

  5. 尽管执行了许多每秒请求不同的负载测试,但本文仅使用测试子集的结果 - 每秒 50 个请求,因为这些足以说明 MongoDB Atlas 的性能差异在 Azure/GCP/AWS 上。

设置

被测软件是一组 5 个微服务,负责 同步2处理业务操作/事务3。服务之间的整体交互如下所示(匿名):

[图像描述](https://res.cloudinary.com/practicaldev/image/fetch/s--V7APDR3M--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to- uploads.s3.amazonaws.com/uploads/articles/ftyvfnj12j89pct1ofel.png)

请注意,所有数据库操作都是文档大小小于 1 KB 的单文档操作,分为 3 类:

1)通过UUID id(主键)查找单个文档

  1. 插入单个文档

3)替换单个文档

负载测试基础架构涉及以下工具:

  1. Azure DevOps Pipelines - 用于按顺序运行 bash 脚本,负责设置、运行负载测试和拆除负载测试环境(Azure 和 GCP)

  2. NBomber - 负载测试客户端,在这种情况下使用InjectPerSec(rate u003d 50, during u003d seconds 600) 每秒生成 50 个请求 负载模拟

3.“客户端”Kubernetes 集群(AKS、GKE 或 EKS),只有 1 个节点(4 个 vCPU,8Gb RAM),用于托管 Azure DevOps 自托管池,其中 1 个代理运行 NBomber

4.“服务器”Kubernetes 集群(AKS、GKE 或 EKS)具有 2 个节点(2 个 vCPU,16 GB RAM)用于运行微服务(3/5 微服务配置有 2 个副本,2/5 配置有 1 个副本)。 Traefik 也在“服务器”集群中运行,充当(HTTPs)API 网关。

  1. 两个 K8s 集群在同一个区域,Vnet/VPC 网络,不同的子网,但是客户端集群使用带有服务器的公共 DNS 主机名的 HTTPs 进行调用(因此对云提供商的网络基础设施进行一定的遍历需要地方,但是我们在这里谈论的是个位数的毫秒)。

[图像描述](https://res.cloudinary.com/practicaldev/image/fetch/s--hvbwLY4I--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to- uploads.s3.amazonaws.com/uploads/articles/vx7nhxz82cf4dxgchbkb.png)

[图像描述](https://res.cloudinary.com/practicaldev/image/fetch/s--RJ71F1m2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to- uploads.s3.amazonaws.com/uploads/articles/1me361qsc4oi3baxzkbf.png)

[图像描述](https://res.cloudinary.com/practicaldev/image/fetch/s--_acNFV9N--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to- uploads.s3.amazonaws.com/uploads/articles/rpmmzin0sv1s9vc9dsbu.png)

下表总结了使用的 MongoDB 实例:

TABLE MongoDB 实例,包括 IOPS 和 $$$

实例类型

存储大小 (GB)

vCPU

内存

IOPS

元/小时

$$$/月

天蓝色

M20

128

24

4

500

0.34

245

GCP

M20

128

1

3.75

76805

0.33

238

AWS

M20

128

24

4

2000

0.30

238

天蓝色

M20

256

24

4

1100

0.45

324

GCP

M20

256

1

3.75

150005

0.45

324

AWS

M20

256

24

4

2000

0.38

274

天蓝色

与 0

128

2

8

500

0.80

576

GCP

与 0

128

2

7.5

76805

0.60

432

AWS

与 0

128

2

8

30006

0.67

482

天蓝色

与 0

256

2

8

1100

0.91

655

GCP

与 0

256

2

7.5

150005

0.72

518

AWS

与 0

256

2

8

30006

0.75

540

天蓝色

M40

128

4

16

500

1.46

1051

GCP

M40

128

4

15

76805

1.06

763

AWS

M40

128

4

16

30006

1.23

886

值得注意:

  1. Azure M20 有 2 个 CPU,而 GCP M20 有 1 个 vCPU,但是在 Azure 的情况下,vCPU 是可突发的,而在 GCP 中,单个 vCPU 可以一直使用到 100%。

  2. IOPS(纸面上)存在巨大差异,GCP 在相同存储大小的情况下提供比 Azure 多 14-30 倍的 IOPS!

  3. 随着更大的实例大小,Azure 变得更加昂贵。

以下部分将从不同的角度展示负载测试结果。

Azure vs GCP vs AWS Performance M20 with 128Gb disk

50 rps,5 分钟持续时间,3 次执行

[图像描述](https://res.cloudinary.com/practicaldev/image/fetch/s--EcKEyBKD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to- uploads.s3.amazonaws.com/uploads/articles/73drdg3onwcbtnj08dpb.png)

解释:

  1. Azure M20 明显比 GCP M20 快,平均持续时间与 AWS M20 处于同一水平。

  2. AWS M20 有非常高的 99% 和最大持续时间(u003d> 很多可变性)

50 rps,1 小时持续时间,3 次执行

[图像描述](https://res.cloudinary.com/practicaldev/image/fetch/s--whWCFFJW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to- uploads.s3.amazonaws.com/uploads/articles/al4qoirn50zk0xyymwwk.png)

解释:

  1. AWS 比 Azure M20 快,在平均持续时间方面比 GCP 快,

  2. AWS 也有更好的 99%

  3. Azure 的最长持续时间比 GCP 和 AWS 差。

Azure vs GCP vs AWS Performance M20 with 256Gb disk

50 rps,5 分钟持续时间,3 次执行

[图像描述](https://res.cloudinary.com/practicaldev/image/fetch/s--ru0_uGa7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to- uploads.s3.amazonaws.com/uploads/articles/7fsvcj7fj9jm3t71pmyg.png)

解释:

1、Azure和AWS大致处于同一水平,比GCP快

  1. AWS 在 3 次执行中的 2 次中显示最大持续时间异常值

1 小时持续时间,3 次处决

[图像描述](https://res.cloudinary.com/practicaldev/image/fetch/s--osApoHZM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to- uploads.s3.amazonaws.com/uploads/articles/kgu8pyj2ci6ud5zo9lfh.png)

解释:

  1. AWS M20 比 Azure 更快,在平均持续时间和第 99 个百分位方面比 GCP 更快

2.所有3个都有一个相对较高的最大请求持续时间

Azure vs GCP vs AWS Performance M30 with 128Gb disk

50 rps,5 分钟持续时间,3 次执行

[图像描述](https://res.cloudinary.com/practicaldev/image/fetch/s--4n2Kk-jQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev- to-uploads.s3.amazonaws.com/uploads/articles/0nptdd8da532qr1o0y6q.png)

解释:

  1. AWS M30明显快于Azure M30,后者比GCP M30快

  2. 与 M20(尤其是 AWS)相比,所有 3 个最大持续时间都更加一致(可变性更小)

50 rps,1 小时持续时间,3 次执行

[图像描述](https://res.cloudinary.com/practicaldev/image/fetch/s--UU99t3XW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to- uploads.s3.amazonaws.com/uploads/articles/t6lc6xsu8dyd95upvk5u.png)

解释:

  1. AWS 比 Azure 和 GCP 更快

  2. Azure M30在平均时长上与GCP处于同一水平,第99个百分位几乎相等,但GCP的最大时长最高(也可能只是个别异常值)。

Azure 与 GCP 性能 M30 与 256Gb 磁盘

50 rps,1 小时持续时间,3 次执行

[图像描述](https://res.cloudinary.com/practicaldev/image/fetch/s--dyF7pGhE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to- uploads.s3.amazonaws.com/uploads/articles/fgjmw4zgrdpuclher9yq.png)

解释:

  1. 在 1 小时的测试执行中,Azure M30 在平均持续时间方面与 GCP 处于同一水平,99% 几乎相等,Azure 的最大持续时间优于 GCP。

Azure vs GCP vs AWS Performance M40 with 128Gb disk

50 rps,5 分钟持续时间,3 次执行

[图像描述](https://res.cloudinary.com/practicaldev/image/fetch/s--ifef3jCX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to- uploads.s3.amazonaws.com/uploads/articles/7mnel5i05xnf44m4s5pu.png)

解释:

  1. AWS M40 比 Azure M40 和 GCP M40 稍快(但 Azure M40 贵很多,见上表)

50 rps,1 小时持续时间,3 次执行

[图像描述](https://res.cloudinary.com/practicaldev/image/fetch/s--c7SOz06l--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to- uploads.s3.amazonaws.com/uploads/articles/edayz73w8ya5d5e0liju.png)

解释:

  1. AWS M40 比 Azure M40 和 GCP M40 稍快

  2. GCP 和 AWS 具有更高的可变性(第 3 次 AWS 测试执行甚至导致 180k 请求中的 5 次超时..)

Azure 性能不同的实例/存储大小

50 rps,5 分钟持续时间

[图像描述](https://res.cloudinary.com/practicaldev/image/fetch/s--a51DN0f---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to -uploads.s3.amazonaws.com/uploads/articles/lohibqlxs6z34sj3g8x6.png)

解释:

  1. 平均持续时间并没有随着实例/存储大小的增加而显着提高(甚至从 M20 -> M30?? 增加)

  2. M20/128 的 99% 和最大持续时间更高,M20/128、M30 和 M40 更稳定

50 rps,1 小时持续时间

[图像描述](https://res.cloudinary.com/practicaldev/image/fetch/s--7li6NfkB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to- uploads.s3.amazonaws.com/uploads/articles/7cgauewky7aiud19bt02.png)

解释:

  1. 平均持续时间没有随着实例/存储大小的增加而显着提高

  2. 随着实例/存储大小的增加,99% 和最大持续时间显着提高(可变性降低,异常值减少)

GCP 性能不同的实例/存储大小

50 rps,5 分钟持续时间

[图像描述](https://res.cloudinary.com/practicaldev/image/fetch/s--VU0TkK9d--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to- uploads.s3.amazonaws.com/uploads/articles/l1reo1yr0nluut6lomas.png)

解释:

  1. 实例/存储大小的平均值略有提高。 2. 同样适用于 99% 和最大持续时间,非常稳定

50 rps, 1 小时持续时间

[图像描述](https://res.cloudinary.com/practicaldev/image/fetch/s--Ts5PWsCM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to- uploads.s3.amazonaws.com/uploads/articles/fgo1ntc11z54u02wkxw5.png)

解释:

  1. 实例/存储大小的平均值略有提高。 2. not 对 99 个百分位和最大持续时间有效...在 M40/128 的情况下会出现奇怪的峰值...

AWS 性能不同的实例/存储大小

50 rps,5 分钟持续时间

[图像描述](https://res.cloudinary.com/practicaldev/image/fetch/s--ImeHuvj9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to- uploads.s3.amazonaws.com/uploads/articles/zfn53yg9oy26kpbxh5xi.png)

解释:

  1. M30 的平均值更好,但在此负载下与 M40 几乎没有差异

  2. M20 高 99% 和最大持续时间,M30 和 M40 稳定

50 rps, 1 小时持续时间

[图像描述](https://res.cloudinary.com/practicaldev/image/fetch/s--SUkW2H71--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to- uploads.s3.amazonaws.com/uploads/articles/r4o9wrpzqgznm2vyqpot.png)

解释:

  1. M30 的平均值更好,但在此负载下与 M40 几乎没有差异

  2. M20 高达 99% 和最大持续时间,M30 和 M40 稳定(1 次执行只有最大持续时间异常值)

MongoDB 指标比较

最大磁盘写入延迟

M20、128Gb、天蓝色:

[图像描述](https://res.cloudinary.com/practicaldev/image/fetch/s--grnl-hGg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev- to-uploads.s3.amazonaws.com/uploads/articles/3mricq8l87xcy80yi0cq.png)

M20、128Gb、GCP:

[图像描述](https://res.cloudinary.com/practicaldev/image/fetch/s--xo17OcOc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to- uploads.s3.amazonaws.com/uploads/articles/3woo5es3pb1p7ojnj2gd.png)

M20、128Gb、AWS:

[图像描述](https://res.cloudinary.com/practicaldev/image/fetch/s--QlvbP1QX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to- uploads.s3.amazonaws.com/uploads/articles/whfaq8ohvgb8y1mf3cd6.png)

笔记:

1.蓝线是Max Disk Write Latency

2.绿线是平均磁盘写入延迟

解释:

  1. 与 Azure(40-60 毫秒,1 小时内最多 80 毫秒)和 GCP(30 -40 毫秒,1 小时内出现 2-3 个尖峰,最长 50 毫秒)。这是一个巨大的差异!

可能影响结果的因素

关于结果可能不正确的原因有一些假设:

  1. 假设 1:Azure 上 M20 的 Burstability 可能会在较短的测试持续时间中导致良好的结果,而在较长的测试持续时间中导致较差的结果

2.假设2:负载测试基础设施存在另一个瓶颈(检查K8s节点利用率)

  1. 假设 3:尽管所有设置都在 K8s 集群和 MongoDB Atlas 集群之间使用网络对等互连,但可能(由于路由问题)消息采用另一条效率较低的路由。

结论

总体而言,与 Azure 和 GCP 相比,AWS 具有更好的性能。

奇怪的是,即使 GCP 的 IOPS 数最高,它似乎提供的性能最低。

Azure 肯定存在可变性/异常值7的问题,但性能相对较好。考虑到随着实例/存储大小的增加,Azure 变得相当昂贵,AWS 和 GCP 似乎是 M30/M40 范围内的赢家。

恕我直言,真正有趣的发现是 AWS 远远优于 Max Write Disk Latency ...想知道 MongoDB Atlas 是在 AWS 中使用直接附加存储还是在 Azure/GCP 中使用网络附加存储...

附:如果有任何评论指出导致错误结果的明显错误,我将不胜感激!


  1. 包括负载测试自动化/设置本身↩

  2. 同步 u003d 客户端通过 HTTPS/REST Service1 调用,Service1 充当协调器并同步调用 Service2、Service3 等并等待(异步)它们的响应。一些微服务间的调用是按顺序完成的,有些是并行的。↩

3、“事务”不代表数据库事务或分布式数据库事务。没有使用数据库事务(没有数据库受到损害;)↩

  1. 可爆破,这意味着从 2 x 100% u003d 200% 仅供应 40%,但累积的积分允许不时爆破至全部 200%↩

  2. IOPS 一半是读 IOPS,一半是写 IOPS↩

  3. 非预置,AWS 上预置的 IOPS 非常昂贵↩

  4. 见这篇关于 Azure 上各种磁盘相关性能问题的帖子↩

Logo

MongoDB社区为您提供最前沿的新闻资讯和知识内容

更多推荐