MySQL 压测实战之sysbench 从入门到精通(最新)
<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li><a href="#_label0">一、sysbench 基础介绍</a></li><ul class="second_class_ul"><li><a href="#_lab2_0_0">1. 安装 sysbench</a></li></ul><li><a href="#_label1">二、sysbench 压测 MySQL 核心流程</a></li><ul class="second_class_ul"><li><a href="#_lab2_1_1">1. 核心参数说明(通用)</a></li><li><a href="#_lab2_1_2">2. 提前准备 MySQL 环境</a></li></ul><li><a href="#_label2">三、常用压测场景实战</a></li><ul class="second_class_ul"><li><a href="#_lab2_2_3">场景 1:读写混合压测(oltp_read_write)</a></li><li><a href="#_lab2_2_4">场景 2:其他常用场景(仅替换核心参数)</a></li></ul><li><a href="#_label3">四、压测结果解读(核心指标)</a></li><ul class="second_class_ul"></ul><li><a href="#_label4">五、压测注意事项</a></li><ul class="second_class_ul"></ul><li><a href="#_label5">总结</a></li><ul class="second_class_ul"></ul></ul></div><p>你想全面了解如何使用 sysbench 对 MySQL 进行压测,包括安装、常用压测场景、参数配置和结果解读,我会从基础到实战一步步给你讲清楚。</p><p class="maodian"><a name="_label0"></a></p><h2>一、sysbench 基础介绍</h2>
<p>sysbench 是一款开源的、跨平台的多线程性能测试工具,支持对 CPU、内存、磁盘 I/O、数据库(主要是 MySQL)等进行压测,尤其在数据库压测中应用广泛,能模拟真实的读写负载,评估数据库的性能极限。</p>
<p class="maodian"><a name="_lab2_0_0"></a></p><h3>1. 安装 sysbench</h3>
<p><strong>环境说明</strong>:以 Linux(CentOS 7/8 或 Ubuntu)为例,推荐安装 1.0 及以上版本(新版语法更清晰)。</p>
<p>方式 1:包管理器安装(简单)</p>
<div class="jb51code"><pre class="brush:bash;"># CentOS/RHEL
yum install -y epel-release
yum install -y sysbench
# Ubuntu/Debian
apt update
apt install -y sysbench</pre></div>
<p>方式 2:源码编译安装(最新版本)</p>
<div class="jb51code"><pre class="brush:bash;"># 安装依赖
yum install -y make automake libtool pkgconfig libaio-devel mysql-community-devel git
# 克隆源码
git clone https://github.com/akopytov/sysbench.git
cd sysbench
# 编译安装
./autogen.sh
./configure --with-mysql-includes=/usr/include/mysql --with-mysql-libs=/usr/lib64/mysql
make -j$(nproc)
make install
# 验证安装
sysbench --version</pre></div>
<p class="maodian"><a name="_label1"></a></p><h2>二、sysbench 压测 MySQL 核心流程</h2>
<p>sysbench 压测 MySQL 分为 3 个核心步骤:<strong>准备测试数据</strong> → <strong>执行压测</strong> → <strong>清理测试数据</strong>。</p>
<p class="maodian"><a name="_lab2_1_1"></a></p><h3>1. 核心参数说明(通用)</h3>
<p>先熟悉常用的连接和压测参数,后续所有场景都会用到:</p>
<table><thead><tr><th>参数</th><th>说明</th></tr></thead><tbody><tr><td><code>--mysql-host</code></td><td>MySQL 服务器地址(默认 127.0.0.1)</td></tr><tr><td><code>--mysql-port</code></td><td>MySQL 端口(默认 3306)</td></tr><tr><td><code>--mysql-user</code></td><td>连接 MySQL 的用户名</td></tr><tr><td><code>--mysql-password</code></td><td>连接 MySQL 的密码</td></tr><tr><td><code>--mysql-db</code></td><td>测试用的数据库名(需提前创建)</td></tr><tr><td><code>--table-size</code></td><td>每个测试表的行数(核心参数,决定数据量)</td></tr><tr><td><code>--tables</code></td><td>测试表的数量</td></tr><tr><td><code>--threads</code></td><td>并发线程数(模拟并发用户数)</td></tr><tr><td><code>--time</code></td><td>压测持续时间(秒,默认 10)</td></tr><tr><td><code>--report-interval</code></td><td>每隔几秒输出一次压测进度(秒)</td></tr></tbody></table>
<p class="maodian"><a name="_lab2_1_2"></a></p><h3>2. 提前准备 MySQL 环境</h3>
<div class="jb51code"><pre class="brush:sql;">-- 1. 创建测试数据库
CREATE DATABASE IF NOT EXISTS sysbench_test;
-- 2. 创建有足够权限的用户(避免用 root 压测)
CREATE USER 'sysbench'@'%' IDENTIFIED BY 'Sysbench@123';
GRANT ALL PRIVILEGES ON sysbench_test.* TO 'sysbench'@'%';
FLUSH PRIVILEGES;</pre></div>
<p class="maodian"><a name="_label2"></a></p><h2>三、常用压测场景实战</h2>
<p>sysbench 对 MySQL 的压测主要有 4 个核心场景:<strong>只读(oltp_read_only)</strong>、<strong>只写(oltp_write_only)</strong>、<strong>读写混合(oltp_read_write)</strong>、<strong>纯插入(oltp_insert)</strong>,以下以最常用的「读写混合」为例讲解完整流程。</p>
<p class="maodian"><a name="_lab2_2_3"></a></p><h3>场景 1:读写混合压测(oltp_read_write)</h3>
<p>步骤 1:准备测试数据</p>
<div class="jb51code"><pre class="brush:bash;">sysbench oltp_read_write \
--mysql-host=127.0.0.1 \
--mysql-port=3306 \
--mysql-user=sysbench \
--mysql-password=Sysbench@123 \
--mysql-db=sysbench_test \
--table-size=1000000 \# 每个表 100 万行
--tables=10 \ # 共 10 个表(总数据量 1000 万行)
--db-driver=mysql \
prepare# 准备数据的核心指令</pre></div>
<ul><li>执行后,sysbench 会在 <code>sysbench_test</code> 库中创建 10 张名为 <code>sbtest1~sbtest10</code> 的测试表;</li><li>数据量根据服务器配置调整:低配服务器(1C2G)建议 <code>table-size=100000</code>,高配服务器(8C16G)可设 <code>table-size=5000000</code>。</li></ul>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025121916265535.png" /></p>
<p>步骤 2:执行压测</p>
<div class="jb51code"><pre class="brush:bash;">sysbench oltp_read_write \
--mysql-host=127.0.0.1 \
--mysql-port=3306 \
--mysql-user=sysbench \
--mysql-password=Sysbench@123 \
--mysql-db=sysbench_test \
--table-size=1000000 \
--tables=10 \
--threads=64 \# 64 并发线程(根据 CPU 核心数调整,一般为 CPU 核心数的 2 倍)
--time=60 \ # 压测持续 60 秒
--report-interval=10 \# 每 10 秒输出一次进度
--db-driver=mysql \
run# 执行压测的核心指令</pre></div>
<p>步骤 3:清理测试数据(压测完成后)</p>
<div class="jb51code"><pre class="brush:bash;">sysbench oltp_read_write \
--mysql-host=127.0.0.1 \
--mysql-port=3306 \
--mysql-user=sysbench \
--mysql-password=Sysbench@123 \
--mysql-db=sysbench_test \
--tables=10 \
--db-driver=mysql \
cleanup# 清理数据的核心指令</pre></div>
<p class="maodian"><a name="_lab2_2_4"></a></p><h3>场景 2:其他常用场景(仅替换核心参数)</h3>
<ul><li>只读压测:将 <code>oltp_read_write</code> 替换为 <code>oltp_read_only</code>;</li><li>只写压测:替换为 <code>oltp_write_only</code>;</li><li>纯插入压测:替换为 <code>oltp_insert</code>;</li><li>删改混合压测:替换为 <code>oltp_delete</code> 或 <code>oltp_update_index</code>。</li></ul>
<p class="maodian"><a name="_label3"></a></p><h2>四、压测结果解读(核心指标)</h2>
<p>压测结束后会输出详细结果,重点关注以下核心指标(以读写混合压测为例):</p>
<div class="jb51code"><pre class="brush:plain;">SQL statistics:
queries performed:
read: 103200# 读请求总数
write: 29486 # 写请求总数
other: 14743 # 其他请求(如事务提交)
total: 147429# 总请求数
transactions: 7371 (122.83 per sec.)# 核心:TPS(每秒事务数)
queries: 147429 (2456.60 per sec.) # QPS(每秒查询数)
ignored errors: 0 (0.00 per sec.)
reconnects: 0 (0.00 per sec.)
General statistics:
total time: 60.0010s# 实际压测时长
total number of events: 7371 # 总事务数
total time taken by event execution: 3836.1251s # 所有线程执行事件的总耗时
response time:
min: 19.02ms# 事务最小响应时间
avg: 520.43ms # 事务平均响应时间
max: 2980.15ms # 事务最大响应时间
95th percentile: 1200.50ms # 95%事务的响应时间(重点关注)</pre></div>
<ul><li><strong>核心指标</strong>:TPS(每秒事务数)、QPS(每秒查询数)越高越好;95th percentile(95%响应时间)越低越好;</li><li><strong>参考标准</strong>:8C16G 服务器 + MySQL 8.0,读写混合压测 TPS 一般能达到 1000+,QPS 20000+,95% 响应时间 < 1s 为正常。</li></ul>
<p class="maodian"><a name="_label4"></a></p><h2>五、压测注意事项</h2>
<ol><li><strong>压测环境隔离</strong>:不要在生产库直接压测,单独搭建和生产配置一致的测试环境;</li><li><strong>参数调优</strong>:压测前可先优化 MySQL 核心参数(如 <code>innodb_buffer_pool_size</code>、<code>max_connections</code>、<code>innodb_flush_log_at_trx_commit</code>);</li><li><strong>逐步增加并发</strong>:从低并发(如 8、16)开始,逐步增加到 64、128,找到数据库的性能拐点;</li><li><strong>监控配套</strong>:压测时用 <code>top</code>、<code>iostat</code>、<code>vmstat</code> 监控服务器 CPU、磁盘 IO、内存使用,定位性能瓶颈(如 IO 打满则需优化磁盘,CPU 打满则需优化 SQL 或数据库参数)。</li></ol>
<p class="maodian"><a name="_label5"></a></p><h2>总结</h2>
<ol><li>sysbench 压测 MySQL 的核心流程是「准备数据 → 执行压测 → 清理数据」,核心参数需关注 <code>table-size</code>(单表行数)、<code>tables</code>(表数量)、<code>threads</code>(并发数);</li><li>核心压测指标为 TPS(每秒事务数)、QPS(每秒查询数)、95% 响应时间,前两者越高、后者越低,数据库性能越好;</li><li>压测时需隔离环境、逐步增加并发,并结合服务器监控定位性能瓶颈,而非仅看数值。</li></ol>
頁:
[1]