[![最新发布][release-badge]][release-url] [![构建状态][action-badge]][action-url] [![Debian 软件包][deb-badge]][deb-url] [![RPM 软件包][rpm-badge]][rpm-url] [![覆盖率状态][coveralls-badge]][coveralls-url] [![许可证][license-badge]][license-url]
目录
sysbench
sysbench 是一个基于 LuaJIT 的可脚本化多线程基准测试工具。它最常用于数据库基准测试,但也可用于创建不涉及数据库服务器的任意复杂工作负载。
sysbench 附带以下内置基准测试:
oltp_*.lua
:一系列类 OLTP 数据库基准测试fileio
:文件系统级基准测试cpu
:简单的 CPU 基准测试memory
:内存访问基准测试threads
:基于线程的调度器基准测试mutex
:POSIX 互斥锁基准测试
特性
- 提供关于速率和延迟的广泛统计信息,包括延迟百分位数和直方图;
- 即使在数千个并发线程下也能保持低开销。sysbench 能够每秒生成和跟踪数亿个事件;
- 通过在用户提供的 Lua 脚本中实现预定义的钩子,可以轻松创建新的基准测试;
- 也可用作通用 Lua 解释器,只需在脚本中将
#!/usr/bin/lua
替换为#!/usr/bin/sysbench
。
从二进制包安装
Linux
在 Linux 上下载和安装 sysbench 的最简单方法是使用 packagecloud 托管的二进制包仓库。这些仓库会在每次 sysbench 发布时自动更新。目前提供 x86_64、i386 和 aarch64 架构的二进制文件。
有多种下载和安装 sysbench 包的方法,详细说明可在 https://packagecloud.io/akopytov/sysbench/install 找到。
快速安装说明:
-
Debian/Ubuntu
curl -s https://packagecloud.io/install/repositories/akopytov/sysbench/script.deb.sh | sudo bash sudo apt -y install sysbench
-
RHEL/CentOS:
curl -s https://packagecloud.io/install/repositories/akopytov/sysbench/script.rpm.sh | sudo bash sudo yum -y install sysbench
-
Fedora:
curl -s https://packagecloud.io/install/repositories/akopytov/sysbench/script.rpm.sh | sudo bash sudo dnf -y install sysbench
-
Arch Linux:
sudo pacman -Suy sysbench
macOS
在 macOS 上,可以通过 Homebrew 获取最新的 sysbench 包:
# 如果需要 PostgreSQL 支持,请添加 --with-postgresql
brew install sysbench
Windows
从 sysbench 1.0 版本开始,已停止支持原生 Windows 构建。可能会在后续版本中重新引入。目前,在 Windows 上获取 sysbench 的推荐方法是使用 Windows 10 中提供的 Windows Subsystem for Linux。
安装 WSL 并进入 Windows 上的 bash 提示符后,按照 Debian/Ubuntu 的安装说明操作即可。或者,可以使用 WSL 从源代码构建和安装 sysbench,或使用旧版 sysbench 构建原生二进制文件。
从源代码构建和安装
建议按照从二进制包安装中的说明从官方二进制包安装 sysbench。以下是当您想在没有可用二进制包的架构上使用 sysbench 时的说明。
构建要求
Windows
从 sysbench 1.0 版本开始,已停止支持原生 Windows 构建。可能会在后续版本中重新引入。目前,在 Windows 上构建 sysbench 的推荐方法是使用 Windows 10 中提供的 Windows Subsystem for Linux。
安装 WSL 并进入 Windows 上的 bash 提示符后,按照 Debian/Ubuntu 的构建说明操作即可。或者,可以在 Windows 上构建和使用较旧的 0.5 版本。
Debian/Ubuntu
apt -y install make automake libtool pkg-config libaio-dev
# 对于 MySQL 支持
apt -y install libmysqlclient-dev libssl-dev
# 对于 PostgreSQL 支持
apt -y install libpq-dev
RHEL/CentOS
yum -y install make automake libtool pkgconfig libaio-devel
# 对于MySQL支持,在RHEL/CentOS 5上替换为mysql-devel
yum -y install mariadb-devel openssl-devel
# 对于PostgreSQL支持
yum -y install postgresql-devel
Fedora
dnf -y install make automake libtool pkgconfig libaio-devel
# 对于MySQL支持
dnf -y install mariadb-devel openssl-devel
# 对于PostgreSQL支持
dnf -y install postgresql-devel
macOS
假设你已经安装了Xcode(或Xcode命令行工具)和Homebrew:
brew install automake libtool openssl pkg-config
# 对于MySQL支持
brew install mysql
# 对于PostgreSQL支持
brew install postgresql
# openssl未被Homebrew链接,这是为了避免"ld: library not found for -lssl"错误
export LDFLAGS=-L/usr/local/opt/openssl/lib
构建和安装
./autogen.sh
# 添加--with-pgsql以构建PostgreSQL支持
./configure
make -j
make install
上述步骤将默认构建带有MySQL支持的sysbench。如果你的MySQL头文件和库位于非标准位置(且在PATH中找不到mysql_config),你可以使用--with-mysql-includes
和--with-mysql-libs
选项明确指定它们的位置。
要编译不带MySQL支持的sysbench,使用--without-mysql
。如果没有可用的数据库驱动,与数据库相关的脚本将无法工作,但其他基准测试仍可正常运行。
使用方法
基本语法
sysbench的基本命令行语法为:
sysbench [选项]... [测试名称] [命令]
-
测试名称是可选的内置测试名称(如
fileio
、memory
、cpu
等),或捆绑的Lua脚本名称(如oltp_read_only
),或自定义Lua脚本的路径。如果命令行中未指定测试名称(因此也没有命令,因为这种情况下它会被解析为测试名称),或测试名称为破折号("-
"),则sysbench会从标准输入中读取要执行的Lua脚本。 -
命令是一个可选参数,sysbench会将其传递给指定的内置测试或脚本。命令定义了测试需要执行的操作。可用命令列表取决于特定测试。某些测试还实现了自己的自定义命令。
以下是典型测试命令及其用途的描述:
prepare
:为需要准备工作的测试执行准备操作,例如为fileio
测试在磁盘上创建必要的文件,或为数据库基准测试填充测试数据库。run
:运行由测试名称参数指定的实际测试。所有测试都提供此命令。cleanup
:在那些创建临时数据的测试运行后,移除临时数据。help
:显示由测试名称参数指定的测试的使用信息。这包括测试提供的完整命令列表,因此应该用它来获取可用命令。
-
选项是以
'--'
开头的零个或多个命令行选项列表。与命令一样,应使用sysbench 测试名称 help
命令来描述特定测试提供的可用选项。有关sysbench本身提供的通用选项描述,请参阅通用命令行选项。
你可以使用sysbench --help
显示通用命令行语法和选项。
通用命令行选项
下表列出了支持的通用选项、它们的描述和默认值:
选项 | 描述 | 默认值 |
---|---|---|
--threads | 要创建的工作线程总数 | 1 |
--events | 请求总数的限制。0(默认值)表示无限制 | 0 |
--time | 总执行时间限制(秒)。0表示无限制 | 10 |
--warmup-time | 在实际进行统计的基准测试运行之前,禁用统计功能执行指定秒数的事件。这在您想要从统计中排除基准测试运行的初始阶段时非常有用。在许多基准测试中,初始阶段并不具有代表性,因为CPU/数据库/页面和其他缓存需要一些时间来预热 | 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 。有关更多信息,请参阅LuaJIT文档 |
请注意,所有大小选项(如本表中的--thread-stack-size
)的数值可以通过附加相应的乘数后缀来指定(K表示千字节,M表示兆字节,G表示吉字节,T表示太字节)。
随机数选项
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 | 齐普夫分布的形状参数(theta) | 0.8 |
版本控制
为了透明度和对其发布周期的洞察,以及努力保持向后兼容性,sysbench将尽可能遵循语义化版本控制指南进行维护。
版本号将采用以下格式:
<主版本号>.<次版本号>.<修订号>
并遵循以下准则构建:
- 破坏向后兼容性的更改会增加主版本号(并重置次版本号和修订号)
- 在不破坏向后兼容性的情况下添加新功能会增加次版本号(并重置修订号)
- Bug修复和其他杂项更改会增加修订号
有关语义化版本控制的更多信息,请访问http://semver.org/。 [coveralls-badge]: https://coveralls.io/repos/github/akopytov/sysbench/badge.svg?branch=master [coveralls-url]: https://coveralls.io/github/akopytov/sysbench?branch=master [action-url]: https://github.com/akopytov/sysbench/actions/workflows/ci.yml [action-badge]: https://github.com/akopytov/sysbench/actions/workflows/ci.yml/badge.svg [license-badge]: https://img.shields.io/badge/license-GPLv2-blue.svg [license-url]: COPYING [release-badge]: https://img.shields.io/github/release/akopytov/sysbench.svg [release-url]: https://github.com/akopytov/sysbench/releases/latest [deb-badge]: https://img.shields.io/badge/Packages-Debian-red.svg?style=flat [deb-url]: https://packagecloud.io/akopytov/sysbench?filter=debs [rpm-badge]: https://img.shields.io/badge/Packages-RPM-blue.svg?style=flat [rpm-url]: https://packagecloud.io/akopytov/sysbench?filter=rpms