本章看点:
SysBench 是一个非常强大的开源性能测试工具,广泛应用于数据库系统(特别是 MySQL)的性能测试。它基于 LuaJIT,这使得它不仅拥有 Lua 的灵活性,还具有出色的执行性能。由于 LuaJIT 的即时编译能力,SysBench 能够将 Lua 脚本直接编译为机器码,从而实现高效的执行,这对于性能测试工具来说尤为重要。

LuaJIT 是 Lua 的即时编译器,与传统解释型语言相比,它能将代码直接编译为机器码,显著提升代码执行速度。这对于 SysBench 这样一个基准测试工具来说非常重要,因为高效的脚本执行能够确保测试本身不会成为系统性能的瓶颈。
在使用 SysBench 进行测试时,用户可以根据需求编写或调整 Lua 脚本,从而模拟出更贴近实际应用场景的负载。LuaJIT 的高效性保证了这些脚本在执行过程中尽可能减少对测试结果的影响,使得测试更加准确。
SysBench目前支持MySQL、Oracle和PostgreSQL数据库的性能测试。
curl和yum命令安装。基于CentOS系统上从源码安装Sysbench的步骤
1.安装依赖包
yum -y install make automake libtool pkgconfig libaio-devel openssl-devel mysql-devel这一步安装了编译Sysbench所需的依赖包,包括make、automake、libtool、pkgconfig、libaio-devel、openssl-devel和mysql-devel。

2.进入源码目录
cd /usr/src/这一步切换到/usr/src/目录,这是存放源码包的常用目录。
3.下载Sysbench源码包
wget https://github.com/akopytov/sysbench/archive/refs/tags/1.0.20.tar.gz这一步使用wget命令从GitHub下载Sysbench的源码包。这里下载的是版本1.0.20。


4.解压源码包
tar xvf 1.0.20.tar.gz这一步使用tar命令解压下载的源码包。

5.进入解压后的目录
cd sysbench-1.0.20/这一步切换到解压后的Sysbench源码目录。
6.运行autogen.sh脚本
./autogen.sh这一步运行autogen.sh脚本,该脚本用于生成配置脚本所需的文件。

7.运行configure脚本
./configure这一步运行configure脚本,该脚本用于检查系统环境并生成Makefile文件。

8. 编译源码
make -j这一步使用make命令编译源码。-j选项表示使用多个线程进行编译,加快编译速度。

9. 安装Sysbench
make install这一步使用make命令安装编译好的Sysbench。
完成以上步骤后,Sysbench将被安装在系统的默认路径下。可以通过运行sysbench --version命令来检查安装是否成功。

安装完成后,压测脚本默认会安装在 /usr/local/share/sysbench 目录下。
我们看看该目录的内容。

以下是列出的文件和文件夹的简要说明:
tests:这个文件夹包含了一些测试脚本和配置文件,用于执行各种性能测试。
bulk_insert.lua:用于测试批量插入操作的性能。
oltp_common.lua:包含了一些通用的OLTP测试函数和变量。
oltp_delete.lua:用于测试删除操作的性能。
oltp_insert.lua:用于测试插入操作的性能。
oltp_point_select.lua:用于测试点查询操作的性能。
oltp_read_only.lua:用于测试只读操作的性能。
oltp_read_write.lua:用于测试读写混合操作的性能。
oltp_update_index.lua:用于测试更新索引操作的性能。
oltp_update_non_index.lua:用于测试更新非索引字段操作的性能。
oltp_write_only.lua:用于测试只写操作的性能。
select_random_points.lua:用于测试随机点查询操作的性能。
select_random_ranges.lua:用于测试随机范围查询操作的性能。
sysbench 命令语法如下:
sysbench [options]... [testname] [command]testname是配置项名称。sysbench 支持的测试项包括:oltp_*.lua 一系列OLTP类的数据库压测fileio 文件系统层对压测cpu 简单的CPU压测memory 内存访问压测threads 基于线程的调度器压测mutex 一个POSIX mutex压测command是 sysbench 要执行的命令,支持的选项有:prepare,prewarm,run,cleanup,help。注意,不是所有的测试项都支持这些选项。options是配置项。sysbench 中的配置项主要包括以下两部分:这部分配置项可通过 sysbench --help 查看。例如,

