本文介绍应用 YCSB 对腾讯云数据库 MongoDB 进行性能测试的完整过程。
测试目标
说明:
MongoDB 数据结构灵活,使用场景复杂多变,很难覆盖到所有场景,最终性能表现建议根据业务实际模型进行测试。
对不同规格的 MongoDB 实例进行性能测试,包含2核4GB、4核8GB、6核16GB等。测试性能指标主要包含 throughput(ops/sec)每秒操作数、RAL(us) 平均读时延、WAL(us) 平均写时延等。
每一种实例规格测试场景如下所示:
50% read + 50% update:读更新比例依次为50%与50%。
95% read + 5% update:读更新比例依次为95%和5%。
5% read + 95% update:读更新比例依次为5%和95%。
100% insert:仅写入数据。
100% read:仅读取数据。
100% update:仅更新数据。
测试步骤
步骤1:远程连接 CVM 实例,下载 YCSB 工具。
1. 使用标准登录方式登录 CVM 实例。具体操作,请参见 登录服务器。
2. 在 CVM 上进行 YCSB 下载。
步骤2:加载基础测试数据至 MongoDB 数据库
使用 nohup 命令,在后台运行 YCSB 工具,使用配置文件 workloada,连接到指定的 MongoDB 集群,以同步模式加载数据到 test 集合中,并将输出记录到 loadlog.txt 文件中。具体参数解释如下所示。
执行命令分解 | 解释说明 |
nohup | Linux 命令通常用于运行需要长时间执行的后台进程,确保这些进程不会因为用户的注销或终端的关闭而中断。 |
./ycsb-0.17.0/bin/ycsb | YCSB 可执行文件路径。 |
load | YCSB 的子命令,用于加载数据到数据库。 |
mongodb | 指定要加载的数据库类型 MongoDB。 |
-s | 指定同步模式,即加载操作将在所有操作完成后才返回。 |
-P workloads/workloada | 指定要使用的 YCSB 工作负载配置文件,此处为 workloada。 |
-p mongodb.url=mongodb://mongouser:password@10.xx.xx.30:27017,10.xx.xx.28:27017,10.xx.xx.5:27017/admin?w=0 | 指定 MongoDB 的连接 URL 地址。 连接字符串包括用户名、密码、服务器地址和端口号。 w = 0表示写操作不需要确认,即不需要等待写操作的响应。 |
-p table=test | 指定在 MongoDB 中使用的集合名称为 test。 |
-threads 300 | |
-p recordcount=10000000 | |
>loadlog.txt & | 将命令的输出重定向到 loadlog.txt 文件,并且使用 & 将命令放入后台执行。 |
nohup ./ycsb-0.17.0/bin/ycsb load mongodb -s -P workloads/workloada-p mongodb.url=mongodb://mongouser:password@10.xx.xx.30:27017,10.xx.xx.28:27017,10.xx.xx.5:27017/admin?w=0 -p table=test -threads 300 -p recordcount=10000000>loadlog.txt &
步骤3:运行脚本,进行压测。
50%update+50%read
执行总共10,000,000次操作,其中50%为读取操作,50%为更新操作,不执行插入操作。在100个线程中并行执行,并将输出记录到 runlog.txt 文件中。其中,关键配置参数如下:
-p table=test: 指定在MongoDB中使用的集合名称。
-p recordcount=10000000: 指定数据库中记录的总数。
-p readproportion=0.5: 指定读取操作所占的比例,此处为50%。
-p updateproportion=0.5: 指定更新操作所占的比例,此处为50%。
-p insertproportion=0: 指定插入操作所占的比例,此处为0%,即不执行插入操作。
-p operationcount=100000: 指定要执行的操作总数。
-threads 100: 指定用于执行操作的线程数量。
>runlog.txt &: 将命令的输出重定向到 runlog.txt 文件,并且使用&将命令放入后台执行。
说明:
测试不同的实例规格,recordcount、operationcount、threads 均有差异。具体数据,请参见 测试结果。
-p operationcount=100000根据具体执行时间动态调整,需要保证执行时间在二十分钟以上,否则时间过短没有代表性。
?w=0
中的 w 表示 write concern。MongoDB写操作的确认级别,设置为0,表示写操作不需要等待服务器的确认。w:1(应答式写入)要求确认操作已经传播到指定的单个 mongod 实例或副本集主实例,缺省为1。
w:0(非应答式写入)不返回任何响应,所以无法知道写入是否成功,但对于尝试向已关闭的套接字写入或者网络故障会返回异常信息。
w:>1 该值用于设定写入节点的数目,包括主节点。
nohup ./ycsb-0.17.0/bin/ycsb run mongodb -s -P workloads/workloada -p mongodb.url=mongodb://mongouser: password @10.xx.xx.30:27017,10.xx.xx.28:27017,10.xx.xx.5:27017/admin?w=0 -p table=test -p recordcount=10000000 -p readproportion=0.5 -p updateproportion=0.5 -p insertproportion=0 -p operationcount=10000000 -threads 100 >runlog.txt &
95% update + 5% read
执行总共10,000,000次操作,其中95%为更新操作,5%为读取操作,不执行插入操作。在100个线程中并行执行,并将输出记录到 runlog.txt 文件中。
nohup ./ycsb-0.17.0/bin/ycsb run mongodb -s -P workloads/workloada -p mongodb.url=mongodb://mongouser: password @10.xx.xx.30:27017,10.xx.xx.28:27017,10.xx.xx.5:27017/admin?w=0 -p table=test -p recordcount=10000000 -p readproportion=0.05 -p updateproportion=0.95 -p insertproportion=0 -p operationcount=10000000 -threads 100 >runlog.txt &
5%update + 95%read
执行总共10,000,000次操作,其中5%为更新操作,95%为读取操作,不执行插入操作。在100个线程中并行执行,并将输出记录到 runlog.txt 文件中。
nohup ./ycsb-0.17.0/bin/ycsb run mongodb -s -P workloads/workloada -p mongodb.url=mongodb://mongouser: password @10.xx.xx.30:27017,10.xx.xx.28:27017,10.xx.xx.5:27017/admin?w=0 -p table=test -p recordcount=10000000 -p readproportion=0.95 -p updateproportion=0.05 -p insertproportion=0 -p operationcount=10000000 -threads 100 >runlog.txt &
100%insert
执行总共10,000,000次操作,100%插入操作,在100个线程中并行执行,并将输出记录到 runlog.txt 文件中。
nohup ./ycsb-0.17.0/bin/ycsb run mongodb -s -P workloads/workloadb -p mongodb.url=mongodb://mongouser: password @10.xx.xx.30:27017,10.xx.xx.28:27017,10.xx.xx.5:27017/admin?w=0 -p table=test -p recordcount=10000000 -p readproportion=0 -p updateproportion=0 -p insertproportion=1 -p operationcount=10000000 -threads 100 >runlog.txt &
100% read
执行总共10,000,000次操作,100%读操作,在100个线程中并行执行,并将输出记录到 runlog.txt 文件中。
nohup ./ycsb-0.17.0/bin/ycsb run mongodb -s -P workloads/workloadc -p mongodb.url=mongodb://mongouser: password @10.xx.xx.30:27017,10.xx.xx.28:27017,10.xx.xx.5:27017/admin?w=0 -p table=test -p recordcount=10000000 -p readproportion=1 -p updateproportion=0 -p insertproportion=0 -p operationcount=10000000 -threads 100 >runlog.txt &
100% update
执行总共10,000,000次操作,100% Update 操作,在100个线程中并行执行,并将输出记录到 runlog.txt 文件中。
nohup ./ycsb-0.17.0/bin/ycsb run mongodb -s -P workloads/workloadb -p mongodb.url=mongodb://mongouser: password @10.xx.xx.30:27017,10.xx.xx.28:27017,10.xx.xx.5:27017/admin?w=0 -p table=test -p recordcount=10000000 -p readproportion=0 -p updateproportion=1 -p insertproportion=0 -p operationcount=10000000 -threads 100 >runlog.txt &