sql执行快并不代表没有问题,排查一起“快”sql引发的数据库高负载

接到一起数据库故障,用户反馈主机cpu频繁告警,操作系统只安装了数据库,查看mysql后没有发现error日志,pt-query-digest分析最近1一个月的slow log,没有找到慢SQL。

数据库主机负载很高,但是找不到慢sql,那么原因出在哪了?

排查过程
  • perf top分析cpu高的函数
    查看cpu耗时长的函数,都属于常规的大接口,除了软中断引发关注外,没发现其他异常函数调用。但是从这里可以看出,cpu资源几乎都被mysql服务使用了,且数据库负载较大。
    sql执行快并不代表没有问题,排查一起“快”sql引发的数据库高负载-1

  • 查看show engine innodb status
    这里再次印证了数据库高负载。如下图,数据库查询非常大,reads/s每秒查询达到了280万行,这已是普通虚拟机的极限了。
    sql执行快并不代表没有问题,排查一起“快”sql引发的数据库高负载-2

扩展
inserts/s、updates/s、deletes/s表示数据库TPS。一般好点的机器,TPS可以跑到4000多。

  • 查看AHI信息
    粗略计算,数据库AHI命中率约88%,这个值已经非常高了,所以也很好解释上文perf top中AHI相关函数调用高的问题。
    sql执行快并不代表没有问题,排查一起“快”sql引发的数据库高负载-3
  • 查看fsync()调用执行情况
    读写线程、缓冲池线程、日志线程均无IO受限情况,读、写和fsync()调用执行的数目也合理,这里没有问题。
    sql执行快并不代表没有问题,排查一起“快”sql引发的数据库高负载-4

总结