一些常见的通用配置项:
--threads=N:指定使用的线程数。--time=N:指定测试持续时间(秒)。--report-interval=N:指定报告间隔(秒),即每隔多少秒输出一次测试结果。--percentile=N:指定输出结果的百分位数,默认为95。--mysql-host=HOST:指定MySQL服务器的主机名或IP地址。--mysql-port=N:指定MySQL服务器的端口号,默认为3306。--mysql-user=USER:指定连接MySQL服务器的用户名。--mysql-password=PASSWORD:指定连接MySQL服务器的密码。--mysql-db=DB:指定要测试的MySQL数据库名称。测试项相关的配置项。各个测试项支持的配置项可通过 sysbench testname help 查看。例如
sysbench memory help
以oltp_read_write为例的四个标准步骤如下:
创建测试数据库和表,并填充测试数据。
sysbench --test=oltp_read_write --db-driver=mysql --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=root --mysql-db=testdb --tables=10 --table-size=100000 prepare解释
--test=oltp_read_write:指定测试类型为OLTP读写测试。--db-driver=mysql:指定数据库驱动为MySQL。--mysql-host=localhost:指定MySQL服务器的主机名或IP地址。--mysql-port=3306:指定MySQL服务器的端口号。--mysql-user=root:指定连接MySQL服务器的用户名。--mysql-password=root:指定连接MySQL服务器的密码。--mysql-db=testdb:指定要测试的MySQL数据库名称。--tables=10:指定要创建的表的数量。--table-size=100000:指定每个表的数据行数。预热数据库缓存和磁盘I/O。
sysbench --test=oltp_read_write --db-driver=mysql --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=root --mysql-db=testdb --tables=10 --table-size=100000 prewarm执行OLTP基准测试。
sysbench --test=oltp_read_write --db-driver=mysql --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=root --mysql-db=testdb --tables=10 --table-size=100000 run清理测试过程中创建的测试数据库和表。
sysbench --test=oltp_read_write --db-driver=mysql --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=root --mysql-db=testdb --tables=10 --table-size=10000 cleanup通过以上四个步骤,可以使用Sysbench对MySQL数据库进行全面的OLTP基准测试,并根据测试结果进行针对性的优化。

分析下 oltp_read_write 场景下的压测结果
Running the test with following options:
Number of threads: 1
Initializing random number generator from current time
Initializing worker threads...
Threads started!
SQL statistics:
queries performed:
read: 1330 # 读操作的数量
write: 380 # 写操作的数量
other: 190 # 其它操作的数量
total: 1900 # 总的操作数量,total = read + write + other
transactions: 95 (9.40 per sec.) # 总的事务数(每秒事务数)
queries: 1900 (187.94 per sec.) # 总的操作数(每秒操作数)
ignored errors: 0 (0.00 per sec.) # 忽略的错误数(每秒忽略的错误数)
reconnects: 0 (0.00 per sec.) # 重试次数(每秒重试的次数)
General statistics:
total time: 10.1077s # 总的执行时间
total number of events: 95 # 执行的 event 的数量
Latency (ms):
min: 102.29 # 最小耗时
avg: 106.38 # 平均耗时
max: 131.12 # 最大耗时
95th percentile: 112.67 # 95% event 的执行耗时
sum: 10106.20 # 总耗时
Threads fairness:
events (avg/stddev): 95.0000/0.00 # 平均每个线程执行 event 的数量
# stddev 是标准差,值越小,代表结果越稳定。
execution time (avg/stddev): 10.1062/0.00 # 平均每个线程的执行时间输出中,重点关注三个指标:
TPS 和 QPS 反映了系统的吞吐量,越大越好。执行耗时代表了事务的执行时长,越小越好。在一定范围内,并发线程数指定得越大,TPS 和 Q入房QPS(Queries Per Second)和 TPS(Transactions Per Second)是衡量系统性能的两个重要指标,它们分别表示每秒处理的请求数量和每秒处理的事务数量。
关系:
注意事项:
sysbench 是一个多功能的基准测试工具,它可以用来测试服务器的 CPU、内存、磁盘 I/O 和数据库性能。
使用 sysbench 的 cpu 测试模式来评估 CPU 的性能:
sysbench cpu --threads=<number_of_threads> run其中 <number_of_threads> 是希望使用的线程数。这个测试会运行一系列的计算任务,并报告 CPU 的性能。

