加入收藏 | 设为首页 | 会员中心 | 我要投稿 聊城站长网 (https://www.0635zz.com/)- 智能语音交互、行业智能、AI应用、云计算、5G!
当前位置: 首页 > 服务器 > 系统 > 正文

使用Mongodb实现性能改进的压测

发布时间:2023-09-21 15:32:42 所属栏目:系统 来源:
导读:一、背景

这几天对所有的基础组件做一个摸底的基准压力测试,目前我们所有的开源基础组件都没有做过性能测试,经常有开发人员问,我们的RDS、MongoDB集群能抗多大量呀,这个时候我是没办法回复的,因为我自己也不
一、背景
 
这几天对所有的基础组件做一个摸底的基准压力测试,目前我们所有的开源基础组件都没有做过性能测试,经常有开发人员问,我们的RDS、MongoDB集群能抗多大量呀,这个时候我是没办法回复的,因为我自己也不知道,虽然一个数据库集群能抗多大量,在软件、硬件配置固定的情况下,和业务场景有很大的关系,如果数据量小,查询SQL简单那吞吐量自然很高,如果数据量特别大并且都是复杂SQL,那吞吐量自然上不去;但是既然人家问了,肯定是希望有一个答案,如果你说不知道,那会给人一种不靠谱的感觉,所以做一次基准压力测试,我们知道在特定的场景下我们的集群能有多大的吞吐量,做到自己心里有数,才给别人信心。这周在压测MongoDB,谷歌了一番,MongoDB的压测工具很少,有几篇是介绍通过YCSB压测MongoDB的,找丹姐(逻辑思维首席DBA)推荐一款MongoDB的压测工具,丹姐也推荐YCSB,好吧,那就它吧,开整。
 
二、环境说明
 
1、MongoDB集群配置(一个分片的shard集群)
 
Mongodb性能压测
 
2、MongoDB版本
 
4.0.4-62-g7e345a7
 
4、系统及内核版本
 
 
CentOS Linux release 7.5.1804 (Core)
 
3.10.0-862.14.4.el7.x86_64
 
3、YCSB版本
 
YCSB-0.16.0-RC1.
 
4、测试说明
 
Mongodb性能压测
 
三、安装
 
1、jdk及maven安装参考官方
 
https://github.com/brianfrankcooper/YCSB/tree/master/mongodb
 
2、安装YCSB
 
wget https://github.com/brianfrankcooper/YCSB/archive/0.16.0-RC1.tar.gz
 
tar -zxvf YCSB-0.16.0-RC1.tar.gz
 
cd YCSB-0.16.0-RC1/
 
mvn clean package -Dmaven.test.skip=true
 
PS:
 
安装过程中maven下载依赖需要×××,如果有安装失败的包,需要在能×××的服务器上下载手动安装,比如mongodb-async-driver-2.0.1.jar就需要×××,下面是手动安装方法
 
A、手动下载jar包
 
wget http://www.allanbank.com/repo/com/allanbank/mongodb-async-driver/2.0.1/mongodb-async-driver-2.0.1.jar
 
B、加压包,从pom.xml 文件里面查看groupId、artifactId、version
 
C、手动安装
 
mvn install:install-file -Dfile=/tmp/mongodb-async-driver-2.0.1.jar  -DgroupId=com.allanbank -DartifactId=mongodb-async-driver -Dversion=2.0.1 -Dpackaging=jar
 
mvn -pl com.yahoo.ycsb:mongodb-binding -am clean package
 
四、压测
 
1、编写压测文件
 
在workloads目录下有很多压测文件用到的文件,我们从其中一个copy一份,编辑添加我们自己定义的内容
 
vim workloads/2000w
 
ongodb.url=mongodb://root:123456@172.21.244.101:27000
 
mongodb.writeConcern=normal
 
table=chj_2000w
 
recordcount=20000000
 
operationcount=50000000
 
readallfields=true
 
readproportion=0
 
updateproportion=0
 
scanproportion=0
 
insertproportion=1
 
requestdistribution=zipfian
 
workload=com.yahoo.ycsb.workloads.CoreWorkload
 
关于YCSB的压测文件的每个参数的解释如下:
 
fieldcount: 每条记录字段个数 (default: 10)
 
fieldlength: 每个字段长度 (default: 100)
 
readallfields: 是否读取所有字段true或者读取一个字段false (default: true)
 
readproportion: 读取作业比例 (default: 0.95)
 
updateproportion: 更新作业比例 (default: 0.05)
 
insertproportion: 插入作业比例 (default: 0)
 
scanproportion: 扫描作业比例 (default: 0)
 
readmodifywriteproportion: 读取一条记录修改它并写回的比例 (default: 0)
 
requestdistribution: 请求的分布规则 uniform, zipfian or latest (default: uniform)
 
maxscanlength: 扫描作业最大记录数 (default: 1000)
 
scanlengthdistribution: 在1和最大扫描记录数的之间的分布规则 (default: uniform)
 
insertorder: 记录被插入的规则ordered或者hashed (default: hashed)
 
operationcount: 执行的操作数.
 
maxexecutiontime: 执行操作的最长时间,当然如果没有超过这个时间以运行时间为主。
 
table: 测试表的名称 (default: usertable)
 
recordcount: 加载到数据库的纪录条数 (default: 0)
 
2、造数据,也是测写入性能
 
./bin/ycsb load mongodb -threads 100 -P workloads/2000w
 
输出结果说明
 
[OVERALL], RunTime(ms), 37182  #数据加载所用时间(毫秒)
 
[OVERALL], Throughput(ops/sec), 13447.367005540314  #加载操作的吞吐量(ops/sec)
 
[TOTAL_GCS_PS_Scavenge], Count, 37
 
[TOTAL_GC_TIME_PS_Scavenge], Time(ms), 146
 
[TOTAL_GC_TIME_%_PS_Scavenge], Time(%), 0.3926631165617772
 
[TOTAL_GCS_PS_MarkSweep], Count, 0
 
[TOTAL_GC_TIME_PS_MarkSweep], Time(ms), 0
 
[TOTAL_GC_TIME_%_PS_MarkSweep], Time(%), 0.0
 
[TOTAL_GCs], Count, 37
 
[TOTAL_GC_TIME], Time(ms), 146
 
[TOTAL_GC_TIME_%], Time(%), 0.3926631165617772
 
[CLEANUP], Operations, 64
 
[CLEANUP], AverageLatency(us), 422.09375
 
[CLEANUP], MinLatency(us), 0
 
[CLEANUP], MaxLatency(us), 26911
 
[CLEANUP], 95thPercentileLatency(us), 3
 
[CLEANUP], 99thPercentileLatency(us), 30
 
[INSERT], Operations, 500000  # 执行insert操作的总数
 
[INSERT], AverageLatency(us), 4658.931652  # 每次insert操作的平均延时(微秒)
 
[INSERT], MinLatency(us), 831 # 所有insert操作的最小延时(微秒)
 
[INSERT], MaxLatency(us), 1784831 # 所有insert操作的最大延时(微秒)
 
[INSERT], 95thPercentileLatency(us), 9711  # 95%的insert操作延时在9毫秒以内
 
[INSERT], 99thPercentileLatency(us), 17903 # 99%的insert操作延时在17毫秒以内
 
[INSERT], Return=OK, 500000
 
3、压测
 
通过调整压测文件中read和update的比例,模拟只读和读写混合的操作
 
./bin/ycsb run mongodb -threads 100 -P workloads/2000w
 
[OVERALL], RunTime(ms), 1735408
 
[OVERALL], Throughput(ops/sec), 2881.1668495247227
 
[TOTAL_GCS_PS_Scavenge], Count, 3975
 
[TOTAL_GC_TIME_PS_Scavenge], Time(ms), 6180
 
[TOTAL_GC_TIME_%_PS_Scavenge], Time(%), 0.3561122226012557
 
[TOTAL_GCS_PS_MarkSweep], Count, 0
 
[TOTAL_GC_TIME_PS_MarkSweep], Time(ms), 0
 
[TOTAL_GC_TIME_%_PS_MarkSweep], Time(%), 0.0
 
[TOTAL_GCs], Count, 3975
 
[TOTAL_GC_TIME], Time(ms), 6180
 
[TOTAL_GC_TIME_%], Time(%), 0.3561122226012557
 
[READ], Operations, 500346
 
[READ], AverageLatency(us), 2851.9638989819045
 
[READ], MinLatency(us), 696
 
[READ], MaxLatency(us), 646655
 
[READ], 95thPercentileLatency(us), 6991
 
[READ], 99thPercentileLatency(us), 23103
 
[READ], Return=OK, 500346
 
[CLEANUP], Operations, 10
 
[CLEANUP], AverageLatency(us), 3131.0
 
[CLEANUP], MinLatency(us), 1
 
[CLEANUP], MaxLatency(us), 31295
 
[CLEANUP], 95thPercentileLatency(us), 31295
 
[CLEANUP], 99thPercentileLatency(us), 31295
 
[UPDATE], Operations, 4499654
 
[UPDATE], AverageLatency(us), 3534.2083122391186
 
[UPDATE], MinLatency(us), 704
 
[UPDATE], MaxLatency(us), 1078271
 
[UPDATE], 95thPercentileLatency(us), 11647
 
[UPDATE], 99thPercentileLatency(us), 27343
 
[UPDATE], Return=OK, 4499654
 
五、指标观察
 
1、服务器指标,主要观察CPU、内存、磁盘IO的利用率和延时,可以通过top、iostat工具查看实时情况
 
2、MongoDB可以通过mongostat 工具查看实时情况
 
mongostat的输出说明
 
inserts:每秒插入次数
 
query:每秒查询次数
 
update:每秒更新次数
 
delete:每秒删除次数
 
getmore:每秒执行getmore次数
 
command:每秒的命令数,比以上插入、查找、更新、删除的综合还多,还统计了别的命令
 
dirty:WiredTiger存储引擎中dirty 数据占缓存百分比
 
used:WiredTiger存储引擎中引擎使用缓存占百分比
 
flushs:每秒执行fsync将数据写入硬盘的次数。
 
vsize:虚拟内存使用量,单位MB
 
res:物理内存使用量,单位MB
 
qrw:客户端等待读的长度,队列中的长度
 
arw:客户端等待写的队列长度
 
netIn 和 netOut:网络流量,单位是字节 byte
 
conn:当前连接数
 
time:时间戳
 
 

(编辑:聊城站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章