MongoDB-非关系型数据库-文档数据库(四) YCSB测试MongoDB性能

一 YCSB 简介

YCSB(Yahoo! Cloud Serving Benchmark)是 Yahoo 研究院开源的键值/NoSQL 数据库性能基准测试框架,支持 Redis、MongoDB、HBase、Cassandra 等。

YCSB的工具原理主要包括工具模型、负载生成器和操作执行。

二 YCSB 测试

测试主要分为两个阶段:

load阶段:向数据库批量插入测试数据(纯insert);

**run阶段:**按照指定workload混合执行读、写、更新和查询操作,然后统计运行时间、吞吐量和延迟等。

三 六种核心workload

Workload 文件 操作分布 典型场景
A workloada 50% Read / 50% Update 会话存储,读写均衡
B workloadb 95% Read / 5% Update 照片标签,读多写少
C workloadc 100% Read 只读缓存,测纯读性能
D workloadd 95% Read / 5% Insert(Latest分布) 时间线,读最新记录
E workloade 95% Scan / 5% Insert 短范围扫描(如按 Thread ID)
F workloadf 50% Read / 50% Read-Modify-Write 用户记录读取并修改回写

加上开始的load操作(纯insert插入操作),一共算是7种workload。

四 workload举例

1 workloada:--5读5写

recordcount=1000

operationcount=1000

workload=site.ycsb.workloads.CoreWorkload

readproportion=0.5

updateproportion=0.5

scanproportion=0

insertproportion=0

requestdistribution=zipfian

2 workloadc: --100%读

recordcount=1000

operationcount=1000

workload=site.ycsb.workloads.CoreWorkload

readproportion=1

updateproportion=0

scanproportion=0

insertproportion=0

requestdistribution=zipfian

3 workloade: --95%scan5%insert

recordcount=1000

operationcount=1000

workload=site.ycsb.workloads.CoreWorkload

readproportion=0

updateproportion=0

scanproportion=0.95

insertproportion=0.05

requestdistribution=uniform

maxscanlength=100

scanlengthdistribution=uniform

五 YCSB 基本执行命令

本文是测试mongodb为例:

1. 加载数据(Load 阶段)

bin/ycsb.sh load mongodb \

-P workloads/workloada \

-p recordcount=100000 \

-p mongodb.url=mongodb://localhost:27017/ycsb \

-threads 8 \

-s

2. 运行压测(Run 阶段)

bin/ycsb.sh run mongodb \

-P workloads/workloada \

-p operationcount=1000000 \

-p mongodb.url=mongodb://localhost:27017/ycsb \

-threads 32 \

-target 10000 \

-s

六 YCSB测试结果

1 完整输出结果

OVERALL, RunTime(ms), 12560

OVERALL, Throughput(ops/sec), 7961.783439490446

TOTAL_GCS_G1_Young, 12

TOTAL_GC_TIME_G1_Young(ms), 45

TOTAL_GCS_G1_Old, 0

TOTAL_GC_TIME_G1_Old(ms), 0

READ, Operations, 62800

READ, AverageLatency(us), 112.35

READ, MinLatency(us), 18

READ, MaxLatency(us), 3654

READ, 95thPercentileLatency(us), 215

READ, 99thPercentileLatency(us), 489

READ, Return=OK, 62800

UPDATE, Operations, 62800

UPDATE, AverageLatency(us), 136.72

UPDATE, MinLatency(us), 22

UPDATE, MaxLatency(us), 4120

UPDATE, 95thPercentileLatency(us), 268

UPDATE, 99thPercentileLatency(us), 572

UPDATE, Return=OK, 62800

2 2个核心指标

RunTime(ms)

总压测耗时,单位毫秒; 整个 run/load 跑完一共花了多少时间;

Throughput(ops/sec)

整体吞吐量,每秒操作数; 性能第一指标,越高越好;

3 操作类型分段

READ\]/\[UPDATE\]/\[SCAN\]/\[INSERT

每个操作类型结构完全相同,以 READ 举例:

Operations

该操作总执行次数;

AverageLatency(us)

平均延迟,微秒;越小性能越好,代表单次数据库操作平均耗时

MinLatency(us)

最小单次延迟,最优情况

MaxLatency(us)

最大延迟,毛刺、慢查询峰值,这个值大代表存在长尾慢请求

95thPercentileLatency(us)

P95 延迟:95% 的请求延迟低于该数值,业务核心参考指标

99thPercentileLatency(us)

P99 延迟:99% 请求低于该值,衡量长尾延迟,数据库优化重点关注

Return=OK, xxx

成功操作总数;OK 数量≠Operations 代表有报错(超时、连接失败、数据库异常)

4 实际业务评判标准

吞吐量 Throughput

同等线程、同等数据量下数值越高,数据库并发能力越强;Mongo 集群分片可显著提升。

P95 / P99 延迟(最重要,比平均值靠谱)

平均值容易被大量快请求抹平,长尾慢请求只会体现在分位值;线上业务卡顿大多由 P99 延迟过高导致。

成功数 Return=OK

成功次数必须等于 Operations,不等说明压测报错:

Mongo 连接池耗尽

数据库超时、锁冲突

客户端参数配置过小

GC 耗时

GC 总时间占 RunTime 比例超过 5%,建议调大 JVM 堆 -Xms8g -Xmx8g