MySQL 性能问题排查

一月份上线了一个新的APP版本后导致MySQL的性能急剧下降。机器的io近几天基本一直都是 100% 状态,于是开始调MySQL的性能。

慢日志

首先查看的时慢日志。因为近几天io都是100%,每秒的慢日志已经到了几十的量级,由于io的下降,导致很多原本不应该慢的查询也都在慢查询日志里面。肉眼已经很难看了。 这时,就要使用percona的工具,pt-query-digest了。

pt-query-digest /var/log/mysql/mysql-slow.log | vim -

分析结果会在vim里面打开。pt-query-digest会根据查询花费的时间排序,按照顺序往下看,一个一个的看,是不是该建的索引没建,或者建的不合适,导致 查询没用上索引。

show processlist

慢日志一般能够解决很大的一部分问题,但是有些查询很拖累性能,但是他单条查询的时间并不长,不会出现在慢日志中。

这时候,一般可以用 pt-query-digest 的 --processlist 参数,对 MySQL 以一定的时间间隔执行 show processlist

pt-query-digest --user user_name --password pass_word --processlist localhost --interval 0.01 --run-time 10m | vim -

抽样分析的结果同样会在 vim 中显示。 依次分析每条语句。

tcpdump

如果 show processlist 还是没办法找到性能瓶颈,那就只好使用 tcpdump ,抓取 MySQL 的所有查询,放到 pt-query-digest 里面分析了。

tcpdump -s 65535 -x -nn -q -tttt -i any -c 99999 port 3306 | pt-query-digest --type tcpdump --run-time 600s | vim -

这会分析10分钟内 MySQL 所有的查询,依次排查就可以了,一般到这步基本都是可以定位到瓶颈。

找到瓶颈以后,建立合适的索引,问题解决。