客户遇到的问题如下:

查看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消耗没有测试过,有兴趣的可以研究下。 |