php-fpm 占用大量 CPU

php-fpm 占用大量 CPU

我在 Ubuntu 12.04 上使用 wordpress,在我的 VPS 上使用 Nginx + php-fpm。有 2 个 CPU 核心 + 4096Mb 内存。

我已将 mysql 数据库移至另一台服务器并设置远程访问。同时在线访客约有 300 人,php-fpm 占用了大量 CPU:

在此处输入图片描述

我也对 wordpress 使用 APC-cache 和 batcache。

php-fpm 配置:

listen = /var/run/fpm-macradar.sock
;listen.backlog = -1

pm = ondemand
pm.max_children = 30
pm.start_servers = 15
pm.min_spare_servers = 10
pm.max_spare_servers = 20
;pm.process_idle_timeout = 10s;
pm.max_requests = 500

pm.status_path = /status

chdir = /

request_slowlog_timeout = 60s
slowlog = /var/log/$pool.log.slow

request_terminate_timeout = 120s
rlimit_files = 131072
rlimit_core = unlimited
catch_workers_output = yes

;php_flag[display_errors] = off
php_admin_value[error_log] = /var/log/fpm-php.www.log
php_admin_flag[log_errors] = on
php_admin_value[memory_limit] = 128M

任何帮助将不胜感激

答案1

如果您只有两个 CPU,并且有 30 个子进程同时运行,那么您的 CPU 支持的进程数量就等于该进程的数量。当有多个子进程试图工作时,每个子进程的 CPU 都更少,结果是一切都变慢了,而且 CPU 开销也更大。这对于像 WordPress 这样每次请求都使用大量 CPU 的情况来说非常重要。

最好将最大子进程数减少到 2 或 3 个,这样负责管理连接队列的 nginx 就不会丢失查询。

当 FPM 为“ondemand”时,您只需要定义 pm.max_children,在这种情况下:

pm.max_children = 2 

希望对你有帮助。

答案2

这是一个老问题,但今天有人编辑了帖子并将其解决了。

虽然安装 Wordpress 缓存插件很有效,但这仍然意味着要执行 PHP,而这相对较慢。如果您的网站访问者中有一部分是匿名的(即未登录),您可以在 Nginx 中进行页面缓存(fastcgi_cache),这样就可以完全避免调用 PHP,从而大大降低 CPU 使用率并缩短响应时间。页面可以缓存 1 秒钟,这样才有价值,如果网站相当静态,则可以将其缓存一天或更长时间。棘手的部分是在发布更改时清除缓存,但我有一个解决方案 - 请参阅下文。

阅读我写的关于 LEMP 的教程。第一部分为您提供了要下载的配置文件,它们有很好的注释,本教程的后面部分将对其进行解释。还有一篇关于 Nginx 的很棒的文章微缓存

相关内容