记录一次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占用

至此问题解决

经验分享 程序员 微信小程序 职场和发展