一次服务器CPU负载高的排查及解决
工作使我快乐,这句话说出来我自己都不信,工作中总会有解决不完的问题,往往前一个Bug解决了,后一个Bug就接踵而来,我们不是在解决Bug,就是在解决Bug的路上。但是,也正因为这种不断的解决问题,不断的突破,才对这份工作有了乐趣,并为之努力。
其实对于每一个项目来说,她就像是我们的“孩子”一样,总想让他变得好一点,再好一点…
背景
为了杜绝不良网名对我们的服务器IP进行直接访问,我在nginx配置那里做了一些“小小的”调整,如下:
1 | server { |
大家估计也看出来了,就是我想让不明地址、IP访问都跳转到我们主站上。
表现
重启nginx服务后,我们服务器上所有存在的网站访问就出问题了。具体表现为:只要访问任何一个存放在服务器上的网站,服务器的CPU立马高负载(15~20%),导致再次访问时会进入一直pedding状态。
这可不行啊,要知道我们所有的网站都是在Google上投放广告的,一旦网站出现问题,google就会据登广告,这将会给广告商带来大大的损失,于是我放下了手头的工作,马上进行了排查。
过程
首先,我以为是近期更新网站时代码里某一处出了错误,于是我关掉了进行更新过的插件,然而,问题依旧存在;
然后,不是代码的问题,那可能是php-fpm进程太多导致的?查看了一下php-fpm的错误日志,都是一些Notice,并没有Erroor,所以这里也可以排除掉;
那么,再就是用户量太大?看一下Zabbix监控吧,发现CPU负载从早上10.30开始一直高负荷;那再看一下网站流量吧,从前一天晚上11点开始后就有大量的流量进来,也就是用户量激增到平时的十多倍。
昨晚11点干啥了?就是改nginx的配置了啊,那改了哪一处呢?病原在这儿:
1 | rewrite ^(.*)https://www.abc.com permanent; |
我理解的是他把无效域名和IP都转发到了我们的主战,从而引来了大量的不速之客(大流量),占完了CPU资源,导致后面进来的用户就会pedding状态,把这里改一下:
1 | server { |
总结
工作使我快乐,善待每一次线上版本的修改及理清处理问题的排查思路,今天就到这儿了。