Mysql 连接数、IOPS、CPU、网络流量之间的关系

690 阅读2分钟

MySQL 线程执行时间及连接数多导致的cpu居高问题排查常用指令记录

image.png

通常MySQL的最大连接数默认为100,最大连接数可达16384。

当 cpu 飙升到 100%时, 先用操作系统命令 top 命令观察是不是 mysqld 占用导致的, 如果不是,找出占用高的进程,并进行相关处理。 如果是 mysqld 造成的, show processlist,看看里面跑的 session 情况, 是不是有消耗资源的 sql 在运行。

找出消耗高的 sql,看看执行计划是否准确, index 是否缺失,或者实在是数据量太大造成。

一般来说,肯定要 kill 掉这些线程(同时观察 cpu 使用率是否下降), 然后进行相应的调整(比如说加索引、改 sql、改内存参数)之后,再重新跑这些 SQL。

也有可能是每个 sql 消耗资源并不多,但是突然之间,有大量的 session 连进来导致 cpu 飙升, 这种情况就需要跟应用一起来分析为何连接数会激增

临时解决办法


查询线程及相关信息 (ID 为此线程IDTime为线程运行时间,Info为此线程SQL)

SHOW FULL PROCESSLIST

-- 上面的语句等同于下面,只不过information_schema 这个表的权限可能没有
SELECT * FROM information_schema.processlist

SELECT * FROM information_schema.processlist limit 200,200


-- 查看正在执行的线程,并按 Time 倒排序,看看有没有执行时间特别长的线程
SELECT * FROM information_schema.processlist WHERE Command != 'Sleep' 
ORDER BY TIME DESC;



--  找出所有执行时间超过 5 分钟的线程(排除守护线程),拼凑出 kill 语句,方便后面查杀 (此处 5分钟 可根据自己的需要调整SQL标红处)可复制查询结果到控制台,直接执行,杀死堵塞进程
SELECT CONCAT('kill ', id, ';') FROM information_schema.processlist WHERE Command != 'Sleep' AND Command != 'Daemon' AND TIME > 300 ORDER BY TIME DESC;