目录
[1.1 Linux(CentOs)上安装Sysbanch](#1.1 Linux(CentOs)上安装Sysbanch)
[1.2 数据库准备](#1.2 数据库准备)
[1.3 Sysbench常用脚本说明](#1.3 Sysbench常用脚本说明)
[1.4 Sysbench预埋数据库数据](#1.4 Sysbench预埋数据库数据)
[1.5 Sysbench运行压测](#1.5 Sysbench运行压测)
[1.6 清理数据](#1.6 清理数据)
[2.1 8核16G MySQL性能瓶颈与健康指标预期](#2.1 8核16G MySQL性能瓶颈与健康指标预期)
[2.2 单机常见配置](#2.2 单机常见配置)
一、Sysbanch安装和压测流程
1.1 Linux(CentOs)上安装Sysbanch
下载sysbench-master.zip:https://github.com/akopytov/sysbench
bash
# 安装依赖:gcc、make、mysql-devel(MySQL客户端库)
sudo yum install gcc gcc-c++ autoconf automake make libtool mysql-devel -y
# 上传sysbench-master.zip到Linux的/opt目录下,并解压
yum install -y unzip
cd /opt
unzip sysbench-master.zip
cd sysbench-master
# 生成 configure 文件
./autogen.sh
# 配置,指定 MySQL 库路径(默认会自动检测),添加 CFLAGS="-std=gnu99"
./configure --with-mysql-includes=/usr/include/mysql --with-mysql-libs=/usr/lib64/mysql
./configure CFLAGS="-std=c99"
# 编译
make -j$(nproc)
# 安装到系统(默认 /usr/local/bin)
sudo make install
#安装完成后验证
sysbench --version
1.2 数据库准备
需要创建一个专门用于测试的MySQL数据库和用户,这里省略
记录数据库地址、端口、数据库名称、用户名、密码
1.3 Sysbench常用脚本说明
Sysbench 提供了多种 Lua 脚本,位于 /usr/local/share/sysbench/:
oltp_read_only.lua:只读测试:只读时 QPS 会更高,CPU 可能更快饱和,延迟更低oltp_write_only.lua:只写测试:写入需要刷日志、加锁,TPS 通常低于读写混合,CPU 消耗可能更多在系统态oltp_read_write.lua:读写混合(约 14:4 的读写比例)oltp_delete.lua:删除测试oltp_update_index.lua:更新索引列oltp_update_non_index.lua:更新非索引列oltp_point_select:点查测试(随机主键查询),是评估 CPU 纯计算能力的好方法select_random_points.lua/select_random_ranges.lua:随机点/范围查询
可以根据需要选择对应的脚本,参数基本相同。
1.4 Sysbench预埋数据库数据
bash
sysbench /usr/local/share/sysbench/oltp_read_write.lua \
--mysql-host=127.0.0.1 \
--mysql-port=3306 \
--mysql-user=sbtest \
--mysql-password=sbtest123 \
--mysql-db=sbtest \
--tables=10 \
--table-size=100000 \
--threads=8 \
--time=60 \
prepare
-
oltp_read_write.lua:测试脚本路径,通常安装后位于/usr/local/share/sysbench/。 -
--tables=10:创建 10 张表。 -
--table-size=100000:每张表插入 10 万行数据。 -
--threads=8:准备数据时使用的并发线程数(可根据机器调整)。 -
--time=60:此参数在 prepare 阶段无效,但保留格式。
1.5 Sysbench运行压测
bash
sysbench /usr/local/share/sysbench/oltp_read_write.lua \
--mysql-host=127.0.0.1 \
--mysql-port=3306 \
--mysql-user=sbtest \
--mysql-password=sbtest123 \
--mysql-db=sbtest \
--tables=10 \
--table-size=100000 \
--threads=16 \
--time=300 \
--report-interval=10 \
run
-
--threads=16:模拟 16 个并发客户端。 -
--time=300:测试持续 300 秒。 -
--report-interval=10:每 10 秒输出一次中间统计。

结果字段示意:
| 字段 | 含义 |
|---|---|
thds: 16 |
当前并发线程数,即同时有 16 个连接在发请求 |
tps: 2342.99 |
Transactions Per Second,每秒完成的事务数(一个事务通常包含多条SQL) |
qps: 46876.75 |
Queries Per Second,每秒执行的SQL语句总数 |
(r/w/o: 32815.89/9373.37/4687.48) |
每秒SQL的细分: • r (read) = 32815.89 次读操作 • w (write) = 9373.37 次写操作(UPDATE/INSERT/DELETE) • o (other) = 4687.48 次其他操作(如BEGIN、COMMIT) |
lat (ms,95%): 10.27 |
95% 的请求延迟在 10.27 毫秒以内(排除最慢的5%) |
err/s: 0.00 |
每秒发生的错误数 |
reconn/s: 0.00 |
每秒重连次数 |
总体统计(SQL statistics)
| 字段 | 含义 |
|---|---|
read: 8999718 |
整个测试期间累计执行的读SQL总数 |
write: 2571348 |
累计写SQL总数 |
other: 1285674 |
累计其他SQL总数 |
total: 12856740 |
累计SQL总数 |
transactions: 642837 (2141.48 per sec.) |
总事务数,以及平均每秒事务数 |
queries: 12856740 (42829.65 per sec.) |
总查询数,以及平均每秒查询数 |
ignored errors: 0 |
忽略的错误数(此处为0,表示无错误) |
reconnects: 0 |
重连次数 |
吞吐量(Throughput)
| 字段 | 含义 |
|---|---|
events/s (eps): 2141.4825 |
每秒完成的事件(事务)数,与平均TPS一致 |
time elapsed: 300.1832s |
测试总耗时 |
total number of events: 642837 |
总事务数 |
延迟(Latency (ms))
| 字段 | 含义 |
|---|---|
min: 4.08 |
单个事务的最小延迟(毫秒) |
avg: 7.47 |
平均延迟 |
max: 417.72 |
最大延迟(可能有瞬时抖动) |
95th percentile: 7.17 |
95分位延迟,即95%的事务在 7.17 毫秒内完成 |
sum: 4799445.04 |
所有事务延迟的总和(用于计算平均值) |
线程公平性(Threads fairness)
| 字段 | 含义 |
|---|---|
events (avg/stddev): 40177.3125/3841.81 |
每个线程平均处理的事务数,标准差 3841.81,说明线程间负载略有差异(但在可接受范围) |
execution time (avg/stddev): 299.9653/0.09 |
每个线程的平均执行时间接近 300 秒(测试总时长),标准差极小,说明线程运行非常均衡 |
1.6 清理数据
测试结束后,可以删除测试表:
bash
sysbench /usr/local/share/sysbench/oltp_read_write.lua \
--mysql-host=127.0.0.1 \
--mysql-port=3306 \
--mysql-user=sbtest \
--mysql-password=sbtest123 \
--mysql-db=sbtest \
--tables=10 \
cleanup
二、MySQL压力测试标准及常见测试
2.1 8核16G MySQL性能瓶颈与健康指标预期
| 指标维度 | 瓶颈/健康参考值 | 关键说明与依据 |
|---|---|---|
| TPS (每秒事务数) | 瓶颈阈值 :2500 ~ 4500 健康基准 :> 3000 | 这是混合读写场景下的典型值。腾讯云官方压测显示,同规格实例在大数据集(超内存) 下混合读写TPS约2510 ;若为全缓存 场景可高达4703。 |
| QPS (每秒查询数) | 瓶颈阈值 :50000 ~ 80000 健康基准 :> 60000 | QPS通常为TPS的10-20倍。参考基准:同规格下点查询 (Point Select)QPS可达10.3万 (全缓存)至5.5万(大数据集)。 |
| 数据量阈值 | 瓶颈临界点 :> 32 GB 风险预警 :> 40 GB | 核心判断标准:活跃数据是否超过内存 。16G内存除去操作系统开销,InnoDB Buffer Pool通常配置为12GB左右。一旦热数据超过此值,就会产生磁盘I/O,性能开始显著下降。 |
| 内存使用率 | 正常区间 :80% ~ 90% 风险阈值 :> 95% | MySQL会尽力占用内存用于缓存。使用率持续高于95%且伴随Buffer Pool命中率下降时,才需关注。 |
| CPU使用率 | 正常区间 :< 80% 瓶颈阈值 :> 90% | 达到瓶颈时CPU往往是满负荷的。但如果CPU使用率低而TPS也上不去,说明瓶颈可能在磁盘I/O等待或锁竞争上。 |
| Buffer Pool命中率 | 优秀标准 :> 99% 性能预警 :< 95% | 这是衡量内存是否够用的核心指标。如果命中率低于99%,说明大量查询需要去磁盘读取数据,性能会急剧下降。 |
| RT (响应时间) | 平均延迟 :< 10 ms 长尾延迟(p99) :< 50 ms | 在未达到瓶颈时,简单点查询应在毫秒级。当磁盘I/O成为瓶颈或锁争用严重时,延迟会飙升。阿里云实测同规格下1.2亿数据点查询仅需5ms左右。 |
| 磁盘利用率 | 瓶颈阈值 :> 80% ~ 90% | 云磁盘通常有IOPS上限。当磁盘利用率持续100%时,意味着磁盘I/O已满,这是典型的"大数据集"场景瓶颈。 |
| IOPS使用率 | 瓶颈阈值 :与磁盘类型上限对比 | 普通云盘IOPS可能只有几千,而SSD云盘可达上万。若读写请求持续打满上限,I/O就是绝对瓶颈。建议监控iostat中的await(服务时间),超过10ms通常意味着磁盘压力大。 |
2.2 单机常见配置
sql
# 事务与数据安全
innodb_flush_log_at_trx_commit=1, #每次事务提交,都将redolog刷入磁盘
innodb_log_file_size=1572864000 #redolog磁盘日志文件大小,KB,这里1500MB,较大日志文件可以提供更好的写入性能,可设置为1G-4G,过大会导致数据库恢复时间变长
innodb_flush_method=O_DIRECT #指定InnoDB如何将数据刷新到磁盘。对于Linux系统,O_DIRECT 是推荐设置,可以绕过操作系统缓存,避免双重缓存,减少CPU开销。
SQL_LOG_BIN = 0; -- 关闭binlog,仅对当前会话有效,不影响其他连接,阿里云RDB不支持实时更改,取参数设置中改
sync_binlog=1, #每次事务提交,都将binlog刷入磁盘
async #binlog复制到其他机器是异步的,可能丢失部分数据
SHOW VARIABLES LIKE 'log_bin'; #验证是否关闭,若显示 OFF,则表示 binlog 已关闭。
transaction_isolation = 'READ-COMMITTED'; #隔离级别,读已提交
# 核心内存与连接参数设置
innodb_buffer_pool_size=12884901888 #缓存池,12G,一般为物理内存的50%~75%,缓存数据和索引
max_connections=8520 #最大并发连接数,设置太高会消耗大量内存,太低会导致连接被拒
thread_cache_size=100 #缓存线程数,一般建议为最大连接池的5%~10%
sort_buffer_size=1048576 #每次排序都会分配此大小内存,1M,设置过大会导致内存不足,建议从2M~4M开始调整
tmp_table_size=2097152 #自动创建内存临时表的最大大小,2M,超过则转换为磁盘表(GROUP BY、ORDER BY)
max_heap_table_size=67108864 #手动创建内存临时表的最大大小,64M,超过则转换为磁盘表(CREATE TABLE ... ENGINE = MEMORY)
back_log=3000 #在短时间内有大量连接请求时,设置的是连接请求的排队数量。如果瞬时并发连接很高,可以适当调大,如 500 - 1000。
#其他
lower_case_table_names=1 #表名不区分大小写
slow_query_log = 1 #开启慢查询日志
slow_query_log_file = /home/mysql/log/mysql/slow_query.log #慢查询日志位置
long_query_time = 1 # 慢查询阈值,单位秒
log_queries_not_using_indexes = OFF # (可选)记录未使用索引的查询,建议开启,这对优化很有帮助
log_slow_admin_statements = ON # (可选)记录管理类命令,如OPTIMIZE TABLE、ANALYZE TABLE等
-- 慢查询测试:使用 sleep 函数模拟一个执行2秒的查询
SELECT SLEEP(2);