PHP-FPM 单个请求占用 40% CPU

PHP-FPM 单个请求占用 40% CPU

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

我在用着WordPress 的和:+Nginx+PHP-FPM+亚太经合组织+W3 总缓存+页面速度

由于我使用的是 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 进程(如下所示)取代,这 2 个进程活动了 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=ondemandpm.max_children=10pm.max_requests=500)。

最初我正在使用(pm=dynamic,,,,,pm.max_children=10),pm.start_servers=1并且发生了同样的问题。pm.min_spare_servers=1pm.min_spare_servers=2pm.max_requests=500

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

附言:

  • APC 已打开(98% 命中,2% 未命中)
  • 服务器是亚马逊微(613MB 内存)
  • PHP 5.3.26(fpm-fcgi)
  • Linux 版本 3.4.48-45.46.amzn1.x86_64 Red Hat 4.6.3-2(我认为它基于 CentOS 5)

答案1

很难调试问题出在哪里。

我想说的是,缩小你的设置。

您正在使用:Varnish + Nginx + PHP-FPM + APC + W3 Total Cache + PageSpeed

为什么需要 Varnish?nginx 也可以对静态页面进行缓存。请查看fastcgi_cache

PHP-FPM 和 APC 应该没问题,只要考虑给予 APC 足够的内存,以便所有文件都可以被缓存而不会出现内存问题和碎片。

为什么需要 W3 Total Cache?根据配置选项,这可能会占用大量 CPU,例如用于缩小代码或缓存页面或数据库调用到磁盘...

同样mod_pagespeed,它是一个处理输出文件的包装器,同时也增加了使用 CPU 周期的复杂性。

所以 - 如果你想要一个更快的网站,我会说理清这个混乱并简化它:

  • 摆脱 Varnish:如果您对它没有很强的用例。nginx 可以很好地进行缓存,并配置 nginx 以利用fastcgi_cache并使用套接字与 PHP-FPM 通信。

  • 摆脱 W3TC:使用memcached和和memcache 对象缓存插件。这是您的 DB-Cache 和 Object-Cache。如果必须缓存完整页面,只需使用 nginx 或 Varnish。如果您使用,则可以摆脱为 nginx 或 Varnish 配置完整页面缓存的麻烦批缓存用于在 memcached 中缓存整个页面。还尝试使用 memcached 套接字。

  • 摆脱mod_pagespeed。了解它为您做了哪些优化,并尝试手动将这些优化应用于您的博客主题或图像。如果您在 nginx 中使用 gzip,那么大多数内容都不重要。

  • 启用 MySQL 查询缓存并查找性能优化的 MySQL 设置。如果您有大量写入(例如大量评论),请考虑使用 InnoDB。

  • 使用 PHP 5.4 甚至 PHP 5.5 - 这些版本中包含大量的性能和内存改进,可以为您带来一些加速和内存节省。

更高级的方法:

看一眼xdebug 分析器。这应该能让你了解哪些函数消耗了大量的 CPU。该页面提供了一些有关如何使用以下方法查看生成的数据的详细信息缓存研磨器

您可以尝试查看进程树上使用的系统调用数量strace。您需要-f对此进行标记,并且可能仅打印统计信息-c就足以了解可能存在的问题。

我会说应用 KISS 原则,并且只有当您有明确的用例并且工具通过分析显示出改进时才使用性能或调整内容。

相关内容