1 Sysbench-mongodb 说明
可以使用sysbench-mongodb 对MongoDB 进行性能测试:
https://github.com/tmcallaghan/sysbench-mongodb
https://gitee.com/mirrors/sysbench-mongodb
默认情况下,benchmark 会创建10个集合,每个集合100万的数据。 可以根据具体的资源情况,修改配置文件:config.bash。
2 操作示例
2.1 下载sysbench-mongodb
[dave@www.cndba.cn_2 ~]# git clone https://github.com/tmcallaghan/sysbench-mongodb.git
Cloning into 'sysbench-mongodb'...
remote: Enumerating objects: 132, done.
remote: Counting objects: 100% (39/39), done.
remote: Compressing objects: 100% (28/28), done.
remote: Total 132 (delta 18), reused 24 (delta 10), pack-reused 93
Receiving objects: 100% (132/132), 72.26 KiB | 0 bytes/s, done.
Resolving deltas: 100% (61/61), done.
[dave@www.cndba.cn_2 ~]# ll
total 8
-rw-------. 1 root root 1431 May 14 2020 anaconda-ks.cfg
-rw------- 1 root root 2707 May 4 16:17 nohup.out
drwxr-xr-x 4 root root 182 May 13 09:26 sysbench-mongodb
[dave@www.cndba.cn_2 ~]# cd sysbench-mongodb/
[dave@www.cndba.cn_2 sysbench-mongodb]# ll
total 40
-rwxr-xr-x 1 root root 49 May 13 09:26 check-results.bash
-rw-r--r-- 1 root root 4805 May 13 09:26 config.bash
-rw-r--r-- 1 root root 11357 May 13 09:26 LICENSE
-rw-r--r-- 1 root root 1892 May 13 09:26 README.md
-rwxr-xr-x 1 root root 3705 May 13 09:26 run.looped.bash
-rwxr-xr-x 1 root root 3022 May 13 09:26 run.simple.bash
drwxr-xr-x 2 root root 71 May 13 09:26 src
-rw-r--r-- 1 root root 124 May 13 09:26 TODO
[dave@www.cndba.cn_2 sysbench-mongodb]# pwd
/root/sysbench-mongodb
[dave@www.cndba.cn_2 sysbench-mongodb]#
2.2 准备工作
使用sysbench-mongodb 有如下要求:
- Java 版本要求17
- 下载mongoDB Java 驱动要求 3.9.1,并放到当前目录(sysbench-mongodb)下。
- 修改配置文件:config.bash
[dave@www.cndba.cn_2 sysbench-mongodb]# yum install java-1.7.0-openjdk*
2.3 修改配置文件:config.bash
[dave@www.cndba.cn_2 sysbench-mongodb]# cat config.bash
# You will most likely want to change these values
# database in which to run the benchmark
export DB_NAME=admin
# database username on DB_NAME
export USERNAME=root
# database password to use for USERNAME
export PASSWORD=root
# name of the server to connect to
#export MONGO_SERVER="172.31.185.120:27017,172.31.185.165:27017,172.31.185.131"
export MONGO_SERVER="172.31.185.165"
# port of the server to connect to
export MONGO_PORT=27017
……
# total number of simultaneous insertion threads (for loader)
# valid values : integer > 0
export NUM_LOADER_THREADS=10
# total number of simultaneous benchmark threads
# valid values : integer > 0
export NUM_WRITER_THREADS=32
……
这里几个重要的参数如下:
NUM_COLLECTIONS=8 #集合数量
NUM_DOCUMENTS_PER_COLLECTION=1000000 #每集合的文档数量
NUM_DOCUMENTS_PER_INSERT=1000 #每次Insert多少个文档
NUM_LOADER_THREADS=8 #Loaddata时的进程数量
RUN_TIME_MINUTES=10 #负载测试运行多少分钟
NUM_SECONDS_PER_FEEDBACK=10 #每次输出的间隔秒数
MONGO_SERVER=localhost #mongodb服务器
MONGO_PORT=27017 #mongodb端口号
SYSBENCH_READ_ONLY=N #是否只读测试
但是在实际测试中发现:
1. DB_NAME 只能是admin,否则认证时会报如下错误:
Thread[main,5,main] connection string = mongodb://cndba:cndba@172.31.185.165:27017/admin?ssl=false&replicaSet=rs0&readpreference=primary
2. 只能测试名称为:‘rs0’ 的副本集,不支持Shard Cluster,否则会报如下错误:
SEVERE: Expecting replica set member, but found a SHARD_ROUTER.
SEVERE: Expecting replica set member from set 'rs0', but found one from set 'shard1'.
3. MONGO_SERVER 写Primary 的IP 即可。
4. 这里insert 的时间是根据数据量来的,默认是100w,每秒insert 1000条数据,所以insert 就需要10十分钟。 RUN_TIME_MINUTES 只是针对压完数据之后的测试。 如果不想等很长时间,可以修改数据量大小。
2.4 执行压测命令
如果只有一个config.bash配置文件,可以直接执行
./run.simple.bash
如果有多个文件,可以在命令后面指定参数文件:
./run.simple.bash my_custom_config.bash
[dave@www.cndba.cn_2 sysbench-mongodb]# ./run.simple.bash
Loading config from config.bash.....
Note: src/jmongosysbenchload.java uses or overrides a deprecated API.
Note: Recompile with -Xlint:deprecation for details.
Note: src/jmongosysbenchexecute.java uses or overrides a deprecated API.
Note: Recompile with -Xlint:deprecation for details.
Do query at Fri May 13 11:44:33 CST 2022
Thread[main,5,main]Application Parameters
Thread[main,5,main]-------------------------------------------------------------------------------------------------
Thread[main,5,main] collections = 10
Thread[main,5,main] database name = admin
Thread[main,5,main] writer threads = 4
Thread[main,5,main] documents per collection = 1,000,000
Thread[main,5,main] feedback seconds = 10
Thread[main,5,main] log file = mongoSysbenchExecute-10-1000000-4.txt.tsv
Thread[main,5,main] auto commit = Y
Thread[main,5,main] run seconds = 600
Thread[main,5,main] oltp range size = 100
Thread[main,5,main] oltp point selects = 10
Thread[main,5,main] oltp simple ranges = 1
Thread[main,5,main] oltp sum ranges = 1
Thread[main,5,main] oltp order ranges = 1
Thread[main,5,main] oltp distinct ranges = 1
Thread[main,5,main] oltp index updates = 1
Thread[main,5,main] oltp non index updates = 1
Thread[main,5,main] oltp inserts = 1
Thread[main,5,main] write concern = ACKNOWLEDGED
Thread[main,5,main] maximum tps (global) = 999999
Thread[main,5,main] maximum tps (per thread) = 250000
Thread[main,5,main] Server:Port = 172.31.185.165:27017
Thread[main,5,main] seed = 1652413470
Thread[main,5,main] userName = root
Thread[main,5,main] read preference = secondaryPreferred
Thread[main,5,main] use SSL = false
May 13, 2022 11:44:34 AM com.mongodb.diagnostics.logging.JULLogger log
INFO: Cluster created with settings {hosts=[172.31.185.165:27017], mode=MULTIPLE, requiredClusterType=REPLICA_SET, serverSelectionTimeout='30000 ms', maxWaitQueueSize=20480, requiredReplicaSetName='rs0'}
May 13, 2022 11:44:34 AM com.mongodb.diagnostics.logging.JULLogger log
INFO: Adding discovered server 172.31.185.165:27017 to client view of cluster
May 13, 2022 11:44:34 AM com.mongodb.diagnostics.logging.JULLogger log
INFO: No server chosen by com.mongodb.client.internal.MongoClientDelegate$1@34704d9 from cluster description ClusterDescription{type=REPLICA_SET, connectionMode=MULTIPLE, serverDescriptions=[ServerDescription{address=172.31.185.165:27017, type=UNKNOWN, state=CONNECTING}]}. Waiting for 30000 ms before timing out
May 13, 2022 11:44:34 AM com.mongodb.diagnostics.logging.JULLogger log
INFO: Opened connection [connectionId{localValue:1, serverValue:16}] to 172.31.185.165:27017
May 13, 2022 11:44:34 AM com.mongodb.diagnostics.logging.JULLogger log
INFO: Monitor thread successfully connected to server with description ServerDescription{address=172.31.185.165:27017, type=REPLICA_SET_SECONDARY, state=CONNECTED, ok=true, version=ServerVersion{versionList=[5, 0, 8]}, minWireVersion=0, maxWireVersion=13, maxDocumentSize=16777216, logicalSessionTimeoutMinutes=30, roundTripTimeNanos=4914819, setName='rs0', canonicalAddress=172.31.185.165:27017, hosts=[172.31.185.120:27017, 172.31.185.131:27017, 172.31.185.165:27017], passives=[], arbiters=[], primary='172.31.185.131:27017', tagSet=TagSet{[]}, electionId=null, setVersion=3, lastWriteDate=Fri May 13 11:44:33 CST 2022, lastUpdateTimeNanos=758032504530000}
May 13, 2022 11:44:34 AM com.mongodb.diagnostics.logging.JULLogger log
INFO: Adding discovered server 172.31.185.120:27017 to client view of cluster
May 13, 2022 11:44:34 AM com.mongodb.diagnostics.logging.JULLogger log
INFO: Adding discovered server 172.31.185.131:27017 to client view of cluster
May 13, 2022 11:44:34 AM com.mongodb.diagnostics.logging.JULLogger log
……
Thread[Thread-1,5,main]7,834,000 inserts : 790 seconds : cum ips=9,916.36 : int ips=5,929.65
Thread[Thread-1,5,main]7,885,000 inserts : 800 seconds : cum ips=9,855.61 : int ips=5,077.66
Thread[Thread-1,5,main]7,945,000 inserts : 810 seconds : cum ips=9,807.96 : int ips=5,997.60
Thread[Thread-1,5,main]7,997,000 inserts : 820 seconds : cum ips=9,751.39 : int ips=5,183.41
Thread[Thread-1,5,main]8,053,000 inserts : 830 seconds : cum ips=9,702.12 : int ips=5,635.50
Thread[Thread-1,5,main]8,102,000 inserts : 840 seconds : cum ips=9,644.26 : int ips=4,870.78
Thread[Thread-1,5,main]8,154,000 inserts : 850 seconds : cum ips=9,592.74 : int ips=5,235.08
Thread[Thread-1,5,main]8,207,000 inserts : 860 seconds : cum ips=9,542.41 : int ips=5,280.46
……
************************************************************************
final interval(s)
************************************************************************
Thread[Thread-2,5,main]Writer thread 1 : started
Thread[Thread-3,5,main]Writer thread 2 : started
Thread[Thread-4,5,main]Writer thread 3 : started
Thread[Thread-5,5,main]10 seconds : cum tps=158.50 : int tps=158.50 : cum ips=0.00 : int ips=0.00 : writers=4
Thread[Thread-5,5,main]20 seconds : cum tps=211.44 : int tps=264.19 : cum ips=0.00 : int ips=0.00 : writers=4
Thread[Thread-5,5,main]30 seconds : cum tps=226.47 : int tps=256.73 : cum ips=0.00 : int ips=0.00 : writers=4
Thread[Thread-5,5,main]40 seconds : cum tps=225.70 : int tps=223.40 : cum ips=0.00 : int ips=0.00 : writers=4
Thread[Thread-5,5,main]50 seconds : cum tps=233.56 : int tps=264.83 : cum ips=0.00 : int ips=0.00 : writers=4
Thread[Thread-5,5,main]60 seconds : cum tps=237.31 : int tps=256.00 : cum ips=0.00 : int ips=0.00 : writers=4
Thread[Thread-5,5,main]70 seconds : cum tps=242.06 : int tps=270.80 : cum ips=0.00 : int ips=0.00 : writers=4
Thread[Thread-5,5,main]80 seconds : cum tps=247.39 : int tps=284.78 : cum ips=0.00 : int ips=0.00 : writers=4
Thread[Thread-5,5,main]90 seconds : cum tps=249.60 : int tps=267.26 : cum ips=0.00 : int ips=0.00 : writers=4
Thread[Thread-5,5,main]100 seconds : cum tps=250.68 : int tps=260.34 : cum ips=0.00 : int ips=0.00 : writers=4
Thread[Thread-5,5,main]110 seconds : cum tps=253.63 : int tps=283.29 : cum ips=0.00 : int ips=0.00 : writers=4
Thread[Thread-5,5,main]120 seconds : cum tps=249.93 : int tps=209.13 : cum ips=0.00 : int ips=0.00 : writers=4
Thread[Thread-5,5,main]130 seconds : cum tps=252.19 : int tps=279.40 : cum ips=0.00 : int ips=0.00 : writers=4
Thread[Thread-5,5,main]140 seconds : cum tps=253.58 : int tps=271.61 : cum ips=0.00 : int ips=0.00 : writers=4
Thread[Thread-5,5,main]150 seconds : cum tps=255.14 : int tps=276.88 : cum ips=0.00 : int ips=0.00 : writers=4
Thread[Thread-5,5,main]160 seconds : cum tps=253.55 : int tps=229.46 : cum ips=0.00 : int ips=0.00 : writers=4
Fri May 13 11:47:16 CST 2022 | sysbench benchmark duration = 00:00:02:43
参数说明:
- cum tps: 是总体的平均每秒事务数量 ,也就是总事务/秒数
- int tps :增量的平均每秒事务数量,也就是本次10秒内的平均每秒事务数量
- cum ips: 是总体的平均每秒insert数量 ,也就是总inserts/秒数
- int ips :增量平均每秒insert数量,也就是本次10秒内的平均每秒insert数量
注意,这里只有开启DOLOAD=YES 才会有insert 数据,并且是分开测试的。 如果不想等很久,调小每个集合的数据量:
Thread[Thread-1,5,main]710,000 inserts : 20 seconds : cum ips=35,422.07 : int ips=43,042.04
Thread[Thread-1,5,main]1,057,000 inserts : 30 seconds : cum ips=35,195.79 : int ips=34,741.69
Thread[Thread-1,5,main]1,293,000 inserts : 40 seconds : cum ips=32,308.04 : int ips=23,625.99
Thread[Thread-1,5,main]1,526,000 inserts : 50 seconds : cum ips=30,459.08 : int ips=23,117.37
Thread[Thread-1,5,main]1,736,000 inserts : 60 seconds : cum ips=28,915.98 : int ips=21,135.27
如果要重复测试,需要先删除旧数据
rs0:PRIMARY> show tables
sbtest1
sbtest10
sbtest2
sbtest3
sbtest4
sbtest5
sbtest6
sbtest7
sbtest8
sbtest9
system.keys
system.users
system.version
rs0:PRIMARY> db.sbtest1.drop()
true
其实开始是用32个写进程测试的,但是直接把primary 进程搞挂了,后来改成4个,才稳定运行:
Thread[Thread-33,5,main]360 seconds : cum tps=402.66 : int tps=462.67 : cum ips=0.00 : int ips=0.00 : writers=32
Thread[Thread-33,5,main]370 seconds : cum tps=404.62 : int tps=475.03 : cum ips=0.00 : int ips=0.00 : writers=32
Thread[Thread-33,5,main]380 seconds : cum tps=406.37 : int tps=471.26 : cum ips=0.00 : int ips=0.00 : writers=32
Thread[Thread-33,5,main]390 seconds : cum tps=407.20 : int tps=438.74 : cum ips=0.00 : int ips=0.00 : writers=32
Thread[Thread-33,5,main]400 seconds : cum tps=408.05 : int tps=441.14 : cum ips=0.00 : int ips=0.00 : writers=32
Thread[Thread-33,5,main]410 seconds : cum tps=408.96 : int tps=445.25 : cum ips=0.00 : int ips=0.00 : writers=32
Thread[Thread-33,5,main]420 seconds : cum tps=410.46 : int tps=471.97 : cum ips=0.00 : int ips=0.00 : writers=32
Thread[Thread-33,5,main]430 seconds : cum tps=411.59 : int tps=459.15 : cum ips=0.00 : int ips=0.00 : writers=32
Thread[Thread-33,5,main]440 seconds : cum tps=412.48 : int tps=450.76 : cum ips=0.00 : int ips=0.00 : writers=32
Thread[Thread-33,5,main]450 seconds : cum tps=413.52 : int tps=459.08 : cum ips=0.00 : int ips=0.00 : writers=32
Thread[Thread-33,5,main]460 seconds : cum tps=414.62 : int tps=463.99 : cum ips=0.00 : int ips=0.00 : writers=32
Thread[Thread-33,5,main]470 seconds : cum tps=414.60 : int tps=413.77 : cum ips=0.00 : int ips=0.00 : writers=32
Thread[Thread-33,5,main]480 seconds : cum tps=415.53 : int tps=459.32 : cum ips=0.00 : int ips=0.00 : writers=32
Thread[Thread-33,5,main]490 seconds : cum tps=416.78 : int tps=476.92 : cum ips=0.00 : int ips=0.00 : writers=32
Thread[Thread-33,5,main]500 seconds : cum tps=417.81 : int tps=467.80 : cum ips=0.00 : int ips=0.00 : writers=32
Thread[Thread-33,5,main]510 seconds : cum tps=417.50 : int tps=401.90 : cum ips=0.00 : int ips=0.00 : writers=32
Thread[Thread-33,5,main]520 seconds : cum tps=418.36 : int tps=462.20 : cum ips=0.00 : int ips=0.00 : writers=32
Thread[Thread-33,5,main]530 seconds : cum tps=419.24 : int tps=465.14 : cum ips=0.00 : int ips=0.00 : writers=32
Thread[Thread-33,5,main]540 seconds : cum tps=419.86 : int tps=453.06 : cum ips=0.00 : int ips=0.00 : writers=32
版权声明:本文为博主原创文章,未经博主允许不得转载。