从这些数据中,我们可以得出以下结论:
sysbench 提供了 memory 测试模式来测试 RAM 的性能:
sysbench memory --memory-block-size=<block_size> --memory-total-size=<total_size> run这里 <block_size> 是每次操作的内存块大小,而 <total_size> 是总共要操作的内存量。
选项 | 默认值 | 描述 |
|---|---|---|
--memory-block-size | 1KB | 内存块的大小,建议设置为 1MB。 |
--memory-total-size | 100GB | 要传输的数据的总大小。 |
--memory-scope | global | 内存访问范围,可指定 global 或 local。 |
--memory-hugetlb | off | 是否从 HugeTLB 池中分配内存,默认为 off。 |
--memory-oper | write | 内存操作类型,可指定 read、write、none,默认为 write。 |
--memory-access-mode | seq | 内存访问模式,可指定 seq(顺序访问)、rnd(随机访问),默认为 seq。 |

sysbench 的 fileio 测试模式可以用来测试磁盘 I/O 性能:
sysbench fileio --file-total-size=<total_size> --file-test-mode=<mode> --file-num=1 run其中 <total_size> 是要创建的文件的总大小,<mode> 可以是 seqwr(顺序写入)、seqrd(顺序读取)、rndrd(随机读取)等不同的 I/O 模式
选项 | 默认值 | 描述 |
|---|---|---|
--file-num | 128 | 需要创建的文件数。 |
--file-block-size | 16384 | 数据块的大小,即 16KB。 |
--file-total-size | 2GB | 需要创建的文件总大小。 |
--file-test-mode | seqwr | 测试模式,可指定 seqwr(顺序写)、seqrewr(顺序重写)、seqrd(顺序读)、rndrd(随机读)、rndwr(随机写)、rndrw(随机读写)。 |
--file-io-mode | sync | 文件的操作模式,可指定 sync(同步 IO)、async(异步 IO)、mmap,默认为 sync。 |
--file-async-backlog | 128 | 每个线程异步 IO 队列的长度。 |
--file-extra-flags | 无 | 打开文件时指定的标志,可指定 sync、dsync、direct,默认为空,没指定。 |
--file-fsync-freq | 100 | 指定持久化操作的频率,即每执行 100 个 IO 请求,则会进行一次持久化操作。 |
--file-fsync-all | off | 在每次写入操作后执行持久化操作,默认为 off。 |
--file-fsync-end | on | 在测试结束时执行持久化操作,默认为 on。 |
--file-fsync-mode | fsync | 持久化操作的模式,可指定 fsync、fdatasync,默认为 fsync。 |
--file-merged-requests | 0 | 允许合并的最多 IO 请求数,默认为0,不合并。 |
--file-rw-ratio | 1.5 | 混合测试中的读写比例。 |

