副本集实例最大连接数压力测试

本文通过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内核版本

不涉及

  • 大版本:4.4

  • 小版本基线:4.4.28

  • 大版本:4.2

  • 小版本基线:4.2.23

  • 测试采用的云数据库 MongoDB 版实例为标准副本集拓扑结构(三节点,包含一个主节点、一个从节点和一个隐藏节点)。

  • 测试采用的ECS实例和云数据库 MongoDB 版实例在同一地域及可用区下,RTT(Round-Trip Time)平均值为0.103ms。

测试工具

  • 本次压力测试将采用开源社区的YCSB 0.17.0压测工具。

    说明

    YCSB是一款用Java编写的支持多种数据库的性能测试工具,具体安装和使用方法请参见YCSB

  • 本次压力测试将使用到自定义的连接数压测程序,关于自定义的连接数压测程序的介绍,请参见关于96000连接数测试的补充说明

测试方法

  1. ECS实例的主私网IP添加到云数据库MongoDB实例的白名单中。如何添加,请参见修改白名单
    说明 您可以登录ECS控制台,在实例详情页面的网络信息区域查看ECS实例的主私网IP
  2. 远程连接ECS实例。如何连接,请参见连接ECS实例
  3. 使用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:客户端的并发线程数。

  4. 执行如下测试命令,进行性能压测。

    ./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的错误,从而无法达到期望的最大连接数。

  5. 查看测试实例的监控信息,具体操作,请参见基本监控

    您需要在基本监控页签下,选择本次测试对应的时间段,查看实例的CPU使用率内存使用率操作QPS连接数连接数使用率指标。

关于96000连接数测试的补充说明

由于YCSB测试依赖于Java环境,但JVM的最大堆内存存在上限。在进行高并发数(threads > 20000)运行测试时会出现形如下图的Cannot allocate memory错误,从而导致测试无法继续进行。image

即便是临时调大JavaJAVA_OPTS配置参数也依旧会出现错误。为了解决该问题,您需要选择使用自定义的连接数压测程序。压测程序的逻辑如下:循环生成若干线程,每个线程生成1MongoClient客户端,客户端执行查询后保持一段时间内部不释放连接即可。

因为单台压测客户端机器的端口数量有限,所以单台压测客户端机器已无法满足32128 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云盘版

独享型48 GB

目标最大连接数:8000

操作QPS

连接数

连接数使用率

CPU使用率

内存使用率

image.png

image.png

image.png

image.png

image.png

说明

受限于基本监控视图的分钟级采样粒度,视图中未能显示当时达到的最大连接数信息。实际上当时连接数已经达到了8000,您可以通过细粒度的监控或者serverStatus结果的connections子文档来确认。image

独享型32128 GB

目标最大连接数:96000

操作QPS

连接数

连接数使用率

CPU使用率

内存使用率

image.png

image.png

image.png

image.png

image.png

说明

因使用的压测工具跟另外两个测试不同,以上的QPS、CPU和内存使用率监控截图并不具备可比性。

通用型832 GB

目标最大连接数:16000

操作QPS

连接数

连接数使用率

CPU使用率

内存使用率

image.png

image.png

image.png

image.png

image.png

本地盘版

通用型1664 GB

目标最大连接数:32000

操作QPS

连接数

连接数使用率

CPU使用率

内存使用率

image.png

image.png

image.png

image.png

image.png

说明

受限于基本监控视图的分钟级采样粒度,该通用型规格实例的部分采样时间点由于CPU使用率满导致采集命令超时而失败,监控出现断点,因此会出现分钟级的波谷,当时的实际连接数持续为32000。

独享型216 GB

目标最大连接数:8000

操作QPS

连接数

连接数使用率

CPU使用率

内存使用率

image.png

image.png

image.png

image.png

image.png

总结

  • 不同规格、不同架构的云数据库 MongoDB 版副本集实例均可以达到其规格对应的最大连接数。

  • 当达到最大连接数之后,MongoDB会拒绝后续连接。业务侧会因无法建立连接而出现请求延迟高或卡顿。

  • 并发的连接数越多,实例的CPU和内存等资源的开销会越大。建议您根据实际业务情况,合理控制实例的连接数。