文末有惊喜哦 !
Sysbench 介绍
Sysbench 是一个在Linux系统上进行性能测试和基准测试的工具。它可以用于评估计算机系统的各种性能指标,如 CPU 性能、内存性能、文件 I/O性 能和数据库性能等。Sysbench 提供了多种测试模式和选项,可以帮助用户模拟不同负载条件下的性能表现,从而有助于优化系统配置和应用程序性能。
1)Sysbench 附带了以下捆绑的基准测试
- oltp_*.lua:类似oltp的数据库基准的集合
 - fileio:文件系统级基准测试
 - cpu:简单的cpu基准测试
 - memory:内存访问基准
 - threads:基于线程的调度器基准
 - mutex:POSIX互斥基准
 

2)Sysbench 特性
- 关于速率和延迟的大量统计数据是可用的,包括延迟百分比和直方图
 - 即使有数千个并发线程,开销也很低。Sysbench能够每秒生成和跟踪数亿个事件
 - 通过在用户提供的Lua脚本中实现预定义的钩子,可以轻松创建新的基准测试
 - 可以用作通用的Lua解释器,只需使用#!/usr/bin/sysbench替换#!/usr/bin/lua
 
Sysbench 安装
1)二进制安装
// ubuntu 安装
curl -s https://packagecloud.io/install/repositories/akopytov/sysbench/script.deb.sh | sudo bash
sudo apt -y install sysbench
sysbench --version
// centos 安装
curl -s https://packagecloud.io/install/repositories/akopytov/sysbench/script.rpm.sh | sudo bash
sudo yum -y install sysbench
sysbench --version 
![]()
不同系统安装 sysbench 参考:项目概览 - sysbench - GitCode、架构师必备之性能测试--压测工具sysbench的安装及使用_sysbench安装-CSDN博客
Sysbench 使用
sysbench 的命令行语法如下:
sysbench [options]... [testname] [command] 
1)testname:testname 是一个可选的内置测试名称(如 fileio、memory、cpu等),或一个捆绑的 Lua 脚本名称(如 oltp_read_only),或一个自定义 Lua 脚本的路径。
2)command:command 是一个可选参数,sysbench 将把它传递给内置测试或用 testname 指定的脚本。可用命令列表取决于特定测试。有些测试还实现了自己的自定义命令。将由sysbench传递给内置测试或用testname指定的脚本。命令定义测试必须执行的动作。可用命令的列表取决于特定的测试。一些测试还实现了它们自己的自定义命令。 下面是典型的测试命令及其用途的描述:
- prepare:为那些需要它们的测试执行准备操作,例如在磁盘上为文件测试创建必要的文件,或为数据库基准测试填充测试数据库。
 - run:运行testname参数指定的实际测试。所有测试都提供此命令。
 - cleanup:在创建临时数据的测试运行后删除临时数据。
 - help:显示使用参数 testname 指定的测试的使用信息。这包括测试提供的完整命令列表,因此应该使用它来获取可用的命令。
 
