【问题标题】:PHP-FPM using 40% CPU for a Single RequestPHP-FPM 使用 40% CPU 处理单个请求
【发布时间】:2013-07-12 01:47:57
【问题描述】:

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

我正在使用 Wordpress 与:Varnish + 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 键 10 次),服务器停止服务并在 php-fpm 日志中出现:

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

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

我正在使用pm=ondemand(pm.max_children=10 和pm.max_requests=500)。

最初我使用的是pm=dynamic(pm.max_children=10,pm.start_servers=1,pm.min_spare_servers=1,pm.min_spare_servers=2,pm.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)

【问题讨论】:

    标签: wordpress nginx amazon-ec2 php


    【解决方案1】:

    首先减少缓存堆栈。当你已经使用 w3 缓存并且也从内存提供服务时,为什么还要使用从内存提供页面的清漆?

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

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

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

    看看谷歌的 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 提供服务(示例文章,可能需要更多调查)

    【讨论】:

      【解决方案2】:

      问题解决了!

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

      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 插件引起的。

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

      【讨论】:

        【解决方案3】:

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

        1. 您正在使用具有可突增 CPU 配置文件的微型实例。它最多可以爆破 2 个 ECU,然后限制为远少于 1 个(有人估计这在 0.1 - 0.2 个 ECU 左右)

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

        【讨论】:

          猜你喜欢
          • 2013-03-27
          • 1970-01-01
          • 2013-07-08
          • 1970-01-01
          • 1970-01-01
          • 2016-07-14
          • 2022-01-13
          • 2012-03-13
          • 1970-01-01
          相关资源
          最近更新 更多