这段输出是来自 sysbench 工具的测试结果,sysbench 是一个多功能的基准测试工具,可以用来测试 CPU、内存、磁盘 I/O 和数据库的性能。下面是对这段输出的详细解释:
如何使用 sysbench 对 MySQL 数据库进行基准测试。这里是一个简化的例子:
sysbench oltp_read_write --mysql-host=<host> --mysql-port=<port> --mysql-user=<user> --mysql-password=<password> --mysql-db=<database> --tables=<number_of_tables> --table-size=<size> --threads=<number_of_threads> prepare
sysbench oltp_read_write --mysql-host=<host> --mysql-port=<port> --mysql-user=<user> --mysql-password=<password> --mysql-db=<database> --tables=<number_of_tables> --table-size=<size> --threads=<number_of_threads> run在这个例子中,<host>、<port>、<user>、<password>、<database>、<number_of_tables> 和 <size> 都需要替换为实际的值。
这个命令执行了批量插入操作,插入了10万条记录,使用了16个线程,持续时间为60秒。
sysbench oltp_insert --table-size=100000 --threads=16 --time=60 run这个命令执行了删除操作,对数据库中已有的10万条记录进行删除操作。
sysbench oltp_delete --table-size=100000 --threads=16 --time=60 run这个命令测试了插入数据的性能,类似于 bulk_insert,但规模较小。
sysbench oltp_insert --table-size=100000 --threads=16 --time=60 run这个命令执行了点查询操作,随机选择记录并进行查询。
sysbench oltp_point_select --table-size=100000 --threads=16 --time=60 run这个命令执行了只读操作,数据库只进行读取,不涉及写操作。
sysbench oltp_read_only --table-size=100000 --threads=16 --time=60 run这个命令执行了读写混合操作,包括查询和插入/更新/删除操作。
sysbench oltp_read_write --table-size=100000 --threads=16 --time=60 run这个命令执行了更新索引字段的操作,测试更新有索引字段的记录时的性能。
sysbench oltp_update_index --table-size=100000 --threads=16 --time=60 run这个命令执行了更新非索引字段的操作,测试更新无索引字段时的性能。
sysbench oltp_update_non_index --table-size=100000 --threads=16 --time=60 run这个命令执行了写入操作,数据库只进行插入/更新/删除操作,不涉及读取。
sysbench oltp_write_only --table-size=100000 --threads=16 --time=60 run这个命令执行了随机点查询操作。
sysbench select_random_points --table-size=100000 --threads=16 --time=60 run这个命令执行了随机范围查询操作,查询一个连续的记录范围。
sysbench select_random_ranges --table-size=100000 --threads=16 --time=60 run要创建一个自定义的 SysBench 测试脚本,例如 goboy_select.lua,首先需要明确你想测试的具体内容。假设 goboy_select.lua 是一个测试数据库中随机选择一条记录的查询脚本,并将其打印出来。
lua复制代码-- 定义全局命令行选项
sysbench.cmdline.options = {
table_size = { type = "int", default = 10000, description = "Number of rows in the table" },
select_column = { type = "string", default = "c", description = "Column to select" },
}
-- 初始化线程
function thread_init(thread_id)
-- 连接到数据库
db_connect()
end
-- 清理线程
function thread_done(thread_id)
-- 断开数据库连接
db_disconnect()
end
-- 自定义的点查询函数
function goboy_select(thread_id)
-- 从1到table_size之间随机选择一个ID
local id = math.random(1, sysbench.opt.table_size)
-- 准备SELECT语句,选择指定的列
local query = string.format("SELECT %s FROM sbtest WHERE id = %d", sysbench.opt.select_column, id)
-- 执行查询
local result = db_query(query)
-- 处理查询结果,这里只是打印出来
print("Selected ID: " .. id .. ", Value: " .. result)
end
-- 事件处理函数,每个事件周期内调用
function event(thread_id)
goboy_select(thread_id)
endgoboy_select.lua解析全局命令行选项 (sysbench.cmdline.options)
table_size: 代表表的总行数。默认值为10000。
select_column: 允许用户指定要查询的列。默认值为c。
线程初始化 (thread_init)
在每个线程启动时调用,用于建立与数据库的连接。这里调用了
db_connect()函数。
线程清理 (thread_done)
在线程结束时调用,用于断开数据库连接。这里调用了
db_disconnect()函数。
自定义点查询函数 (goboy_select)
goboy_select函数是核心部分,它首先随机选择一个id,然后根据用户指定的列(select_column),生成并执行SELECT语句。执行查询后,查询结果会被简单地打印出来(
事件处理 (event)
每个事件周期内,
event函数会调用goboy_select函数,执行一次随机点查询。
运行自定义脚本:
sysbench --lua=./goboy_select.lua --table_size=50000 --select_column="k" --threads=4 --time=60 run--lua=./goboy_select.lua: 指定自定义的 Lua 脚本文件。--table_size=50000: 设定表的总行数为 50000。--select_column="k": 指定要查询的列为 k。--threads=4: 使用 4 个线程。--time=60: 测试持续时间为 60 秒。通过这种方式,可以轻松创建适合自己测试需求的 SysBench 自定义脚本。
随着信息技术的快速发展,软件系统需要处理的数据量和并发用户数呈现爆炸式增长。为了确保系统在高负载下的稳定性和性能,压力测试(压测)成为了一个关键的环节。
压测的目的
压测对于确保软件系统在高负载下的稳定性和性能至关重要。通过合理地使用 sysbench,可以帮助开发者和运维人员发现系统瓶颈、评估系统稳定性、优化系统性能和进行容量规划,从而为用户提供更好的服务体验。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。