本文通过ECS访问云数据库 MongoDB 版的方式,压测云数据库 MongoDB 版的不同规格副本集实例的最大连接数。
测试环境
创建ECS实例和云数据库 MongoDB 版副本集实例。如何创建,请参见创建副本集实例和创建ECS实例。
本次测试的实例配置如下:
配置项 | ECS实例 | 云数据库MongoDB云盘架构实例 | 云数据库MongoDB本地盘架构实例 |
地域及可用区 | 华北2(北京)可用区H | 华北2(北京)可用区H | 华北2(北京)可用区H |
网络类型 | 专有网络VPC | 专有网络VPC | 专有网络VPC |
实例规格族 | 计算平衡增强型c6e | 通用型和独享型 | 通用型和独享型 |
实例规格 | ecs.c6e.2xlarge | 包含三种在售规格,详情请参见测试结果。 | 包含两种在售规格,详情请参见测试结果。 |
存储类型 | ESSD AutoPL云盘 | ESSD云盘 | 本地盘 |
实例或镜像版本 | Alibaba Cloud Linux 3.2104 LTS 64位 | 4.19.91-26.al7.x86_64 | 3.10.0-327.ali2017.alios7.x86_64 |
MongoDB内核版本 | 不涉及 |
|
|
测试采用的云数据库 MongoDB 版实例为标准副本集拓扑结构(三节点,包含一个主节点、一个从节点和一个隐藏节点)。
测试采用的ECS实例和云数据库 MongoDB 版实例在同一地域及可用区下,RTT(Round-Trip Time)平均值为0.103ms。
测试工具
本次压力测试将采用开源社区的YCSB 0.17.0压测工具。
说明YCSB是一款用Java编写的支持多种数据库的性能测试工具,具体安装和使用方法请参见YCSB。
本次压力测试将使用到自定义的连接数压测程序,关于自定义的连接数压测程序的介绍,请参见关于96000连接数测试的补充说明。
测试方法
- 将ECS实例的主私网IP添加到云数据库MongoDB实例的白名单中。如何添加,请参见修改白名单。说明 您可以登录ECS控制台,在实例详情页面的网络信息区域查看ECS实例的主私网IP。
- 远程连接ECS实例。如何连接,请参见连接ECS实例。
使用YCSB工具加载测试数据。
// 运行ycsb run负载 ./bin/ycsb.sh load mongodb -s -p workload=site.ycsb.workloads.CoreWorkload -p recordcount=10000000 -p mongodb.url="mongodb://test:****@dds-bp13e84d11****.mongodb.rds.aliyuncs.com:3717/admin" -p table=test -threads 8
您需要修改以下参数值:
recordcount=1000000
:加载至云数据库 MongoDB 版实例的数据总数。mongodb.url="mongodb://test:****@dds-bp13e84d11****.mongodb.rds.aliyuncs.com:3717/admin"
:云数据库 MongoDB 版实例的连接地址。本文使用的数据库账号为test,所属数据库为admin。说明您可以登录云数据库MongoDB控制台,在数据库连接页面的私网连接 - 专有网络区域查看连接地址。
threads 8
:客户端的并发线程数。
执行如下测试命令,进行性能压测。
./bin/ycsb.sh run mongodb -s -p workload=site.ycsb.workloads.CoreWorkload -p recordcount=10000000 -p operationcount=5000000 -p readproportion=50 -p updateproportion=50 -p requestdistribution=zipfian -p mongodb.url="mongodb://test:****@dds-bp13e84d11****.mongodb.rds.aliyuncs.com:3717/admin&maxPoolSize=8000" -p table=test -threads 8000
您需要修改以下参数值:
recordcount=1000000
:加载至云数据库 MongoDB 版实例的数据总数。operationcount=5000000
:执行读写测试的总次数。insertproportion=0
:加载数据操作比例。readproportion=50
:读操作比例。updateproportion=50
:更新操作比例。mongodb.url="mongodb://test:****@dds-bp13e84d11****.mongodb.rds.aliyuncs.com:3717/admin"
:云数据库 MongoDB 版实例的连接地址。本文使用的数据库账号为test,所属数据库为admin。说明您可以登录云数据库MongoDB控制台,在数据库连接页面的私网连接 - 专有网络区域查看连接地址。
您在使用上述命令是需要指定
maxPoolSize
参数,如果不指定该参数的话,其默认值仅为100,会导致测试过程中遇到MongoWaitQueueFullException
的错误,从而无法达到期望的最大连接数。
查看测试实例的监控信息,具体操作,请参见基本监控。
您需要在基本监控页签下,选择本次测试对应的时间段,查看实例的CPU使用率、内存使用率、操作QPS数、连接数和连接数使用率指标。
关于96000连接数测试的补充说明
由于YCSB测试依赖于Java环境,但JVM的最大堆内存存在上限。在进行高并发数(threads > 20000)运行测试时会出现形如下图的Cannot allocate memory
错误,从而导致测试无法继续进行。
即便是临时调大Java的JAVA_OPTS
配置参数也依旧会出现错误。为了解决该问题,您需要选择使用自定义的连接数压测程序。压测程序的逻辑如下:循环生成若干线程,每个线程生成1个MongoClient客户端,客户端执行查询后保持一段时间内部不释放连接即可。
因为单台压测客户端机器的端口数量有限,所以单台压测客户端机器已无法满足32核128 GB规格的连接数(最大连接数96000)测试,您需要在多台压测客户端机器上同时运行相同的压测程序。
查询压测客户端机器的当前端口范围的Bash命令如下:
sysctl net.ipv4.ip_local_port_range
返回示例如下:
net.ipv4.ip_local_port_range = 40000 65535
您还可以通过如下的命令来适当放大压测客户端机器的端口范围,然后再进行连接数压力测试:
sudo sysctl -w net.ipv4.ip_local_port_range="10240 65535"
测试结果
ESSD云盘版
独享型4核8 GB
目标最大连接数:8000
操作QPS数 | 连接数 | 连接数使用率 | CPU使用率 | 内存使用率 |
受限于基本监控视图的分钟级采样粒度,视图中未能显示当时达到的最大连接数信息。实际上当时连接数已经达到了8000,您可以通过细粒度的监控或者serverStatus
结果的connections
子文档来确认。
独享型32核128 GB
目标最大连接数:96000
操作QPS数 | 连接数 | 连接数使用率 | CPU使用率 | 内存使用率 |
因使用的压测工具跟另外两个测试不同,以上的QPS、CPU和内存使用率监控截图并不具备可比性。
通用型8核32 GB
目标最大连接数:16000
操作QPS数 | 连接数 | 连接数使用率 | CPU使用率 | 内存使用率 |
本地盘版
通用型16核64 GB
目标最大连接数:32000
操作QPS数 | 连接数 | 连接数使用率 | CPU使用率 | 内存使用率 |
受限于基本监控视图的分钟级采样粒度,该通用型规格实例的部分采样时间点由于CPU使用率满导致采集命令超时而失败,监控出现断点,因此会出现分钟级的波谷,当时的实际连接数持续为32000。
独享型2核16 GB
目标最大连接数:8000
操作QPS数 | 连接数 | 连接数使用率 | CPU使用率 | 内存使用率 |
总结
不同规格、不同架构的云数据库 MongoDB 版副本集实例均可以达到其规格对应的最大连接数。
当达到最大连接数之后,MongoDB会拒绝后续连接。业务侧会因无法建立连接而出现请求延迟高或卡顿。
并发的连接数越多,实例的CPU和内存等资源的开销会越大。建议您根据实际业务情况,合理控制实例的连接数。