
直接用 SHOW GLOBAL STATUS 算实时 QPS/TPS 是可行的,但必须做两次采样取差值——单次查询毫无意义。
为什么不能只查一次 SHOW GLOBAL STATUS?
所有指标(Queries、Com_commit、Com_rollback)都是自实例启动以来的累计值。比如 Queries=125840 这个数字本身不告诉你负载高低,只说明“总共执行过这么多语句”。要看出压力,得看它“每秒涨多少”。
常见错误现象:
- 脚本只取一次
Queries就除以 1 秒,结果是启动至今的平均值,完全失真 - 用
Uptime值代替采样时间差,忽略了脚本执行延迟,导致分母偏大、QPS/TPS 被低估
mysqladmin -r -i1 extended-status 是最简盯屏方案
这个命令自带差值计算(-r 参数),配合 -i1 每秒刷新,适合终端临时观察。关键点在于过滤和对齐字段:
mysqladmin -uroot -S /var/lib/mysql/mysql.sock -r -i1 extended-status | awk '/Queries|Com_commit|Com_rollback|Threads_running/ {print $2,$4}'-
$2是变量名(如Queries),$4是当前值;-r会让第二次起显示的是增量而非累计值 - 注意:第一次输出是“基准值”,从第二次开始才是真实每秒增量,盯屏时忽略第一行
- 如果看到
Com_commit长期为 0,检查是否所有写操作都用了自动提交(autocommit=1),此时事务由引擎隐式提交,不计入Com_commit
Shell 脚本采集必须记录真实时间差
手动 sleep 1 秒不等于真实间隔 1 秒——进程调度、IO 延迟都会引入误差。正确做法是用两次 Uptime 的差作为分母:
- 先执行
mysqladmin status,提取Queries和Uptime(第 1 列和第 6 列) - sleep 后再执行一次,得到
Q2、U2 - QPS = (
Q2−Q1) / (U2−U1),TPS 同理用Com_commit + Com_rollback差值除以 uptime 差 - 不要在
~/.my.cnf里明文写密码;设权限chmod 600 ~/.my.cnf,否则mysqladmin会报错或泄露凭证
别把 INNODB_TRX 的 COUNT 当 TPS
SELECT COUNT(*) FROM information_schema.INNODB_TRX 返回的是“当前未提交事务数”,不是“每秒完成多少事务”。这两个概念完全不等价:
- 高并发下,
INNODB_TRX可能长期维持几十上百,但 TPS 可能只有个位数(长事务堆积) - 短平快事务场景下,
INNODB_TRX常为 0,但 TPS 可达数千 - 查
INNODB_TRX还可能被 metadata lock 阻塞,拖慢监控采集,干扰业务 - 真正反映事务吞吐压力的,始终是
Com_commit + Com_rollback的单位时间增量
实际部署时最容易被忽略的是采样精度与账号权限的平衡:高频采样(如 1 秒)会增加 performance_schema 开销,而低权限账号又可能看不到 Com_* 变量。建议用专用监控账号,授予 PROCESS 权限即可,不必给 SUPER。











