文末有惊喜哦 !
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
其他测试也是同样的操作流程,不一一演示了。
获取更多数据库内核干货,请关注微信公众号:东周沉静的青蒿