天天看点

云厂商MongoDB性能测试

作者:杨建荣的学习笔记

0、概述

由于工作关系,笔者曾对国内外四家云厂商巨头的 MongoDB 产品做了性能测试,测试对象是托管的 MongoDB V4.0 三节点副本集架构。由于不同云厂商的产品规格并不统一,比如 MongoDB V4.0 副本集架构国内的A云、T云有4C8G的规格,国内的H云和国外A云(以下采用AW云)并没有该规格。因此,H云选择4C16G规格替代,AW云选择4C32G规格替代。另外,这次测试是2022年Q2做的,不代表云厂商产品的当前状态。综上情况,此次云厂商MongoDB性能测试结果,不具有生产实际参考,仅供参考。

本次测试的场景是“95%读5%写”和“50%读50%写”,观测了这两种场景下,云厂商托管的MongoDB在不同线程数下的每秒操作数(throughput ops/sec)、RAL(us) 平均读时延、WAL(us) 平均写时延、系统负载等指标。

测试结论:在上述测试条件,两种场景的AW云的MongoDB 副本集性能最好,H云、A云和T云以及On Ecs自建的性能相差并不大。由于数据库服务端的CPU核数是4,故在16线程的性能到达峰值,再增加线程数,数据库性能下降。见下图1和图2。

云厂商MongoDB性能测试

图1:95%读5%写

云厂商MongoDB性能测试

图2:50%读50%写

1、测试环境

1.1 测试工具

YCSB全称为“Yahoo!Cloud Serving Benchmark”,是雅虎用于测试云NoSQL的工具,支持对常见的NoSQL产品进行性能测试,如Cassandra、MongoDB、HBase、Redis等。使用该工具前,还需要下载和配置JDK、Maven、python组件。相关组件的下载配置详见YCSB介绍。

1.2 服务端信息

云厂商MongoDB性能测试
注意:本次测试云厂商的MongoDB产品,均使用默认参数。

1.3 客户端信息

云厂商MongoDB性能测试

2、测试步骤

2.1 Load数据阶段

在测试生成数据阶段,使用100个线程,生成2000万的数据,数据大约有25G。

命令如下:

ycsb load mongodb -s -P /root/ycsb-0.17.0/workloads/workloada -threads 100 -p insertstart=0 -p recordcount=20000000 -p readproportion=0 -p updateproportion=0 -p insertproportion= -p requestdistribution=uniform -p mongodb.url=mongodb://user:password@ip:port/admin -p mongodb.database=ycsb -p table=t_test > load_result.txt           

workload相关参数介绍如下:

recordcound:load阶段加载到数据库的纪录条数 (default: 0) ,run阶段操作的数据范围(注:run阶段该值不能大于load阶段的值,否则会出报错)              operationcount:run阶段执行的操作总数              threads:请求线程数,不要超过服务端的maxConnect数,否则会报错              readproportion: 读操作比例 (default: 0.95)              updateproportion: 更新操作比例 (default: 0.05)              insertproportion: 插入操作比例 (default: 0)              insertstart:第一个插入值的偏移量(default: 0)              requestdistribution: 请求的分布规则 uniform, zipfian or latest              mongodb.url:待测试mongo实例的连接地址              mongodb.database:测试时使用的数据库名称(default: ycsb)              table: 测试表的名称 (default: usertable)           

2.2 Run性能阶段

  • 95%读5%写

测试命令如下:

ycsb run mongodb -s -P /root/ycsb-0..0/workloads/workloada -threads ${num} -p recordcount=3000000 -p operationcount=5000000 -p insertstart=0 -p insertcount=0 -p readproportion=0.95 -p updateproportion=0.05 -p insertproportion=0 -p mongodb.url=mongodb://user:password@ip:port/admin -p mongodb.database=ycsb -p table=t_test > run_95_5_result_${num}.txt           
  • 50%读50%写

测试命令如下:

ycsb run mongodb -s -P /root/ycsb-0..0/workloads/workloada -threads ${num} -p recordcount=3000000 -p operationcount=5000000 -p insertstart=0 -p insertcount=0 -p readproportion=0.5 -p updateproportion=0.5 -p insertproportion=0 -p mongodb.url=mongodb://user:password@ip:port/admin -p mongodb.database=ycsb -p table=t_test > run_5_5_result_${num}.txt               

使用以上命令分别测试2、4、8、16、32、64、128、256线程,并记录相关测试数据。3、测试数据

3.1 95%读5%写场景

3.2 50%读50%写场景

云厂商MongoDB性能测试

总结分析表3和表4数据可以发现:

  • 每秒操作数一开始随着线程数的增加而增大,到达一定线程数后,每秒线程数下降。最大值均出现在16个线程时。
  • 当线程数到达16时,各家云厂商的产品CPU负载均到达了95%以上。
  • 当线程数到达32时,平均RT是负载较低时的10倍左右。
  • 50%写50%读场景,数据库每秒操作数降低了2倍左右,RT也增长了2倍左右。
  • 自建的MongoDB在性能上,和同规格的阿里云、腾讯云并没有太大差异,性能基本相同。

4、测试总结

通过上述测试分析后,在生产使用4C8G的副本集架构产品时,不建议线程数使用过多。因为线程数过多并不能提高读写性能,反而RT会增长很大,由此可能会带来性能不稳定。建议线程数和服务端CPU核数保持一致或者略高。总体看,各云厂家MongoDB产品的性能差距并不大。

5、参考

  • YCSB使用介绍 @YCSB Github Documentation
  • MongoDB介绍 @MongoDB Documentation

继续阅读