前言
SYSBENCH 是一个开源的多线程性能测试工具,广泛用于评估系统、数据库和硬件的性能。它支持多种测试模式,如 CPU、内存、磁盘 I/O 和数据库基准测试。凭借其灵活性和易用性,SYSBENCH 能帮助用户快速识别性能瓶颈,优化系统效率,是系统管理员和开发者的理想选择。
本篇博客主要介绍怎么使用 SYSBENCH 进行 DM 达梦数据库的编译测试,相应的 SYSBENCH 官方版本包需要联系达梦数据库人员进行获取。
sysbench 编译安装
目前的硬件架构主要为 ARM 以及 X86 ,不同的架构下的 sysbench 工具无法共用来着。
- 必要插件的安装,DM 达梦数据库的安装就不再列入
## root 权限
yum -y install make automake libtool pkgconfig libaio-devel
## 如果需要支持 MySQL 压测
yum -y install openssl-devel mysql-devel
## 如果需要支持 PostgreSQL 压测
yum -y install postgresql-devel
- 进行环境检查并生成配置脚本
cd /home/dmdba/sysbench-master-dpi
## 删除之前遗留的 Makefile 其他的Makefile.am、Makefile.in 需要保留
chmod +x *
rm Makefile
## 检查环境并生成配置脚本,普通用户即可
./autogen.sh
- 开始编译
## 加入环境变量
export DM_HOME="/home/dmdba/dmdbms"
## ARM 版本编译 (仅 DM 数据库)
./configure --without-mysql --without-pgsql --with-dm --build=aarch64-unknown-linux-gnu
## X86 版本编译 (仅 DM 数据库)
./configure --without-mysql --without-pgsql --with-dm
- 需要使用 root
## 清空旧缓存
make clean
## 进行编译 make VERBOSE=2 可追踪错误信息
make && make install
sysbench 常用介绍
- 常用选项
选项 | 描述 | 默认值 |
---|---|---|
–threads | 创建1的工作线程总数 | 1 |
–events | 请求总数的限制。0(默认值)表示没有限制 | 0 |
–time | 总执行时间限制,以秒为单位。0表示不限制 | 10 |
–warmup-time | 预热时间 | 0 |
–rate | 这个数字指定了所有线程平均每秒钟应该执行多少事件(事务)。0表示无限速率,即事件以尽可能快的速度执行 | 0 |
–thread-init-timeout | 工作线程初始化的等待时间,单位为秒 | 30 |
–thread-stack-size | 每个线程的堆栈大小 | 32k |
–report-interval | 以间隔时间为秒定期上报中间统计信息。0禁用中间报告 | 0 |
–debug | 打印更多的调试信息 | off |
–validate | 在可能的情况下对测试结果进行验证 | off |
–verbosity | 详细级别(0 -只有关键消息,5 -调试) | 4 |
–percentile | sysbench测量所有已处理请求的执行时间,以显示最小、平均和最大执行时间等统计信息。 | 95 |
- 命令测试帮助
## 内存帮助
sysbench memory help
- 对应测试
lua 选项 | 说明 | SQL类型 | SQL语句 |
---|---|---|---|
oltp_sum_ranges | sum 测试 | sum_ranges | SELECT SUM(k) FROM sbtest100 WHERE id BETWEEN ? AND ? |
select_random_points、oltp_point_select | 随机等值查询测试 等值查询测试 | point_selects | SELECT c FROM sbtest100 WHERE id=? |
select_random_ranges | 随机范围查询测试 | simple_ranges | SELECT c FROM sbtest100 WHERE id BETWEEN ? AND ? |
oltp_insert | 简单插入测试 | inserts_ignore | INSERT IGNORE INTO sbtest100 (id, k, c, pad) VALUES (?, ?, ?, ?) |
bulk_insert | 批量插入测试 | inserts_ignore | INSERT INTO sbtest (id, k, c, pad) VALUES (?, ?, ?, ?), (?, ?, ?, ?), …; |
oltp_update_index | 带索引的更新测试 | index_updates | UPDATE sbtest100 SET k=k+1 WHERE id=? |
oltp_update_non_index | 不带索引的更新测试 | non_index_updates | UPDATE sbtest100 SET c=? WHERE id=? |
oltp_delete | delete删除测试 | deletes | DELETE FROM sbtest100 WHERE id=? |
oltp_read_only | 只读测试 | 随机选择 | SELECT c FROM sbtest WHERE id = ?; SELECT id, k, c, pad FROM sbtest WHERE id BETWEEN ? AND ?; SELECT COUNT(*) FROM sbtest; SELECT c FROM sbtest WHERE id BETWEEN ? AND ? ORDER BY c; SELECT DISTINCT c FROM sbtest WHERE id BETWEEN ? AND ? ORDER BY c; SELECT c FROM sbtest WHERE id BETWEEN ? AND ?; SELECT id, c FROM sbtest WHERE id BETWEEN ? AND ? ORDER BY c; SELECT k FROM sbtest WHERE c = ? ORDER BY k; SELECT k FROM sbtest WHERE c BETWEEN ? AND ? ORDER BY k; |
oltp_read_write | 读写测试 | 随机选择 | "SELECT c FROM sbtest WHERE id = ?; SELECT id, k, c, pad FROM sbtest WHERE id BETWEEN ? AND ?; UPDATE sbtest SET k = k + 1 WHERE id = ?; INSERT INTO sbtest (id, k, c, pad) VALUES (?, ?, ?, ?); DELETE FROM sbtest WHERE id = ?; |
sysbench 基准测试
- CPU 性能测试
## ARM 20W , X86 10W
sysbench --time=60 --threads=64 --report-interval=3 cpu --cpu-max-prime=10000 run
服务器测试参考(events per second)
线程 | 华为鲲鹏 | Intel X86 | 海光 X86 |
---|---|---|---|
1 | 3218 | 2421 | 1168 |
32 | 105620 | 77493 | 37347 |
64 | 211718 | 98770 | 73825 |
128 | 213936 | 99124 | 74327 |
256 | 213438 | 99213 | 74350 |
- 内存测试
## 32204.63 MiB/sec
sysbench --time=60 --threads=10 --events=10000000 memory --memory-block-size=8k --memory-total-size=100T --memory-access-mode=seq run
服务器测试参考(MiB/sec)
线程 | 华为鲲鹏 | Intel X86 | 海光 X86 |
---|---|---|---|
1 | 8879 | 7838 | 5219 |
32 | 39864 | 6135 | 2897 |
64 | 46905 | 6332 | 2815 |
128 | 53654 | 7018 | 3467 |
256 | 56272 | 7827 | 4224 |
DM 基准测试
- 通用指标
指标名称 | 指标说明 |
---|---|
TPS(Transactions per Second) | 每秒处理事务数 |
QPS(Query per Second) | 每秒查询数 |
Latency | 时延(最小值、平均值、最大值) |
P95 | 95%SQL语句执行平均时长 |
- 数据准备
sysbench oltp_insert.lua --tables=8 --table-size=500000 --db-driver=dm --dm-db=172.16.1.163:5238 --dm-user=SYSDBA --dm-password=SYSDBA --auto-inc=off --threads=32 --time=300 --report-interval=1 prepare
- 单点查询测试
sysbench oltp_point_select.lua --tables=8 --db-driver=dm --dm-db=172.16.1.163:5236 --dm-user=SYSDBA --dm-password=SYSDBA --table_size=10000000 --events=0 --time=60 --threads=128 --warmup-time=60 --report-interval=5 run
- 插入性能测试
## report-interval 間隔多少秒打印一次
sysbench oltp_insert.lua --tables=8 --table-size=500000 --db-driver=dm --dm-db=172.16.1.163:5238 --dm-user=SYSDBA --dm-password=SYSDBA --auto-inc=off --threads=32 --time=300 --report-interval=1 run
- 清理数据
sysbench oltp_insert.lua --tables=8 --table-size=500000 --db-driver=dm --dm-db=172.16.1.163:5238 --dm-user=SYSDBA --dm-password=SYSDBA --auto-inc=off --threads=32 --time=300 --report-interval=1 cleanup
其他产品基准测试
PG 测试命令
- 数据准备
sysbench --db-driver=pgsql --pgsql-host=172.16.1.164 --pgsql-port=5432 --pgsql-user=swuser --pgsql-password='='********'' --pgsql-db=swtest --report-interval=3 --threads=128 --db-ps-mode=disable --percentile=99 --auto_inc=on --tables=10 --table_size=500000 --time=360 oltp_insert.lua prepare
- 插入测试
sysbench --db-driver=pgsql --pgsql-host=172.16.1.164 --pgsql-port=5432 --pgsql-user=swuser --pgsql-password='********' --pgsql-db=swtest --report-interval=3 --threads=128 --db-ps-mode=disable --percentile=99 --auto_inc=on --tables=10 --table_size=500000 --time=360 oltp_insert.lua run
MySQL 测试命令
- 数据准备
sysbench --threads=4 --events=0 --time=30 --report-interval=1 --mysql-host=127.0.0.1 --mysql-port=3306 --mysql-user=root --mysql-password=123456 --mysql-db=sbtest --tables=4 --table-size=1000000 oltp_insert prepare
- 插入测试
sysbench --threads=4 --events=0 --time=30 --report-interval=1 --mysql-host=127.0.0.1 --mysql-port=3306 --mysql-user=root --mysql-password=123456 --mysql-db=sbtest --tables=4 --table-size=1000000 oltp_insert run