PHP-FPM对单个请求使用40%的CPU


PHP-FPM using 40% CPU for a Single Request

(我在这个论坛上搜索了几个小时,找到了一些主题,但没有一个对我有用)

我使用的Wordpress带有:Varnish+Nginx+PHP-FPM++APC+W3总缓存页面速度

当我使用Varnish时,第一次调用www.mysite.com时,它只占用了10%的CPU。第二次调用时,它将被缓存。问题是在URL中传递请求参数


对于仅一个请求(www.mysite.com?1=1),它显示在top:中

PID  USER      PR  NI  VIRT  RES  SHR S %CPU %MEM   TIME+  COMMAND
7609 nginx     20   0  438m  41m  28m S 11.6  7.0   0:00.35 php-fpm
7606 nginx     20   0  437m  39m  26m S 10.3  6.7   0:00.31 php-fpm

页面完全加载后,上面的这些进程仍然处于活动状态。2秒钟后,它们被另外2个php fpm进程(如下)所取代,这些进程将激活3秒钟。

PID USER       PR  NI  VIRT  RES  SHR S %CPU %MEM   TIME+  COMMAND
7665 nginx     20   0  444m  47m  28m S 20.9  7.9   0:00.69 php-fpm
7668 nginx     20   0  444m  46m  28m R 20.9  7.9   0:00.63 php-fpm

40%CPU仅用于1个未缓存的请求!


奇怪的事情:

  • 加载页面后CPU使用率更高
  • 当我清除缓存(W3和Varnish)时,只需要10%的CPU就可以加载未缓存的页面
  • 这种高CPU使用率只是通过请求参数或在Wordpress Admin中发生的

当我尝试执行10请求时(按F5键10x),服务器停止服务,并在php fpm日志中显示:

警告:[pool www]服务器已达到max_children设置(10),请考虑将其提升为

我把这个数值提高到20,同样的问题。

我使用的是pm=ondemandpm.max_children=10pm.max_requests=500)。

初始I使用pm=dynamicpm.max_children=10pm.start_servers=1pm.min_spare_servers=1pm.min_spare_servers=2pm.max_requests=500),也发生了同样的问题。

有人能帮忙吗?任何帮助都将不胜感激!

PS:

  • APC开启(98%命中,2%未命中)
  • 服务器Amazon Micro(613MB RAM)
  • PHP 5.3.26(fpm-fcgi)
  • Linux版本3.4.48-45.46.amzn1.x86_64 Red Hat 4.6.3-2(我认为它基于CentOS 5)

首先减少缓存堆栈。既然你已经在使用w3缓存,那么为什么还要使用从内存提供页面服务的清漆呢?

W3cache占用大量CPU!它不仅可以缓存项目,还可以动态压缩、缩小和合并文件。

你的机器上总共有512MB的内存,这并不算多,而且你的CPU功率也低于现代智能手机。由于xen虚拟化层的原因,与根服务器相比,内存访问非常慢——这就是为什么少即是多。

请确保w3cache设置正确,这样它就可以真正缓存项目,然后预热您的缓存,您就可以了。

看看谷歌的nginx页面速度模块https://github.com/pagespeed/ngx_pagespeed,它可以做与w3cache相同的事情,只是效率高得多,因为它发生在Web服务器中,而不是在PHP 中

Nginx也可以直接从memcached服务http://www.kingletas.com/2012/08/full-page-cache-with-nginx-and-memcache.html(示例文章,可能需要更多的调查)

问题解决了!

对于那些有同样问题的人:

  1. 检查清漆配置;

  2. 检查Wordpress的插件;

1) 在我的案例中,没有在Varnish中配置TTL,所以没有缓存任何内容。这个配置对我有效:

sub vcl_fetch {
    if (!(req.url ~ "wp-(login|admin)")) {
            unset beresp.http.set-cookie;
            set beresp.ttl = 48h;
    }
}

2) 页面加载后的高CPU使用率是由Wordpress插件"Scroll Triggered Box"引起的。

页面加载后,它正在进行一些AJAX操作。我禁用了那个插件,高负载停止了。

这里有两个因素在起作用:

  1. 您使用的微型实例具有可中断的CPU配置文件。它可以爆发到2个ECU,然后限制在远小于1的范围内(一些估计大约为0.1-0.2个ECU)

  2. 当以管理员身份登录时,wordpress缓存插件通常会绕过或减少缓存。如果您想一直打开缓存,W3应该允许您切换此选项。