Sysbench 测试说明

最近更新时间:2022-09-02 16:55:20

我的收藏
TDSQL PostgreSQL版 是基于分布式架构,支持自动水平拆分的高性能数据库,为您有效解决业务快速发展时的数据库性能瓶颈,随着业务量的变化,您可以随时调整 TDSQL PostgreSQL版 实例的规格。

测试环境

在腾讯云购买不同规格的实例,进行 OLTP 和 SELECT 场景性能测试。
说明
OLTP 场景测试指混合读写测试,读写比例14:4。SELECT 场景测试指简单的主键查询。
地域可用区:广州四区。
实例资源:指定配置按照上述资源配置进行 CGroup 隔离。
压测机器:由于压测机器需要安装额外的编译工具,同时在压测过程中需要消耗额外的系统资源,需要单独购买云服务器进行压力测试,建议使用计算型云服务器进行压力测试。
测试环境实例规格配置:用户在购买指定规格后,集群通过 CGroup 实现规格限制。
节点配置
GTM
CN
DN
入门型
1核4GB
1核4GB
1核6GB
基础Ⅰ型
1核4GB
2核8GB
2核12GB
基础Ⅱ型
4核4GB
4核16GB
4核24GB
中等Ⅰ型
4核4GB
8核32GB
8核48GB
中等Ⅱ型
8核8GB
16核64GB
16核96GB
高配Ⅰ型
16核16GB
32核128GB
32核192GB
高配Ⅱ型
16核16GB
64核256GB
64核384GB
测试环境集群配置。
节点类型
配置模式
数量
GTM
1主1备
1
CN
1主1备
2
DN
1主1备
2

测试工具

Sysbench 是一款基于 LuaJITde 开源的、模块化的、跨平台的模块化多线程性能测试工具,可以执行数据库、CPU、内存、线程、IO 等方面的性能测试。 工具内置数据库测试模型,采用多线程并发操作来评估数据库的性能,目前支持的数据库:MySQL、Oracle 和 PostgreSQL。 本次采用 Sysbench 作为 TDSQL PostgreSQL版 在 OLTP 和 SELECT 场景中的性能测试工具。
本次测试使用的 Sysbench 版本为1.0.12,详细源码及其他说明信息请参考 sysbench

安装和编译命令

# 切换目录
mkdir -p /data/sysbench && cd /data/sysbench
# 安装编译插件和库包
yum install make automake libtool pkgconfig libaio-devel postgresql-devel
# 获取源码
wget -c https://github.com/akopytov/sysbench/archive/1.0.12.zip
# 解压并进行编译
unzip 1.0.12.zip && cd sysbench-1.0.12
./autogen.sh
./configure --with-pgsql --without-mysql
make
make install
# 编译安装完成后,sysbench 工具所在目录
ls /usr/local/bin/sysbench

压力测试参数说明

--test: 压力测试使用的 Lua 模型场景文件
--db-driver: 指定数据库类型
--pgsql-db: 压力测试操作的数据库名
--pgsql-user: 连接数据库的用户名
--pgsql-password: 连接数据库的密码
--pgsql-host: 主 CN 的 IP
--pgsql-port: 主 CN 的数据库端口
--oltp-tables-count: 压力测试的数据库表数量
--oltp-tables-size: 压力测试单表的数据量
--num-threads: 压力测试的并发线程数
--max-time: 压力测试时间,取值为0,表示不限时间,单位为秒
--max-requests: 压力请求数量,取值为0,表示不限请求数量,单位为单次 Lua 场景请求数
--report-interval: 压测报告输出周期,单位为秒
--force-shutdown: 压力完成后是否强制终止测试

测试指标

TPS:Transaction Per Second,数据库每秒执行的事务数,每个事务中包含18条 SQL 语句。
QPS:Query Per Second,数据库每秒执行的 SQL 数。

测试模型

表结构

CREATE TABLE `sbtest` (
`id` INTEGER IDENTITY(1,1) NOT NULL,
`k` INTEGER DEFAULT '0' NOT NULL,
`c` CHAR(120) DEFAULT '' NOT NULL,
`pad` CHAR(60) DEFAULT '' NOT NULL,
PRIMARY KEY (`id`)
)

OLTP 压力场景

Sysbench 中 OLTP 场景的事务中包含18条 SQL,具体执行的语句如下:
主键 SELECT 语句,包含10条:
SELECT c FROM ${rand_table_name} where id=${rand_id};
范围 SELECT 语句, 包含4条:
SELECT c FROM ${rand_table_name} WHERE id BETWEEN ${rand_id_start} AND ${rand_id_end};
SELECT SUM(K) FROM ${rand_table_name} WHERE id BETWEEN ${rand_id_start} AND ${rand_id_end};
SELECT c FROM ${rand_table_name} WHERE id BETWEEN ${rand_id_start} AND ${rand_id_end} ORDER BY c;
SELECT DISTINCT c FROM ${rand_table_name} WHERE id BETWEEN ${rand_id_start} AND ${rand_id_end} ORDER BY c;
UPDATE 语句,包含2条:
UPDATE ${rand_table_name} SET k=k+1 WHERE id=${rand_id}
UPDATE ${rand_table_name} SET c=${rand_str} WHERE id=${rand_id}
DELETE 语句,包含1条:
DELETE FROM ${rand_table_name} WHERE id=${rand_id}
INSERT 语句,包含1条:
INSERT INTO ${rand_table_name} (id, k, c, pad) VALUES (${rand_id},${rand_k},${rand_str_c},${rand_str_pad})

SELECT 压力场景

主键 SELECT 语句
SELECT c FROM ${rand_table_name} where id=${rand_id};

测试步骤

测试过程中,请根据实例的配置修改 CN IP [host]、CN Port [port]、用户名 [user] 和 密码 [password]。
1. 导入数据。
1. 创建数据库 loadtest:
psql -h $host -p [host] -U [user] postgres -c "create database loadtest"
2. 使用 Sysbench 工具构造压测数据到 loadtest 库中,根据不同的实例规格场景修改背景数据量:
sysbench --test=./tests/include/oltp_legacy/oltp.lua --db-driver=pgsql --pgsql-db=loadtest --pgsql-user=[user] --pgsql-password=[password] --pgsql-port=[port] --pgsql-host=[host] --oltp-tables-count=20 --oltp-table-size=2000000 --num-threads=20 prepare
3. 压力测试,根据不同的实例规格场景修改压测参数。
sysbench --test=./tests/include/oltp_legacy/oltp.lua --db-driver=pgsql --pgsql-db=loadtest --pgsql-user=[user] --pgsql-password=[password] --pgsql-port=[port] --pgsql-host=[host] --oltp-tables-count=20 --oltp-table-size=2000000 --max-time=3600 --max-requests=0 --num-threads=150 --report-interval=3 --forced-shutdown=1 run
4. 清理数据,压力测试完成后,清理压力数据。
sysbench --test=./tests/include/oltp_legacy/oltp.lua --db-driver=pgsql --pgsql-db=loadtest --pgsql-user=[user] --pgsql-password=[password] --pgsql-port=[port] --pgsql-host=[host] --oltp-tables-count=20 --oltp-table-size=2000000 --max-time=3600 --max-requests=0 --num-threads=20 --report-interval=3 --forced-shutdown=1 cleanup