由Discuz论坛插件导致阿里云ECS云主机CPU 100%的解决过程
查看top,命令结果如下:
检查过程中经常出现2个高CPU的PHP进程,但是截这张图的时候只有一个。
再来看下php-fpm的配置:
在这里发现了一个坑死人不偿命的配置,PHP进程最高只能有2个(截图的时候已经被我修改为了20,修改之前是2),所以当这两个PHP进程都出问题的时候,再就没有PHP进程干活了,于是网站就打不开了。
那么来看看PHP进程到底发生了什么问题:
PHP进程进入到了死循环,而且这个错误信息是由于网络连接导致的。
再来看看PHP到底在连接哪台主机:
可以看到云主机上的PHP进程正在请求220.181.136.41的80端口。
再来看看这个IP到底是哪路神仙:
可以发现,这是sinaapp云平台的IP。
于是到网站根目录里grep查找sinaapp,找到了这个程序:
来看看addon.sinaapp.com的IP:
看看这个地址是干什么的:
跟客户确认:
至此问题已经查清,是由于这个验证插件在addon.sinaapp.com上的接口没有正常运行,导致的本地PHP出错并进入死循环。
对PHP开发者的一点提示:在php5.2.x版本中使用curl方式抓取网络内容超时会导致CPU飙升,但是在5.3+版本中已经修复了这个问题,抓取超时对CPU几乎没有影响。
PHP抓取远程内容最好的方式是curl,不过很多程序可能是出于兼容性的考虑,使用了fsockopen方式来抓取远程内容(curl需要模块支持,虽然大多数环境都已经安装,但不排除少量的没有安装,fsockopen则是PHP内置的函数)。fsockopen超时时在不同PHP版本中的CPU消耗没有测试过,有兴趣的可以研究下。
原创文章,转载请以超链接方式注明出处:http://www.yundaiwei.com/post/269.html