14.9.8 性能基线与压力测试方法

性能基线与压力测试方法#

性能基线用于量化ProxySQL在稳定状态下的关键指标,为优化与容量规划提供可对比的参考。压力测试用于验证在高并发与异常条件下的可用性与稳定性,确保发布与变更可控。

1. 原理与流程草图#

文章图片

2. 性能基线定义与指标体系(含示例)#

  • 核心指标:QPS/TPS、平均/95/99分位响应时间、连接数、活跃线程、CPU/内存、网络吞吐、磁盘I/O、规则命中率、后端失败率。
  • ProxySQL层指标:frontend/backends连接数、Query Digest、query cache命中率、mysql_servers状态变化。
  • 业务指标:关键SQL耗时、失败率、超时率、端到端响应时间。

示例:采集ProxySQL内建统计

# 连接ProxySQL管理端口(默认6032)
mysql -uadmin -padmin -h 127.0.0.1 -P6032 -e "SELECT * FROM stats_mysql_global LIMIT 20;"
mysql -uadmin -padmin -h 127.0.0.1 -P6032 -e "SELECT * FROM stats_mysql_connection_pool;"
mysql -uadmin -padmin -h 127.0.0.1 -P6032 -e "SELECT * FROM stats_mysql_query_digest ORDER BY count_star DESC LIMIT 10;"

命令解释
- stats_mysql_global:全局统计,含查询量、失败量、延迟等。
- stats_mysql_connection_pool:后端连接池状态,定位饱和点。
- stats_mysql_query_digest:SQL摘要与耗时分布,用于热点分析。

3. 基线测试环境与数据准备(含命令)#

  • 环境一致性:与生产同版本、同配置、同拓扑,隔离外部干扰。
  • 数据规模:与生产相近的表结构与数据量,确保索引与统计表一致。
  • 负载模型:按真实读写比例、连接数、会话时长、热点数据分布构建。

示例:MySQL测试库初始化(sysbench)

# 安装sysbench(以Ubuntu为例)
sudo apt-get update && sudo apt-get install -y sysbench mysql-client

# 初始化测试数据(100万行,表名sbtest1..sbtest10)
sysbench /usr/share/sysbench/oltp_read_write.lua \
  --mysql-host=127.0.0.1 --mysql-port=3306 \
  --mysql-user=test --mysql-password=123456 \
  --mysql-db=sbtest --tables=10 --table-size=100000 \
  prepare

预期效果
- 生成10张表、每表10万行,满足读写混合压测需要。

4. 压力测试方法与流程(含命令)#

  • 基线建立:在稳定配置下逐级升压,记录指标趋势与拐点。
  • 峰值测试:并发提升至目标峰值1.2~1.5倍。
  • 持续稳定性测试:目标负载持续4~8小时。
  • 故障注入:模拟后端失效、延迟升高、网络抖动。

示例:基线与峰值压测(sysbench)

# 基线压测(并发32,持续5分钟)
sysbench /usr/share/sysbench/oltp_read_write.lua \
  --mysql-host=127.0.0.1 --mysql-port=6033 \
  --mysql-user=app --mysql-password=app123 \
  --mysql-db=sbtest --tables=10 --table-size=100000 \
  --threads=32 --time=300 --report-interval=10 run

# 峰值压测(并发128,持续2分钟)
sysbench /usr/share/sysbench/oltp_read_write.lua \
  --mysql-host=127.0.0.1 --mysql-port=6033 \
  --mysql-user=app --mysql-password=app123 \
  --mysql-db=sbtest --tables=10 --table-size=100000 \
  --threads=128 --time=120 --report-interval=10 run

命令解释
- --mysql-port=6033:通过ProxySQL客户端端口压测。
- --report-interval=10:每10秒输出一次统计,便于观察拐点。

示例:故障注入(后端摘除/恢复)

# 摘除某后端MySQL(将其权重置0并从runtime移除)
mysql -uadmin -padmin -h 127.0.0.1 -P6032 -e "
UPDATE mysql_servers SET weight=0 WHERE hostgroup_id=10 AND hostname='10.0.0.12';
LOAD MYSQL SERVERS TO RUNTIME; SAVE MYSQL SERVERS TO DISK;"

