PHP-FPM使用40%CPU进行单个请求

时间:2013-07-13 18:47:12

标签: wordpress nginx amazon-ec2 php

(我在Google上搜索并搜索了几个小时,发现了一些主题,但没有一个适合我)

我正在使用 Wordpress 清漆 + Nginx + PHP-FPM + APC + W3总缓存 + PageSpeed

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


只有1个请求( 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管理员

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

  

警告:[pool www]服务器达到max_children设置(10),考虑提高它

我将该值提高到20,同样的问题。

我正在使用pm=ondemandpm.max_children=10pm.max_requests=500)。

最初我使用的是pm=dynamicpm.max_children=10pm.start_servers=1pm.min_spare_servers=1pm.min_spare_servers=2pm.max_requests=500),它也遇到了同样的问题。

任何人都可以提供帮助,PLZ?任何帮助将不胜感激!

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)

3 个答案:

答案 0 :(得分:4)

首先减少缓存堆栈。为什么在使用已经从内存中提供服务的w3缓存时使用从内存中提供页面的varnish?

W3cache是​​CPU密集型的!它不仅可以缓存项目,还可以动态压缩,缩小和合并文件。

你的机器总共有512MB的内存不是很多,而且你的CPU功率还不如现代智能手机。由于xen虚拟化层,与根服务器相比,内存访问速度极慢 - 这就是为什么更少的更多。

确保正确设置了w3cache,以便它实际缓存项目,然后预热缓存,你应该没问题。

看一下Googles nginx pagespeed模块https://github.com/pagespeed/ngx_pagespeed,它可以做同样的事情w3cache,效率更高,因为它发生在网络服务器上,而不是PHP中

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

答案 1 :(得分:1)

问题解决了!

对于那些遇到同样问题的人:

  1. 检查清漆配置;

  2. 检查Wordpress的插件;

  3. 1)在我的情况下,TTL没有在Varnish中配置,因此没有任何缓存。 这个配置对我有用:

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

    2)页面加载后的高CPU使用率是由一个名为“Scroll Triggered Box”的Wordpress插件引起的。

    页面加载后它正在做一些AJAX。我禁用了该插件并停止了高负载。

答案 2 :(得分:0)

这里有两个因素:

  1. 您正在使用具有可突发CPU配置文件的微实例。它可以爆发到2个ECU,然后被限制在远低于1(有些估计将其设置在0.1 - 0.2 ECU左右)

  2. 以管理员身份登录时,wordpress缓存插件经常绕过或减少缓存。如果您希望一直进行缓存,W3应该允许您切换它。