3)options:options是一个包含0个或多个以“--”开头的命令行选项的列表。与命令一样,应该使用sysbench testname help命令描述特定测试提供的可用选项。
命令行选项
支持的常用参数及其说明和默认值如下表所示:
|   选项  |   描述  |   默认值  | 
|   --threads  |   创建1的工作线程总数  |   1  | 
|   --events  |   请求总数的限制。0(默认值)表示没有限制  |   0  | 
|   --time  |   总执行时间限制,以秒为单位。0表示不限制  |   10  | 
|   --warmup-time  |   预热时间,可以实现在 CPU/database/page/caches 预热之后再进行统计,这样得到的数据指标更准确  |   0  | 
|   --rate  |   这个数字指定了所有线程平均每秒钟应该执行多少事件(事务)。0(默认)表示无限速率,即事件以尽可能快的速度执行  |   0  | 
|   --thread-init-timeout  |   工作线程初始化的等待时间,单位为秒  |   30  | 
|   --thread-stack-size  |   每个线程的堆栈大小  |   32k  | 
|   --report-interval  |   以间隔时间为秒定期上报中间统计信息。注意,此选项生成的统计信息是按间隔计算的,而不是累积的。0禁用中间报告  |   0  | 
|   --debug  |   打印更多的调试信息  |   off  | 
|   --validate  |   在可能的情况下对测试结果进行验证  |   off  | 
|   --help  |   打印通用语法或指定测试的帮助并退出  |   off  | 
|   --verbosity  |   详细级别(0 -只有关键消息,5 -调试)  |   4  | 
|   --percentile  |   sysbench测量所有已处理请求的执行时间,以显示最小、平均和最大执行时间等统计信息。对于大多数基准测试,知道一个匹配某个百分比的请求执行时间值也是有用的(例如,95%百分比意味着我们应该放弃最长请求的5%,并从剩余的请求中选择最大值)。此选项允许指定查询执行次数的百分位数用于计数  |   95  | 
|   --luajit-cmd  |   执行一个LuaJIT控制命令。这个选项相当于luajit -j  | 
随机数字选项
sysbench提供了许多算法来生成随机数,这些随机数根据给定的概率分布进行分布。下表列出了可用于控制这些算法的选项。
|   选项  |   描述  |   默认值  | 
|   --rand-type  |   默认情况下使用随机数分布{uniform,gaussian,special,pareto,zipfian}。基准脚本可以选择使用默认分布,也可以明确指定,即覆盖默认分布。  |   special  | 
|   --rand-seed  |   随机数生成器的种子。当为0时,当前时间用作RNG种子。  |   0  | 
|   rand-spec-iter  |   特殊分布的迭代次数  |   12  | 
|   rand-spec-pct  |   “特殊”值将属于特殊分布的整个范围的百分比  |   1  | 
|   rand- spec-res  |   用于特殊分布的“特殊”值百分比  |   75  | 
|   --rand-pareto-h  |   帕累托分布的形状参数  |   0.2  | 
|   --rand-zipfian-exp  |   zipfian分布的形状参数  |   0.8  | 
命令参考
sysbench --help
sysbench --help 命令结果如下:


通用数据库选项
General database options:
  --db-driver=STRING  specifies database driver to use ('help' to get list of available drivers) [mysql]
  --db-ps-mode=STRING prepared statements usage mode {auto, disable} [auto]
  --db-debug[=on|off] print database-specific debug information [off] 
MySQL 相关参数
|   选项  |   描述  |   默认值  | 
|   --mysql-host  |   mysql ip 地址  |   localhost  | 
|   --mysql-port  |   mysql 端口号  |   3306  | 
|   --mysql-socket  |   mysql 套接字  | |
|   --mysql-user  |   用户名  |   sbtest  | 
|   --mysql-password  |   密码  | |
|   --mysql-db  |   指定数据库  |   sbtest  | 
|   --mysql-ssl  |   使用 ssl 连接  |   off  | 
|   --mysql-ssl-cipher  |   ssl 使用 specific cipher  | |
|   --mysql-compression  |   如果客户端库中有压缩功能,则使用压缩功能  |   off  | 
|   --mysql-debug  |   跟踪所有客户端库调用  |   off  | 
|   --mysql-ignore-errors  |   忽略的错误  |   [1213,1020,1205]  | 
|   --mysql-dry-run  |   模拟运行,假装所有 MySQL 客户端 API 调用都成功,但不执行它们  |   off  | 
支持的 lua 脚本
|   选项  |   描述  | 
|   oltp_read_only  |   只读测试  | 
|   oltp_read_write  |   读写测试  | 
|   oltp_insert  |   简单插入测试  | 
|   bulk_insert  |   批量插入测试  | 
|   oltp_delete  |   delete 删除测试  | 
|   oltp_update_index  |   带索引的更新测试  | 
|   oltp_update_non_index  |   不带索引的更新测试  | 
|   oltp_point_select  |   等值查询测试  | 
|   select_random_points  |   随机等值查询测试  | 
|   select_random_ranges  |   随机范围查询测试  | 
注:这些脚本均包含了oltp_common,所以调用这些脚本可以直接使用 oltp_common 脚本中的内容,oltp_common 脚本中编写了数据生成、数据清理等基础函数。
脚本参数
|   选项  |   描述  |   默认值  | 
|   –auto_inc  |   使用 AUTO_INCREMENT 列作为主键(对于 MySQL),或者它在其他 DBMS 中的替代项。禁用时,使用客户端生成的 ID  |   on  | 
|   -–create_secondary  |   除了 PRIMARY KEY 创建二级索引  |   on  | 
|   –delete_inserts  |   每个事务的 DELETE/INSERT 组合数  |   1  | 
|   –distinct_ranges  |   每个事务的 SELECT DISTINCT 查询数  |   1  | 
|   –index_updates  |   每个事务的 UPDATE 索引查询数  |   1  | 
|   –mysql_storage_engine  |   存储引擎,如果使用 MySQL  |   innodb  | 
|   –non_index_updates  |   每个事务的 UPDATE 非索引查询数  |   1  | 
|   –order_ranges  |   每个事务的 SELECT ORDER BY 查询数  |   1  | 
|   –point_selects  |   每个事务的点 SELECT 查询数  |   10  | 
|   –range_selects  |   启用/禁用所有范围 SELECT 查询  |   on  | 
|   –range_size  |   范围 SELECT 查询的范围大小  |   100  | 
|   –secondary  |   使用二级索引代替 PRIMARY KEY  |   off  | 
|   –simple_ranges  |   每个事务的简单范围 SELECT 查询数  |   1  | 
|   –skip_trx  |   不要启动显式事务并在 AUTOCOMMIT 模式下执行所有查询  |   off  | 
|   –sum_ranges  |   每个事务的 SELECT SUM() 查询数  |   1  | 
|   –table_size  |   每个表的行数  |   10000  | 
|   –tables  |   表的个数  |   1  | 
Sysbench 测试
测试环境准备
1)创建远程连接账号,并授予权限
create user 'root_bench'@'%' identified with mysql_native_password by '123456'; grant all privileges on *.* to 'root_bench'@'%'; 
2)创建数据库test_sysbench
create database test_sysbench; 
MySQL 只读测试
1)准备:4张表,每张表个10万行,16线程
sysbench --threads=16 --time=60 --report-interval=1 --mysql-host=127.0.0.1 --mysql-port=3306 --mysql-user=root_bench --mysql-password=123456 --mysql-db=test_sysbench --tables=4 --table-size=100000 oltp_read_only prepare 

 2)开始只读测试
