本章看点:
Sysbench 简介
Sysbench安装
Sysbench用法讲解
Sysbench对MySQL进行OLTP
分析MySQL测试结果
01
SysBench简介
SysBench是一个非常强大的开源性能测试工具,广泛应用于数据库系统(特别是MySQL)的性能测试。它基于LuaJIT,这使得它不仅拥有Lua的灵活性,还具有出色的执行性能。由于LuaJIT的即时编译能力,SysBench能够将Lua脚本直接编译为机器码,从而实现高效的执行,这对于性能测试工具来说尤为重要。
主要特点
多线程支持:SysBench可以通过多线程模拟并发操作,这对测试数据库在高并发情况下的性能表现至关重要。
高度可定制:通过Lua脚本,用户可以编写自定义测试用例,测试不同的数据库操作场景,如插入、更新、删除、选择等。
跨平台:Sysbench支持多种操作系统,包括Linux、Windows、macOS等,适用于各种开发和测试环境。
广泛应用:虽然它常用于MySQL,但SysBench也支持其他数据库系统(如PostgreSQL),以及非数据库的基准测试,如CPU、内存、文件系统等。
典型应用场景
数据库性能测试:评估数据库在各种操作下(插入、选择、更新、删除等)的性能,包括单线程和多线程的表现。
硬件性能评估:测试CPU、内存和I/O性能,评估硬件在处理高负载任务时的能力。
系统稳定性测试:通过长时间的高负载测试,检测系统在长时间运行下的稳定性。
为什么LuaJIT重要
LuaJIT是Lua的即时编译器,与传统解释型语言相比,它能将代码直接编译为机器码,显著提升代码执行速度。这对于SysBench这样一个基准测试工具来说非常重要,因为高效的脚本执行能够确保测试本身不会成为系统性能的瓶颈。
在使用SysBench进行测试时,用户可以根据需求编写或调整Lua脚本,从而模拟出更贴近实际应用场景的负载。LuaJIT的高效性保证了这些脚本在执行过程中尽可能减少对测试结果的影响,使得测试更加准确。
主要功能
CPU运算性能测试:通过质数计算或圆周率计算来评估CPU性能。
磁盘IO性能测试:测试系统的磁盘读写速度。
调度程序性能测试:评估操作系统的调度程序性能。
内存分配及传输速度测试:测试系统的内存性能。
POSIX线程性能测试:评估系统的线程处理能力。
数据库性能测试(OLTP基准测试):通过模拟数据库操作来评估数据库性能。
支持的数据库
SysBench目前支持MySQL、Oracle和PostgreSQL数据库的性能测试。
安装方法
二进制安装:对于RHEL/CentOS,可以使用curl和yum命令安装。
源码安装:对于其他Linux发行版,可以从GitHub下载源码包进行编译安装。
核心性能测试指标
QPS(QueriesPerSecond):每秒的查询数。
TPS(TransactionsPerSecond):每秒的事务数。
并发数:系统同时处理的请求数(事务数)。
响应时间:一般取平均响应时间。
02
SysBench安装
基于CentOS系统上从源码安装Sysbench的步骤
安装依赖包
这一步安装了编译Sysbench所需的依赖包,包括make、automake、libtool、pkgconfig、libaio-devel、openssl-devel和mysql-devel。
进入源码目录
cd /usr/src/
这一步切换到/usr/src/目录,这是存放源码包的常用目录。
下载Sysbench源码包
wget https://github.com/akopytov/sysbench/archive/refs/tags/1.0.20.tar.gz
这一步使用wget命令从GitHub下载Sysbench的源码包。这里下载的是版本1.0.20。
解压源码包
tar xvf 1.0.20.tar.gz
这一步使用tar命令解压下载的源码包。
进入解压后的目录
cd sysbench-1.0.20/
这一步切换到解压后的Sysbench源码目录。
运行autogen.sh脚本
./autogen.sh
这一步运行autogen.sh脚本,该脚本用于生成配置脚本所需的文件。
运行configure脚本
./configure
这一步运行configure脚本,该脚本用于检查系统环境并生成Makefile文件。
编译源码
make -j
这一步使用make命令编译源码。-j选项表示使用多个线程进行编译,加快编译速度。
安装Sysbench
make install
这一步使用make命令安装编译好的Sysbench。
完成以上步骤后,Sysbench将被安装在系统的默认路径下。可以通过运行sysbench--version命令来检查安装是否成功。
安装完成后,压测脚本默认会安装在 /usr/local/share/sysbench 目录下。
我们看看该目录的内容。
以下是列出的文件和文件夹的简要说明:
文件夹
tests:这个文件夹包含了一些测试脚本和配置文件,用于执行各种性能测试。
Lua脚本文件
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:用于测试随机范围查询操作的性能。
03
SysBench用法讲解
性能基准测试
sysbench 命令语法如下:
sysbench [options]... [testname] [command]
命令中的 testname 是配置项名称。sysbench支持的测试项包括:
oltp_*.lua 一系列OLTP类的数据库压测
fileio 文件系统层对压测
cpu 简单的CPU压测
memory 内存访问压测
threads 基于线程的调度器压测
mutex 一个POSIXmutex压测
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
04
SysBench对MySQL进行OLTP
以 oltp_read_write 为例的四个标准步骤如下:
Prepare(准备)
创建测试数据库和表,并填充测试数据。
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:指定每个表的数据行数。
Prewarm(预热)
预热数据库缓存和磁盘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
Run(运行)
执行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
Cleanup(清理)
清理测试过程中创建的测试数据库和表。
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基准测试,并根据测试结果进行针对性的优化。
05
分析MySQL测试结果
分析下 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(TransactionsPerSecond)。
每秒操作数,即我们常说的QPS(QueriesPerSecond)。
95%event的执行耗时。
**TPS和QPS反映了系统的吞吐量,越大越好。执行耗时代表了事务的执行时长,越小越好。**在一定范围内,并发线程数指定得越大,TPS和Q入房QPS(QueriesPerSecond)和TPS(TransactionsPerSecond)是衡量系统性能的两个重要指标,它们分别表示每秒处理的请求数量和每秒处理的事务数量。
QPS(QueriesPerSecond):每秒查询率,是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准。在因特网上,作为域名系统服务器的机器的性能经常用每秒查询率来衡量。对应fetches/sec,即每秒的响应请求数,也即是最大吞吐能力。
TPS(TransactionsPerSecond):每秒事务数,是软件测试结果的测量单位。一个事务是指一个客户机向服务器发送请求然后服务器做出反应的过程。客户机在发送请求时开始计时,收到服务器响应后结束计时,以此来计算使用的时间和完成的事务个数。
关系:
在某些情况下,QPS和TPS可以是等价的,比如在某些简单的请求响应场景中,每个请求就是一个事务。
但在复杂的系统中,一个事务可能包含多个请求,因此TPS通常会小于QPS。例如,在一个电商网站中,一个事务可能包括浏览商品、添加购物车、下单、支付等多个步骤,每个步骤都可能产生多个请求。
注意事项:
在评估系统性能时,除了关注TPS和QPS外,还需要考虑其他因素,如响应时间、错误率、资源利用率等。
95%event的执行耗时是一个重要的性能指标,它表示95%的事件都在这个时间内完成。这个指标有助于了解系统在高负载下的性能表现,并帮助识别潜在的性能瓶颈。
06
SysBench对服务器进行测试
sysbench
是一个多功能的基准测试工具,它可以用来测试服务器的 CPU、内存、磁盘 I/O 和数据库性能。
测试 CPU 性能
使用 sysbench
的 cpu
测试模式来评估 CPU 的性能:
sysbench cpu --threads=<number_of_threads> run
其中 <number_of_threads>
是希望使用的线程数。这个测试会运行一系列的计算任务,并报告 CPU 的性能。
CPU speed:
events per second: 每秒事件数,这里是 2044.28。这个数字反映了 CPU 每秒可以处理的事件数量,数值越高,表示 CPU 性能越好。
General statistics:
total time: 总时间,这里是 10.2612 秒。这是整个测试运行的总时间。
total number of events: 事件总数,这里是 20980。这是在测试期间发生的事件总数。
Latency (ms):
min: 最小延迟,这里是 0.95 毫秒。这是所有事件中最短的响应时间。
avg: 平均延迟,这里是 235.00 毫秒。这是所有事件的平均响应时间。
max: 最大延迟,这里是 8812.24 毫秒。这是所有事件中最长的响应时间。
95th percentile: 95% 的延迟,这里是 2082.91 毫秒。这意味着 95% 的事件的延迟都低于这个值。
sum: 延迟总和,这里是 4930323.48 毫秒。这是所有事件的延迟总和。
Threads fairness:
events (avg/stddev): 事件数(平均值/标准差),这里是 10.4900/13.18。这表示每个线程平均处理的事件数以及这些事件数的标准差。
execution time (avg/stddev): 执行时间(平均值/标准差),这里是 2.4652/3.30。这表示每个线程平均的执行时间以及这些执行时间的标准差。
从这些数据中,我们可以得出以下结论:
CPU 的性能表现良好,每秒可以处理超过 2000 个事件。
总体来看,测试运行了 10.26 秒,期间发生了 20980 个事件。
延迟方面,大部分事件的响应时间在 235 毫秒左右,但有一些极端情况下的延迟非常高,达到了 8.8 秒。
在多线程公平性方面,每个线程处理的事件数和执行时间的平均值和标准差都在合理范围内。
测试磁盘 I/O 性能
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 模式
这段输出是来自 sysbench
工具的测试结果,sysbench
是一个多功能的基准测试工具,可以用来测试 CPU、内存、磁盘 I/O 和数据库的性能。下面是对这段输出的详细解释:
Extra file open flags: (none)
1 files, 1GiB each: 创建 1 个文件,每个文件大小为 1GiB。
1GiB total file size: 总文件大小为 1GiB。
Block size 16KiB: 块大小为 16KiB。
Periodic FSYNC enabled, calling fsync() each 100 requests: 启用周期性 FSYNC,每 100 个请求调用一次 fsync()。
Calling fsync() at the end of test, Enabled: 测试结束时调用 fsync(),已启用。
Using synchronous I/O mode: 使用同步 I/O 模式。
Doing sequential write (creation) test: 进行顺序写入(创建)测试。
File operations:
reads/s: 每秒读取次数,这里是 0.00。
writes/s: 每秒写入次数,这里是 10315.23。
fsyncs/s: 每秒 fsync() 调用次数,这里是 103.25。
Throughput:
read, MiB/s: 每秒读取的 MiB 数,这里是 0.00。
written, Mi克/s: 每秒写入的 MiB 数,这里是 161.18。
General statistics:
total time: 总时间,这里是 10.0031 秒。
total number of events: 总事件数,这里是 104232。
Latency (ms):
min: 最小延迟,这里是 0.01 毫秒。
avg: 平均延迟,这里是 0.10 毫秒。
max: 最大延迟,这里是 21.50 毫秒。
95th percentile: 95% 的延迟,这里是 0.01 毫秒。
sum: 延迟总和,这里是 9956.08 毫秒。
Threads fairness:
events (avg/stddev): 事件数(平均值/标准差),这里是 104232.0000/0.00。
execution time (avg/stddev): 执行时间(平均值/标准差),这里是 9.9561/0.00。
07
SysBench测试数据库性能
如何使用 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>
都需要替换为实际的值。
常见测试场景
1、批量插入操作。在 SysBench 中,批量插入可以通过设置插入操作的数量来实现
这个命令执行了批量插入操作,插入了10万条记录,使用了16个线程,持续时间为60秒。
sysbench oltp_insert --table-size=100000 --threads=16 --time=60 run
2、oltp_delete: OLTP 删除操作。测试数据库在删除数据时的性能。
这个命令执行了删除操作,对数据库中已有的10万条记录进行删除操作。
sysbench oltp_delete --table-size=100000 --threads=16 --time=60 run
3、oltp_read_write: 读写混合操作。测试数据库在读写混合负载下的性能。
这个命令执行了读写混合操作,包括查询和插入/更新/删除操作。
sysbench oltp_read_write --table-size=100000 --threads=16 --time=60 run
总结
随着信息技术的快速发展,软件系统需要处理的数据量和并发用户数呈现爆炸式增长。为了确保系统在高负载下的稳定性和性能,压力测试(压测)成为了一个关键的环节。
压测的目的
发现系统瓶颈:通过模拟大量用户并发访问,可以暴露出系统的性能瓶颈,如数据库连接池不足、网络带宽受限等。
评估系统稳定性:长时间的高负载测试可以检验系统在持续压力下的稳定性和可靠性。
优化系统性能:通过对压测结果的分析,可以针对性地进行系统优化,提高系统的吞吐量和响应速度。
容量规划:压测可以帮助确定系统的最大承载能力,为资源分配和扩展提供依据。
压测对于确保软件系统在高负载下的稳定性和性能至关重要。通过合理地使用 sysbench,可以帮助开发者和运维人员发现系统瓶颈、评估系统稳定性、优化系统性能和进行容量规划,从而为用户提供更好的服务体验。
出处链接:https://juejin.cn/post/7402916277272002610
来源:稀土掘金,著作权归原作者所有。
关注【测试开发技术】,添加"星标",获取每天技术干货,共同成长!
推荐阅读:
END
长按二维码/微信扫码 添加作者
点赞和在看就是最大的支持❤️