CurveBS对接PFS测试实践

测试背景

1.1 测试组件架构

1.2 测试目标

本次测试对象为Postgreql 和pfs在以curvebs为底层存储时的稳定性、可靠性、性能测试。重点测试curvebs在异常情况下,上层pg的表现

2 测试准备

2.1 测试工具 benchmarksql

BenchmarkSQL:是一款经典的开源数据库测试工具,内嵌了TPCC测试脚本,可以对EnterpriseDB、PostgreSQL、MySQL、Oracle以及SQL Server等数据库直接进行测试

使用版本:5.0

2.2 压测工具 pgbench

pgbench :postgresql 自带提供了一款轻量级的压力测试工具,按自己的需求对数据库进行性能压力测试

版本:跟随pgsql

2.3 测试环境

2.3.1 主机信息

客户端配置为:

机器IP 配置 内核 可用域
10.182.26.25 CPU:Intel(R)Xeon(R)E5-2670v3@2.30GHz

内存:256GB

硬盘:2798GB|Linux 4.19.87-netease6-1

#2 SMP Mon Sep 7 07:50:31 UTC 2020 x86_64 GNU/Linux||CPU:Intel(R)Xeon(R)E5-2670v3@2.30GHz

内存:256GB

硬盘:2798GB|Linux 4.9.65-netease

#1 SMP Thu Jul 11 17:32:39 CST 2019 x86_64 GNU/Linux|pubbeta2|

curvebs物理节点:异常测试环境

curve版本: 1.2.0

磁盘调度策略:noop

操作系统内核版本:4.9.65-netease #1 SMP Thu Aug 2 03:02:48

存储节点个数: 6

硬盘型号:INTEL SSDSC2BB01

硬盘大小: 1.5T SSD

每个节点硬盘个数:20

2.3.2 curve卷大小

编号 卷类型 卷大小
1 curve 10T

挂载10T curve卷作为数据盘,关闭卷的 QOS 限制

2.3.4 软件环境

软件 版本
pfs 2.0.0
Postgreql POLARDB_11_STABLE

3 测试指标

性能指标 说明
tpmc 流量指标(Throughput,简称tpmC):按照TPC组织的定义,流量指标描述了系统在执行支付操作、订单状态查询、发货和库存状态查询这4种交易的同时,每分钟可以处理多少个新订单交易
Response time 每个请求的平均响应时间
TPS 每秒钟处理的事务数
read/write requests 用它除以总时间,得到吞吐量QPS
cpu% 注意宿主机与云主机的CPU占用率,是否cpu成为瓶颈
内存 注意宿主机与云主机的内存使用情况

4 测试要点

4.1 pgbench性能测试

主要测试结果:

测试场景 事务延迟平均 (curve) 事务延迟平均 (ceph) TPS (curve) TPS (ceph) 事务延迟平均 (curve条带化) TPS (curve条带化)
10000w数据16并发用户 4.712 ms 3.027 ms 3393.83 5285.65 2.410 ms 6639.28
10000w数据32并发用户 6.382 ms 4.318 ms 5014.27 7411.27 3.687 ms 8677.54
10000w数据64并发用户 9.817 ms 6.519 ms 6513.94 9816.15 5.912 ms 10824.06
10000w数据128并发用户 17.554 ms 13.958 ms 7289.05 9167.86 11.012 ms 11620.58
10000w数据256并发用户 36.463 ms 26.835 ms 6920.91 9535.27 26.581 ms 9625.85
测试场景 事务延迟平均 (curve条带化) 事务延迟平均 (ceph) TPS (curve条带化) TPS (ceph)
10000w数据16并发用户 2.410 ms 3.027 ms 6639.28 5285.65
10000w数据32并发用户 3.687 ms 4.318 ms 8677.54 7411.27
10000w数据64并发用户 5.912 ms 6.519 ms 10824.06 9816.15
10000w数据128并发用户 11.012 ms 13.958 ms 11620.58 9167.86
10000w数据256并发用户 26.581 ms 26.835 ms 9625.85 9535.27

详细测试过程见:

场景

描述 对数据库进行读写操作

初始化数据 10000w :pgbench -i -s 1000
测试策略 1.执行读写测试

16并发16线程 : pgbench -M prepared -r -P 1 -c 16 -j 16 -T 300 pgbench

