mongo+ycsb性能测试及线程数分析

一、mongo安装及压测ycsb安装

mongodb下载官网
https://www.mongodb.com/

mongo下载完对应tar包后,通过tar -xvf命令解压至/usr/local下

mv tar包名称 mongodb
cd /mongodb
mkdir  /data/db
mkdir  /data/log
vi mongodb.conf
#新建配置文件,配置如下
dbpath=/usr/local/mongodb/data/db
logpath=/usr/local/mongodb/data/log/mongodb.log
logappend=true
port=27017
auth=false
fork=true
bind_ip=0.0.0.0

启动mongo

/usr/local/mongod/bin/mongod --config /usr/local/mongod/conf/mongodb.conf 

ycsb0.17下载地址

https://download.csdn.net/download/dong0928/12285659?utm_source=iteye_new

二、ycsb加载与负载测试

#官方文档 Now you are ready to run! First, use the asynchronous driver to load the data:

解压后ycsb后

cd ycsb/workloads

不同的工作负载模式不同对应增删改查的操作所占百分比不同
ycsb的workloads目录下保存了6种不同的workload类型,代表了不同的压测负载类型,详细的介绍列在下面:
workloada:混合了50%的读和50%的写; workloadb:Read mostly
workload,混合了95%的读和5%的写,该workload侧重于测试集群的读能力;
workloadc:Readonly,100%只读
workloadd:Read latest workload,插入数据,接着就读取这些新插入的数据
workloade:Short ranges,短范围scan,不同于随机读,每个测试线程都会去scan一段数据
workloadf:Read-modiy-wirte,读改写,客户端读出一个记录,修改它并将被修改的记录返回

mv workloada back_workloada
vi workloada
#配置如下:

##连接的url及db地址
mongodb.url=mongodb://10.37.0.101/
mongodb.database=ycsb

##初始加载数据数,第一次可以100000次少点便于验证
recordcount=100000000

##操作次数
operationcount=1000000

##(要使用的工作负载类)
workload=site.ycsb.workloads.CoreWorkload

##(默认值是1,应该读取读取所有字段(true),只读取一个(false))
readallfields=true

##查询操作所占百分比
readproportion=0.5

##更新操作所占百分比
updateproportion=0.5

##扫描操作所占百分比
scanproportion=0

##写入操作所占百分比
insertproportion=0

requestdistribution=zipfian

threadcount=100

fieldlength=200

首先进行加载数据
./bin/ycsb load mongodb -s -P workloads/workloada > outputLoad.txt
Then, run the workload:
./bin/ycsb run mongodb -s -P workloads/workloada > outputRun.txt

避免重复写入主键冲突
-p mongodb.upsert=true
线程数
-p threads 10

在这里插入图片描述
mongo库已插入千万条数据
在这里插入图片描述

测试结果分析:
在这里插入图片描述

