记录一次mysql数据库CPU占用异常高的处理
1、服务器情况
处理器 Intel(R) Xeon(R) CPU E5-2620 v4
内存 32GB
2、数据库版本 5.7.38
3、数据库引擎InnoDB
单表数据量300W左右,有主键,无索引
主键可以理解为一个有序索引
前提介绍完毕
晚间有一个springboot程序一直报错
java.io.IOException: UT010029: Stream is closed
可能是程序有重复关闭的资源导致,重复查看代码并没有发现有异常
逐步排查发现还报错
Too many open files
可能是文件打开数不足导致
打开 /etc/security/limits.conf 在末尾添加:
* hard nofile 500000
* soft nofile 500000
重新登陆后生效
也可以 ulimit -n 65535 临时生效
打开 /etc/sysctl.conf
在末尾添加:
fs.file-max = 655350
sysctl -p
立即生效
或者
echo 6553560 > /proc/sys/fs/file-max
以上操作做完有所缓解
top 查看cpu 占用从1200% 到了 1000%,继续排查
通过navicate的服务器监控工具看到
有程序一直执行select count(*) where ids=xxxx name =00000
看起来是想判断这条数据是否存在,从程序日志验证也是在查找,如果指定时间不返回数据,就会导致数据重传
手动执行一次发现每次7秒左右,这会导致业务阻塞,其他程序疯狂重试,恶性循环
相当于全扫描,因为这个大表没有索引,由于表算是不重要的临时表,数据最终已经去其他地方了,直接将表中数据清理到一周左右5万条
结果发现又是好了一点点,cpu 1000%占用 到 400%占用
optimize table tab
上面语句执行在0.1秒内,丝滑流畅
重建索引过后,瞬间下降CPU占用
至此问题解决