32并发32线程:pgbench -M prepared -r -P 1 -c 32 -j 32 -T 300 pgbench

64并发64线程:pgbench -M prepared -r -P 1 -c 64 -j 64 -T 300 pgbench

128并发128线程:pgbench -M prepared -r -P 1 -c 128 -j 128 -T 300 pgbench

256并发256线程:pgbench -M prepared -r -P 1 -c 256 -j 256 -T 300 pgbench


参数值 -c :客户端并发数

-j : 线程数

-T : benchmark测试时间 300s

scale: 测试数据量 ×10万

range : 活跃数据量
备注 为保证测试数据的可靠性。每个场景测试至少执行2轮。

4.2 benchmarksql测试

主要测试结果:

配置参数 tpmc (curve) tmpc (ceph) tpmtotal (curve) tpmtotal (ceph)
warehouse=10,loadWorkers=10

terminals=10|14471.6|13761.2|32132.78|30787.0|
|warehouse=20,loadWorkers=20

terminals=50|25289.76|20971.92|56096.81|46643.21|
|warehouse=10,loadWorkers=100

terminals=50|29684.1|21320.66|65954.55|47420.65|
|warehouse=10,loadWorkers=50

terminals=50|26177.03|22091.9|57989.95|49161.07|

配置文件重要参数如下:

1)warehouse:

BenchmarkSQL数据库每个warehouse大小大概是100MB,如果该参数设置为10,那整个数据库的大小大概在1000MB。

建议将数据库的大小设置为服务器物理内存的2-5倍,如果服务器内存为16GB,那么warehouse设置建议在328~819之间。

2)terminals:

terminals指的是并发连接数,建议设置为服务器CPU总线程数的2-6倍。

如果服务器为双核16线程(单核8线程),那么建议配置在32~96之间。

配置文件详解:

1.db=mysql //数据库类型,postgres/oracle/mysql/firebird/goldilocks

2.driver=org.mariadb.jdbc.Driver //客户端驱动

conn=jdbc:mysql://...:3306/bmsdb //mysql数据库连接字符串

user=bms //数据库登录用户名,需要我们提前在数据库中建立benchmarksql用户

password=bms //如上用户密码

warehouses=20

loadWorkers=20

terminals=50

//To run specified transactions per terminal- runMins must equal zero

runTxnsPerTerminal=0

//To run for specified minutes- runTxnsPerTerminal must equal zero

runMins=5

//Number of total transactions per minute

limitTxnsPerMin=0

场景

benchmarksql测试
测试策略 1.创建配置文件

warehouse 设置为 10

loadWorkers=10

terminals=10

2.执行读写测试

./runBenchmark.sh props.pg

3、结果


参数值 warehouses=10

loadWorkers=10

terminals=10
备注 为保证测试数据的可靠性。每个场景测试至少执行2轮。

场景

描述 benchmarksql测试
测试策略 1.创建配置文件

warehouse 设置为 20

loadWorkers=20

terminals=50

2.执行读写测试

./runBenchmark.sh props.pg

3、结果


参数值 warehouses=20

loadWorkers=20

terminals=50
备注 为保证测试数据的可靠性。每个场景测试至少执行2轮。

场景

描述 benchmarksql测试
测试策略 1.创建配置文件

warehouse 设置为 10

loadWorkers=100

terminals=50

2.执行读写测试

./runBenchmark.sh props.pg

3、结果


参数值 warehouses=10

loadWorkers=100

terminals=50
备注 为保证测试数据的可靠性。每个场景测试至少执行2轮。

场景

描述 benchmarksql测试
测试策略 1.创建配置文件

warehouse 设置为 10

loadWorkers=50

terminals=50

2.执行读写测试

./runBenchmark.sh props.pg

3、结果


参数值 warehouses=10

loadWorkers=50

terminals=50
备注 为保证测试数据的可靠性。每个场景测试至少执行2轮。

4.3 稳定性测试

三个client节点,其中一个进行pgbench读写测试:

场景

描述 对数据库进行读写操作

初始化数据 10 亿:pgbench -i -s 10000
测试策略 1. 创建读写脚本rw.sql

\set aid random_gaussian(1, :range, 10.0)

\set bid random(1, 1 * :scale)

\set tid random(1, 10 * :scale)

\set delta random(-5000, 5000)

