共计 2265 个字符,预计需要花费 6 分钟才能阅读完成。
最近兼职的公司的 hk 的服务器突然报警内存和 cpu 已经负载使用过高!第一感觉就是 mysql 死锁了!
top 命令查看后发现负载的显示 load average: 10.01, 17.92, 26.23。这可以说已经很恐怖了。网站基本打开要 5 秒以上,完全影响了客户的体验。top 命令的同时,联系开发,开发只使用了 show full processlist 查看是否死锁命令。自己使用了 Rkhunter 扫描了服务器的漏洞,没有发现任何问题!
其实问题很明显是 mysql 的问题了 cpu 这么高明眼就看的出是死锁或者慢查询了!
随后自己登录服务器,使用了 show full processlist;
没有看到 time 时间过长,也没有看到 LOCK 关键字
mysql> show full processlist;
+------------+------+-----------+-----------------+---------+------+---------------------+-------------------------------------------------------------------------------------------------------------------------------------------------+
| Id | User | Host | db | Command | Time | State | Info |
+------------+------+-----------+-----------------+---------+------+---------------------+-------------------------------------------------------------------------------------------------------------------------------------------------+
| 10 | root | ip | NULL | Query | 0 | init | show full processlist |
| 10 | root | ip| aiw | Query | 0 | Crx | selc limit 0,40 | |
+------------+------+-----------+-----------------+---------+------+---------------------+-------------------------------------------------------------------------------------------------------------------------------------------------+
3 rows in set (0.00 sec)
随后排除 mysql 死锁问题! 只能从日志里面排查问题了!
mysql 配置慢查询日志,value 是 on 就是开启 off 就是关闭!我的是开启的所以是 on
mysql> show variables like '%slow_query_log%';
+---------------------+------------------------------------------+
| Variable_name | Value |
+---------------------+------------------------------------------+
| slow_query_log | ON |
| slow_query_log_file | /usr/local/mysql/var/localhosts-slow.log |
+---------------------+------------------------------------------+
2 rows in set (0.00 sec)
如果要修改。输入下面命令即可!
set global slow_query_log=1;
然后根据 slow_query_log_file 的值就可以看到慢日志查询的路径!
cat /usr/local/mysql/var/localhosts-slow.log
# Query_time: 30.769761 Lock_time: 0.000129 Rows_sent: 17 Rows_examined: 13613
# Query_time: 24.408612 Lock_time: 0.000092 Rows_sent: 0 Rows_examined: 124539
# Query_time: 24.179152 Lock_time: 0.000087 Rows_sent: 0 Rows_examined: 124539
# Query_time: 31.709510 Lock_time: 0.000134 Rows_sent: 0 Rows_examined: 124539
# Query_time: 30.108347 Lock_time: 0.000065 Rows_sent: 15 Rows_examined: 123307
明显可以看到一些慢查询的语句和查询时间,一条数据查询 20 多秒!(语句就不暴露出来了,安全问题)
随后联系开发告诉开发有问题的语句,开发在原有的 sql 语句上新增索引。
top 命令后 load average: 0.42, 1.12, 3.34 马上达到了服务器的正常范围!
我这次排查 mysql 慢查询导致大量占用服务器 cpu 负载过高的过程基本就是这个流程!