sysbench --threads=16 --time=30 --report-interval=1 --mysql-host=127.0.0.1 --mysql-port=3306 --mysql-user=root_bench --mysql-password=123456 --mysql-db=test_sysbench --tables=4 --table-size=100000 oltp_read_only run 

此处结果内容主要包含:
进度信息: 时间计数(1s意为1秒)
thds:线程数
tps:每秒事务数
qps:每秒查询数
r/w/o:分别代表每秒的读/写/其他操作数lat(ms, 95%)时95%操作的耗时-单位为毫秒
err/s:是每秒的错误数
reconn/s:是每秒的重连数
SQL统计信息:
read/write/other/total:SQL的读/写/其他/总计次数
transactions:总事务数及每秒事务数
queries:总查询数及每秒查询数
ignored errors:忽略错误数据
reconnects:重新数据
通用统计信息:
total time:总时间
total number of events:总操作数
耗时信息(单位毫秒):
min:最小耗时
avg:平均耗时
max:最大耗时
95th percentitle:95%耗时
sum:总耗时
线程公平性:
events (avg/stddev):线程执行事务数的平均值和标准差
execution Time (avg/stddev):线程执行时间的平均值和标准差
3)清理只读数据
sysbench --threads=16 --time=600 --report-interval=1 --mysql-host=127.0.0.1 --mysql-port=3306 --mysql-user=root_bench --mysql-password=123456 --mysql-db=test_sysbench --tables=4 --table-size=100000 oltp_read_only cleanup 

MySQL 读写测试
1)准备:8张表,每张表个5万行,16线程
sysbench --threads=16 --time=600 --report-interval=1 --mysql-host=127.0.0.1 --mysql-port=3306 --mysql-user=root_bench --mysql-password=123456 --mysql-db=test_sysbench --tables=8 --table-size=50000 oltp_read_write prepare 


2)开始读写测试
sysbench --threads=16 --time=30 --report-interval=1 --mysql-host=127.0.0.1 --mysql-port=3306 --mysql-user=root_bench --mysql-password=123456 --mysql-db=test_sysbench --tables=8 --table-size=50000 oltp_read_write run 

3)清理读写数据
sysbench --threads=16 --time=600 --report-interval=1 --mysql-host=127.0.0.1 --mysql-port=3306 --mysql-user=root_bench --mysql-password=123456 --mysql-db=test_sysbench --tables=8 --table-size=50000 oltp_read_write cleanup 

其他测试也是同样的操作流程,不一一演示了。
获取更多数据库内核干货,请关注微信公众号:东周沉静的青蒿


