BEGIN;

UPDATE pgbench_accounts SET abalance = abalance + :delta WHERE aid = :aid;

SELECT abalance FROM pgbench_accounts WHERE aid = :aid;

UPDATE pgbench_tellers SET tbalance = tbalance + :delta WHERE tid = :tid;

UPDATE pgbench_branches SET bbalance = bbalance + :delta WHERE bid = :bid;

INSERT INTO pgbench_history (tid, bid, aid, delta, mtime) VALUES (:tid, :bid, :aid, :delta, CURRENT_TIMESTAMP); END;

2.执行读写测试

总数据量 10 亿,热数据量随机选择1亿,5亿,10亿。反复执行

pgbench -M prepared -v -r -P 1 -f ./rw.sql -c 64 -j 64 -T 3600 -D scale=1000000 -D range=10000000

pgbench -M prepared -v -r -P 1 -f ./rw.sql -c 64 -j 64 -T 3600 -D scale=1000000 -D range=500000000

pgbench -M prepared -v -r -P 1 -f ./rw.sql -c 64 -j 64 -T 3600 -D scale=1000000 -D range=1000000000
参数值 -c :客户端并发数64

-j : 线程数 64

-T : benchmark测试时间 3600s

scale: 测试数据量 ×10万

range : 活跃数据量
备注 为保证测试数据的可靠性。每个场景测试至少执行2轮。

另外一个进行只读测试:

场景

描述 对数据库进行只读操作

初始化数据 10 亿:pgbench -i -s 10000
测试策略 1. 创建只读脚本ro.sql

\set aid random_gaussian(1, :range, 10.0)

SELECT abalance FROM pgbench_accounts WHERE aid = :aid;

2.执行只读测试

总数据量 10 亿,热数据 1 亿

pgbench -M prepared -v -r -P 1 -f ./ro.sql -c 32 -j 32 -T 120 -D scale=10000 -D range=1000000

总数据量 10 亿,热数据 5 亿

pgbench -M prepared -n -r -P 1 -f ./ro.sql -c 32 -j 32 -T 120 -D scale=10000 -D range=5000000

总数据量 10 亿,热数据 10 亿

pgbench -M prepared -n -r -P 1 -f ./ro.sql -c 32 -j 32 -T 120 -D scale=10000 -D range=10000000
参数值 -c :客户端并发数32

-j : 线程数 32

-T : benchmark测试时间 120s

scale: 测试数据量 ×10万

range : 活跃数据量
备注 为保证测试数据的可靠性。每个场景测试至少执行2轮。

4.4 异常测试

稳定性测试方法的同时,进行如下异常测试:

用例名称 预期结果 测试结果
关闭任一chunkserver io短暂卡顿 无影响
启动任一chunkserver 无影响 无影响
重启任一chunkserver io短暂卡顿 无影响
关闭任一节点所有chunkserver io短暂卡顿 短暂掉0
启动任一节点所有chunkserver 无影响 无影响
重启任一节点所有chunkserver io短暂卡顿 短暂掉0
关闭mds 影响管理面功能,io无影响 无影响
启动mds 无影响 无影响
重启mds 短暂影响管理面功能,io无影响 无影响
2个节点各关闭1个chunkserver服务 部分io持续hang 可恢复
2个节点各启动1个chunkserver服务 io恢复 可恢复
2个节点各重启1个chunkserver服务 部分io持续hang ,然后恢复 短暂掉0
chunkserver进程hang等服务异常 io短暂卡顿 无影响
mds进程hang等服务异常 管理面受影响,io无影响 无影响
机器宕机,整机设置pendding 目前可能会有30秒到2分钟的卡顿,需要优化 性能下降
所有mds进程异常重启 恢复后可正常挂卸载,io恢复 恢复后io正常
所有etcd进程异常重启 恢复后可正常挂卸载,io恢复 恢复后io正常
一个mds节点宕机 可正常挂卸载,无io卡顿 无影响
一个etcd节点宕机 可正常挂卸载,无io卡顿 无影响
killall chunkserver,快速启动所有chunkserver模拟演练升级 killall chunkserver后挂卸载异常、io阻塞;chunkserver恢复后能快速恢复 正常恢复
pendding迁移中触发pfs一次全表扫描 扫描正常 扫描正常
1 个赞