PHP在周一到周五的同一时间点击100%CPU并吃掉RAM

我们在英国为小学开设了一个学习平台,并且运行得非常好。 然而在星期一到星期五的下午四点左右,我们看到同样的问题出现–1-2个PHP线程会跳到100%的CPU,并逐渐开始吞噬内存,直到服务器崩溃。

我们的请求中有98%是HTTPS,它们进入我们的第7层负载均衡器,然后解密SSL数据,添加X-HTTP-Forwarded-For头并将数据转发到应用服务器(我们有2个时刻)。我们的应用服务器在端口80上有Varnish,它接受来自负载均衡器的请求,并将请求通过端口81传递给Nginx。然后Nginx会计算出需要使用哪个“虚拟主机”,并通过任何PHP处理通过在套接字上监听的PHP-CGI(通过spawn-fcgi进行pipe理)。 有一个Memcached的实例也在运行,MySQL运行在一个单独的服务器/从属设置上。

在整个一天中,任何应用服务器的负载通常不会高于0.8,但是在下午4点左右,我们会遇到问题。 当他们引发问题时,我设法在一些实际的线程上运行strace ,而且我总是看到相同的东西:

 stat("/usr/share/zoneinfo/Europe/London", {st_mode=S_IFREG|0644,st_size=3661, ...}) = 0 stat("/usr/share/zoneinfo/Europe/London", {st_mode=S_IFREG|0644,st_size=3661, ...}) = 0 

这是无限的重复,永远不会停止,直到你SEGKILL过程或oomkiller杀死它。 当时没有计划运行的cron作业,而且我也没有办法看到Nginx请求与正在运行的PHP进程关联的是什么。

我们正在运行PHP 5.3.14,我们从上周的5.3.8升级到排除旧版本的问题。 这个问题已经持续了几个月,我们不知道是什么原因造成的。 我们非常频繁地部署我们的软件,所以很难find可能引发问题的特定版本 – 尤其是因为我们不知道这个问题首次发生的date。 Varnish是3.0.1版本,Nginx是1.0.6(据我所知现在大概有一岁了),我们的服务器运行的CentOS版本5.7(最终),他们有3.07Ghz英特尔i3 540s和8GB内存。

Debian邮件列表上有关于非常相似的东西的讨论,你可以在这里find。

有没有人在过去看过这样的事情,有没有人有任何想法或build议? 有没有办法将一个Nginx请求直接链接到一个PHP线程? 有没有更好的方法来看看PHP过程在做什么? (我见过GDB提到,但我将不得不重新编译PHP)

谢谢!

我发现问题是,这是Internet Explorer。 在我们的CSS中有一个对.htc文件的错误提示,由于某种原因,这个文件被发送到PHP进行处理。 PHP不知道如何处理一个.htc文件,结果疯了,并消耗服务器上的所有可用资源。

从评论的额外信息,我认为我们可以安全地承担问题发生在负载峰值 – 在线用户数量每日峰值(S)。 没有固定的确切时间,有时在其他时间发生,其他时间有效地排除像cron作业的资源。

这可能听起来很疯狂,但是从增加MySQL最大连接数限制开始 – 当连接数超过限制时,我发现PHP中运行的奇怪的事情发生在FCGI上,与您遇到的问题不同。