#花费时间3470.464s
[OVERALL], RunTime(ms), 3470464
#数据库每秒操作次数为2881.4590786707486
[OVERALL], Throughput(ops/sec), 2881.4590786707486
[TOTAL_GCS_PS_Scavenge], Count, 113
[TOTAL_GC_TIME_PS_Scavenge], Time(ms), 16027
[TOTAL_GC_TIME_%_PS_Scavenge], Time(%), 0.4618114465385608
[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, 113
[TOTAL_GC_TIME], Time(ms), 16027
[TOTAL_GC_TIME_%], Time(%), 0.4618114465385608
#清理操作操作数、单平均延迟、最小延迟、最大延迟95/99百分位
[CLEANUP], Operations, 100
[CLEANUP], AverageLatency(us), 3373.35
[CLEANUP], MinLatency(us), 1
[CLEANUP], MaxLatency(us), 336895
[CLEANUP], 95thPercentileLatency(us), 14
[CLEANUP], 99thPercentileLatency(us), 90
#插入操作操作数、平均延迟、最小延迟、最大延迟,95/99百分位
[INSERT], Operations, 10000000
[INSERT], AverageLatency(us), 28241.2937591
[INSERT], MinLatency(us), 120
[INSERT], MaxLatency(us), 298057727
[INSERT], 95thPercentileLatency(us), 58623
[INSERT], 99thPercentileLatency(us), 391423
[INSERT], Return=OK, 10000000

load完后,现在进行run测试

./bin/ycsb run mongodb -P workloads/workloada > run.log
vi run.log

结果如下:
在这里插入图片描述

[OVERALL], RunTime(ms), 8125
[OVERALL], Throughput(ops/sec), 12307.692307692309
[TOTAL_GCS_PS_Scavenge], Count, 6
[TOTAL_GC_TIME], Time(ms), 224
[TOTAL_GC_TIME_%], Time(%), 2.756923076923077
[READ], Operations, 49931
[READ], AverageLatency(us), 5412.5758146241815
[READ], MinLatency(us), 192
[READ], MaxLatency(us), 412927
[READ], 95thPercentileLatency(us), 15295
[READ], 99thPercentileLatency(us), 89919
[READ], Return=OK, 49931
[CLEANUP], Operations, 100
[CLEANUP], AverageLatency(us), 1566.47
[CLEANUP], MinLatency(us), 0
[CLEANUP], MaxLatency(us), 156287
[CLEANUP], 95thPercentileLatency(us), 3
[CLEANUP], 99thPercentileLatency(us), 298
[UPDATE], Operations, 50069
[UPDATE], AverageLatency(us), 4083.3765204018455
[UPDATE], MinLatency(us), 223
[UPDATE], MaxLatency(us), 420095
[UPDATE], 95thPercentileLatency(us), 11199
[UPDATE], 99thPercentileLatency(us), 61503
[UPDATE], Return=OK, 50069

可以看出load进行插入的操作,run进行read、update的操作,并且按照配置文件的0.5%即5+5=10万条查询及更新吞吐量为12307

这时候我们去改变线程数量再次以此配置进行测试

最佳线程数目 = ((线程等待时间+线程CPU时间)/线程CPU时间 )* CPU数目

./bin/ycsb run mongodb -P workloads/workloada -threads 100
[OVERALL], RunTime(ms), 264990
[OVERALL], Throughput(ops/sec), 377.3727310464546
[TOTAL_GCS_PS_Scavenge], Count, 6
[TOTAL_GC_TIME_PS_Scavenge], Time(ms), 148
[TOTAL_GC_TIME_%_PS_Scavenge], Time(%), 0.05585116419487528
[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, 6
[TOTAL_GC_TIME], Time(ms), 148
[TOTAL_GC_TIME_%], Time(%), 0.05585116419487528
[READ], Operations, 50167
[READ], AverageLatency(us), 8718.358542468157
[READ], MinLatency(us), 246
[READ], MaxLatency(us), 5517311
[READ], 95thPercentileLatency(us), 12839
[READ], 99thPercentileLatency(us), 40255
[READ], Return=OK, 50167
[CLEANUP], Operations, 100
[CLEANUP], AverageLatency(us), 220.4
[CLEANUP], MinLatency(us), 1
[CLEANUP], MaxLatency(us), 21711
[CLEANUP], 95thPercentileLatency(us), 5
[CLEANUP], 99thPercentileLatency(us), 154
[UPDATE], Operations, 49833
[UPDATE], AverageLatency(us), 11637.081632653062
[UPDATE], MinLatency(us), 259
[UPDATE], MaxLatency(us), 5713919
[UPDATE], 95thPercentileLatency(us), 8879
[UPDATE], 99thPercentileLatency(us), 42143
[UPDATE], Return=OK, 49833

线程数为3时3380

./bin/ycsb run mongodb -P workloads/workloada -threads 3
[OVERALL], RunTime(ms), 29581
[OVERALL], Throughput(ops/sec), 3380.548324938305
[TOTAL_GCS_PS_Scavenge], Count, 4
[TOTAL_GC_TIME_PS_Scavenge], Time(ms), 60
[TOTAL_GC_TIME_%_PS_Scavenge], Time(%), 0.2028328994962983
[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, 4
[TOTAL_GC_TIME], Time(ms), 60
[TOTAL_GC_TIME_%], Time(%), 0.2028328994962983
[READ], Operations, 50235
[READ], AverageLatency(us), 590.9062605752961
[READ], MinLatency(us), 188
[READ], MaxLatency(us), 834559
[READ], 95thPercentileLatency(us), 617
[READ], 99thPercentileLatency(us), 1039
[READ], Return=OK, 50235
[CLEANUP], Operations, 3
[CLEANUP], AverageLatency(us), 329483.0
[CLEANUP], MinLatency(us), 4
[CLEANUP], MaxLatency(us), 988671
[CLEANUP], 95thPercentileLatency(us), 988671
[CLEANUP], 99thPercentileLatency(us), 988671
[UPDATE], Operations, 49765
[UPDATE], AverageLatency(us), 626.2020697277203
[UPDATE], MinLatency(us), 217
[UPDATE], MaxLatency(us), 1181695
[UPDATE], 95thPercentileLatency(us), 634
[UPDATE], 99thPercentileLatency(us), 1002
[UPDATE], Return=OK, 49765

线程数为4时5535

./bin/ycsb run mongodb -P workloads/workloada -threads 4
[OVERALL], RunTime(ms), 18065
[OVERALL], Throughput(ops/sec), 5535.566011624689
[TOTAL_GCS_PS_Scavenge], Count, 4
[TOTAL_GC_TIME_PS_Scavenge], Time(ms), 66
[TOTAL_GC_TIME_%_PS_Scavenge], Time(%), 0.36534735676722946
[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, 4
[TOTAL_GC_TIME], Time(ms), 66
[TOTAL_GC_TIME_%], Time(%), 0.36534735676722946
[READ], Operations, 49992
[READ], AverageLatency(us), 460.93799007841255
[READ], MinLatency(us), 185
[READ], MaxLatency(us), 268287
[READ], 95thPercentileLatency(us), 560
[READ], 99thPercentileLatency(us), 926
[READ], Return=OK, 49992
[CLEANUP], Operations, 4
[CLEANUP], AverageLatency(us), 1521.75
[CLEANUP], MinLatency(us), 5
[CLEANUP], MaxLatency(us), 6039
[CLEANUP], 95thPercentileLatency(us), 6039
[CLEANUP], 99thPercentileLatency(us), 6039
[UPDATE], Operations, 50008
[UPDATE], AverageLatency(us), 496.3823788193889
[UPDATE], MinLatency(us), 216
[UPDATE], MaxLatency(us), 828927
[UPDATE], 95thPercentileLatency(us), 582
[UPDATE], 99thPercentileLatency(us), 953
[UPDATE], Return=OK, 50008

那么线程设置为5呢,2277

./bin/ycsb run mongodb -P workloads/workloada -threads 5
[OVERALL], RunTime(ms), 43899
[OVERALL], Throughput(ops/sec), 2277.956217681496
[TOTAL_GCS_PS_Scavenge], Count, 4
[TOTAL_GC_TIME_PS_Scavenge], Time(ms), 184
[TOTAL_GC_TIME_%_PS_Scavenge], Time(%), 0.4191439440533953
[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, 4
[TOTAL_GC_TIME], Time(ms), 184
[TOTAL_GC_TIME_%], Time(%), 0.4191439440533953
[READ], Operations, 49986
[READ], AverageLatency(us), 1507.791441603649
[READ], MinLatency(us), 185
[READ], MaxLatency(us), 2721791
[READ], 95thPercentileLatency(us), 518
[READ], 99thPercentileLatency(us), 859
[READ], Return=OK, 49986
[CLEANUP], Operations, 5
[CLEANUP], AverageLatency(us), 653.6
[CLEANUP], MinLatency(us), 3
[CLEANUP], MaxLatency(us), 3235
[CLEANUP], 95thPercentileLatency(us), 3235
[CLEANUP], 99thPercentileLatency(us), 3235
[UPDATE], Operations, 50014
[UPDATE], AverageLatency(us), 2588.507597872596
[UPDATE], MinLatency(us), 210
[UPDATE], MaxLatency(us), 2373631
[UPDATE], 95thPercentileLatency(us), 529
[UPDATE], 99thPercentileLatency(us), 885
[UPDATE], Return=OK, 50014

二分法查找,当然因为是单核低配虚拟机,直接按照2个thread来测就可以了,实际物理机会有明显的线程数量差量变化,会呈现高斯分布,中间有一个最适合的线程数

./bin/ycsb run mongodb -P workloads/workloada -threads 2
[OVERALL], RunTime(ms), 32385
[OVERALL], Throughput(ops/sec), 3087.8493129535277
[TOTAL_GCS_PS_Scavenge], Count, 4
[TOTAL_GC_TIME_PS_Scavenge], Time(ms), 84
[TOTAL_GC_TIME_%_PS_Scavenge], Time(%), 0.25937934228809634
[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, 4
[TOTAL_GC_TIME], Time(ms), 84
[TOTAL_GC_TIME_%], Time(%), 0.25937934228809634
[READ], Operations, 49916
[READ], AverageLatency(us), 515.6664596522157
[READ], MinLatency(us), 172
[READ], MaxLatency(us), 694271
[READ], 95thPercentileLatency(us), 523
[READ], 99thPercentileLatency(us), 945
[READ], Return=OK, 49916
[CLEANUP], Operations, 2
[CLEANUP], AverageLatency(us), 1568.0
[CLEANUP], MinLatency(us), 21
[CLEANUP], MaxLatency(us), 3115
[CLEANUP], 95thPercentileLatency(us), 3115
[CLEANUP], 99thPercentileLatency(us), 3115
[UPDATE], Operations, 50084
[UPDATE], AverageLatency(us), 665.4541370497564
[UPDATE], MinLatency(us), 203
[UPDATE], MaxLatency(us), 1405951
[UPDATE], 95thPercentileLatency(us), 550
[UPDATE], 99thPercentileLatency(us), 955
[UPDATE], Return=OK, 50084

线程数为6时

[OVERALL], RunTime(ms), 52916
[OVERALL], Throughput(ops/sec), 1889.7875878751229
[TOTAL_GCS_PS_Scavenge], Count, 4
[TOTAL_GC_TIME_PS_Scavenge], Time(ms), 114
[TOTAL_GC_TIME_%_PS_Scavenge], Time(%), 0.215435785017764
[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, 4
[TOTAL_GC_TIME], Time(ms), 114
[TOTAL_GC_TIME_%], Time(%), 0.215435785017764
[READ], Operations, 50322
[READ], AverageLatency(us), 1727.1597313302334
[READ], MinLatency(us), 182
[READ], MaxLatency(us), 2369535
[READ], 95thPercentileLatency(us), 603
[READ], 99thPercentileLatency(us), 1041
[READ], Return=OK, 50322
[CLEANUP], Operations, 6
[CLEANUP], AverageLatency(us), 972.6666666666666
[CLEANUP], MinLatency(us), 3
[CLEANUP], MaxLatency(us), 5783
[CLEANUP], 95thPercentileLatency(us), 5783
[CLEANUP], 99thPercentileLatency(us), 5783
[UPDATE], Operations, 49678
[UPDATE], AverageLatency(us), 3466.9299488707275
[UPDATE], MinLatency(us), 203
[UPDATE], MaxLatency(us), 4734975
[UPDATE], 95thPercentileLatency(us), 618
[UPDATE], 99thPercentileLatency(us), 1067
[UPDATE], Return=OK, 49678

结论分析:

当前的单核虚拟机,4个线程可以带来最大的0.5%update,0.5%read,线程数为4时候,吞吐量达到最大

tips:测试数据量一定要够大够多,也就是操作的次数和操作增删改查比例要设置大点,否则会有明显误差

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
你可以使用Java的多线程机制来实现MongoTemplate.bulkOps的多线程批量导入。 具体实现方式如下: 1. 创建一个MongoTemplate实例,用于访问MongoDB数据库。 2. 创建一个线程池,可以使用Java提供的ExecutorService来创建。推荐使用固定大小的线程池,可以根据系统资源和据量来设置线程池的大小。 3. 将据分成若干个批次,每个批次包含一定量的据。可以根据据量和系统资源来确定每个批次的大小。 4. 对于每个批次,创建一个新的线程来执行bulkOps操作。在线程中,使用MongoTemplate.bulkOps.insert方法将据插入到MongoDB中。 5. 执行完所有的线程后,关闭线程池和MongoTemplate实例。 下面是一个示例代码: ```java MongoTemplate mongoTemplate = ...; // 创建MongoTemplate实例 int batchSize = ...; // 每批次的据量 List<YourDataModel> dataList = ...; // 待导入的据列表 // 创建线程池 ExecutorService executorService = Executors.newFixedThreadPool(4); // 4为线程池大小 // 将据分成若干个批次,每个批次包含batchSize条据 List<List<YourDataModel>> batches = Lists.partition(dataList, batchSize); // 多线程批量导入据 for (List<YourDataModel> batch : batches) { executorService.execute(() -> { BulkOperations bulkOps = mongoTemplate.bulkOps(BulkOperations.BulkMode.UNORDERED, YourDataModel.class); bulkOps.insert(batch); bulkOps.execute(); }); } // 关闭线程池和MongoTemplate实例 executorService.shutdown(); mongoTemplate.destroy(); ``` 需要注意的是,bulkOps操作是异步的,因此在使用bulkOps.insert方法时,应该保证在执行bulkOps.execute方法之前,所有的据都已经插入到bulkOps中。可以在每个线程执行完bulkOps.insert方法后,调用bulkOps.execute方法来执行bulk操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值