MySQL数据库压力测试:Sysbanch

目录

一、Sysbanch安装和压测流程

[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 清理数据)

二、MySQL压力测试标准及常见测试

[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);
相关推荐
LaughingZhu2 小时前
Product Hunt 每日热榜 | 2026-04-20
前端·数据库·人工智能·经验分享·神经网络
2301_775148152 小时前
PHP与Suno音乐生成AI集成开发音频应用【操作】
jvm·数据库·python
你觉得脆皮鸡好吃吗2 小时前
什么是SQL注入(入门详解)
数据库·sql·网络安全
2401_897190552 小时前
SQL数据更新时如何减少锁表时间_合理控制事务边界与并发
jvm·数据库·python
HalvmånEver2 小时前
MySQL数据库操作
linux·数据库·学习·mysql
2301_782659182 小时前
如何处理SQL大型数据表JOIN超时_分批查询与临时表存储方案
jvm·数据库·python
InfinteJustice2 小时前
C# 文件上传的服务器端加密 C#如何在存储到S3或Azure Blob时启用加密
jvm·数据库·python
m0_377618232 小时前
老旧电脑适合用哪种HTML函数工具_低配设备适配方法【方法】
jvm·数据库·python
21439652 小时前
宝塔面板网站无法发邮件怎么办_检查PHP函数与SMTP配置
jvm·数据库·python