MySQL数据库压力测试:Sysbanch

目录

一、Sysbanch安装和压测流程

1.1 Linux(CentOs)上安装Sysbanch

1.2 数据库准备

1.3 Sysbench常用脚本说明

1.4 Sysbench预埋数据库数据

1.5 Sysbench运行压测

1.6 清理数据

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

2.1 8核16G MySQL性能瓶颈与健康指标预期

2.2 单机常见配置


一、Sysbanch安装和压测流程

1.1 Linux(CentOs)上安装Sysbanch

下载sysbench-master.zip:https://github.com/akopytov/sysbench

# 安装依赖: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预埋数据库数据

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运行压测

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.99Transactions Per Second,每秒完成的事务数(一个事务通常包含多条SQL)
qps: 46876.75Queries 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.2795% 的请求延迟在 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.1795分位延迟,即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 清理数据

测试结束后,可以删除测试表:

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 单机常见配置

# 事务与数据安全
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);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

熙客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值