首页 > 技术分享 > MySQL
收藏

解决MySQL占用CPU超过100%的问题

12/18 11:54
大潇博客 原创文章,转载请标明出处

服务器系统为Debian,上面装了LANP环境,并且有很多web项目,一直运行正常,但有天下午开始,网站访问变得很卡,MySQL连接时断时续,开始以为是网络波动或者其它小问题影响了服务的稳定性,观察了半天,发现还是很卡,于是开始查找原因。


首先登录服务器,把nginx、mysql、php全部重启,发现没有效果,输入“top”后,看到mysqld占用cpu比例高达200%~700%之间(8核CPU),原来问题是直接出现在mysql中


在服务器上执行mysql -u root -p之后,输入:set long_query_time=1;把慢查询时间设置为1秒,输入:show status like 'slow_queries';查询慢查询语句数量,结果返回0,证明mysql当前的高运行不是因为某些sql语句导致


再输入show full processlist; 可以看到正在执行的语句,发现正在执行的sql语句并不多,但是执行用户出现了大量“unauthenticated user”,这是未经证实的用户,于是怀疑,难道被黑客攻击了吗?但是仔细一看,所有连接均为localhost,排除攻击的可能


百度了一下,查到了解释:

不管连接是通过hosts还是ip的方式,MySQL都会对DNS做反查,IP到DNS,由于反查的接续速度过慢(不管是不是isp提供的dns服务器的问题或者其他原因),大量的查询就难以应付,线程不够用就使劲增加线程,但是却得不到释放,所以MySQL会“假死”。


解决的方案很简单,结束这个反查的过程,禁止任何解析。


打开mysql的配置文件(my.cnf),在[mysqld]下面增加一行:


skip-name-resolve


重新载入配置文件或者重启MySQL服务即可。


需要注意,这个配置生效后,127.0.0.1就不能连接mysql,只能使用localhost(用ip连接:skip-name-resolve在配置文件里设置成on, 然后重启mysql )


打赏

阅读排行

大家都在搜

博客维护不易,感谢你的肯定
扫码打赏,建议金额1-10元
  • 15601023311