# 恢复后端
mysql -uadmin -padmin -h 127.0.0.1 -P6032 -e "
UPDATE mysql_servers SET weight=100 WHERE hostgroup_id=10 AND hostname='10.0.0.12';
LOAD MYSQL SERVERS TO RUNTIME; SAVE MYSQL SERVERS TO DISK;"

5. 工具安装与回放脚本(含示例)#

工具安装(RHEL/CentOS)

sudo yum install -y epel-release
sudo yum install -y sysbench mysql

真实SQL回放脚本(示例:slowlog转digest执行)

#!/bin/bash
# 文件:/opt/tools/replay.sh
# 用途:将采样SQL回放到ProxySQL,用于接近真实负载
SQL_FILE=/opt/tools/sql_sample.sql
mysql -h 127.0.0.1 -P6033 -uapp -papp123 sbtest < ${SQL_FILE}

预期效果
- 使用生产采样SQL回放,覆盖热点路径与复杂查询。

6. 结果分析与瓶颈定位(含命令)#

趋势分析与分层定位

# ProxySQL层:观察连接池与路由
mysql -uadmin -padmin -h 127.0.0.1 -P6032 -e "SELECT * FROM stats_mysql_connection_pool;"
mysql -uadmin -padmin -h 127.0.0.1 -P6032 -e "SELECT hostgroup, sum(time_us) AS total_us FROM stats_mysql_query_digest GROUP BY hostgroup;"

# MySQL层:慢查询与线程状态
mysql -h 127.0.0.1 -P3306 -uroot -p -e "SHOW GLOBAL STATUS LIKE 'Threads_running';"
mysql -h 127.0.0.1 -P3306 -uroot -p -e "SHOW GLOBAL STATUS LIKE 'Slow_queries';"

定位要点
- QPS上升但响应时间激增:检查ProxySQL线程池、连接池配置是否饱和。
- 规则过多导致路由耗时:精简匹配规则并优化优先级。
- 后端慢查询:结合stats_mysql_query_digest与MySQL慢日志。

7. 基线固化与回归验证(含示例)#

基线记录模板

# 文件:/opt/report/baseline_2024-01-01.md
# 记录版本、配置、硬件、数据规模、指标结果

回归验证命令

# 回归执行:固定参数重跑
sysbench /usr/share/sysbench/oltp_read_write.lua \
  --mysql-host=127.0.0.1 --mysql-port=6033 \
  --mysql-user=app --mysql-password=app123 \
  --mysql-db=sbtest --tables=10 --table-size=100000 \
  --threads=32 --time=300 --report-interval=10 run

预期效果
- 对比历史基线,确认性能回归或提升。

8. 排错清单(含命令)#

  • 压测无响应:检查ProxySQL端口与用户权限。
ss -lntp | grep 6033
mysql -uadmin -padmin -h 127.0.0.1 -P6032 -e "SELECT * FROM mysql_users;"
  • QPS低、延迟高:确认后端连接池不足或线程池饱和。
mysql -uadmin -padmin -h 127.0.0.1 -P6032 -e "SELECT * FROM stats_mysql_connection_pool;"
mysql -uadmin -padmin -h 127.0.0.1 -P6032 -e "SELECT * FROM stats_mysql_global WHERE variable_name LIKE 'Threads%';"
  • 规则命中异常:检查路由规则顺序与匹配条件。
mysql -uadmin -padmin -h 127.0.0.1 -P6032 -e "SELECT rule_id,active,match_pattern,destination_hostgroup,apply FROM mysql_query_rules ORDER BY rule_id;"

9. 练习题#

  1. 用sysbench建立100万行数据,运行32并发压测并输出QPS与95分位延迟,写入基线报告。
  2. 在ProxySQL中临时摘除一个后端节点,观察压测延迟变化并记录恢复时间。
  3. stats_mysql_query_digest中Top 5 SQL导出,分析其是否命中预期的读写分离规则。