Drupal7+NginX和PHP-FPM的CPU消耗非常高


Very high CPU consumption for Drupal7 + NginX and PHP-FPM

我们正在开发一个在(NginX+PHP-FPM)上使用Drupal 7的应用程序。但在性能测试过程中,我们观察到ApplicationsServer消耗了非常高的CPU。平均CPU消耗在90%的范围内(PHP-FPM消耗的最大处理器)。内存消耗非常低。

我们已经尝试过各种并发用户负载,如25-50-100。但即使有这种用户负载,我们也观察到CPU消耗约为90%,因此响应时间非常高。

我们使用的是带有RHEL(AWS EC2)操作系统的4核CPU。应用程序流是反向代理(Nginx)->应用程序服务器(Drupal 7+Nginx+PHP-FPM)

以下是我所做的配置更改-

nginx.conf:-

user              nginx;
worker_processes 4;
error_log  /var/log/nginx/error.log;
pid        /var/run/nginx.pid;
worker_rlimit_nofile    20480;
events {
   use epoll;
   worker_connections  10240;
   multi_accept on;
}
http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    access_log  /var/log/nginx/access.log  main;
    sendfile        on;
    tcp_nopush     on;
    tcp_nodelay     on;
    server_tokens   off;
    keepalive_timeout  65;
    gzip  on;
...
}

virtual.conf:-

location ~ ''.php$|^/update.php' {
    fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
    fastcgi_index  index.php;
    fastcgi_param   SCRIPT_FILENAME    $document_root$fastcgi_script_name;
    fastcgi_param   SCRIPT_NAME        $fastcgi_script_name;
    fastcgi_buffer_size 128k;
    fastcgi_buffers 256 16k;
    fastcgi_busy_buffers_size 256k;
    fastcgi_temp_file_write_size 256k;
    include fastcgi_params;
}

php-fpm.conf:-

emergency_restart_threshold = 10
emergency_restart_interval = 1m
process_control_timeout = 15s
daemonize = no

php fpm/www.conf:-

listen = /var/run/php-fpm/php-fpm.sock
listen.owner = nginx
listen.group = nginx
listen.mode = 0664
user = nginx
group = nginx
pm = dynamic
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 35

有人能指导我们如何解决这个问题吗?

您可以执行以下操作来提高生产安装的性能。

  1. 使用PHP 5.5或更新版本。(如果您的应用程序支持,则7更好)5.3不再受支持
  2. 启用PHP优化器(包含在5.5中,可能是一个单独的包),或者在旧版本中使用类似APC的东西。这可以显著提高性能,允许缓存和重用已编译的代码
  3. 使用缓存。根据您的应用程序,此选项会有所不同。如果memcached不经常更改,那么能够存储数据并从中读取数据可以提高性能。APCu(apc的用户缓存)可以用作内存中的缓存。某些应用程序检测并使用此功能(如果可用)
  4. 添加分析。看看这里像新遗迹一样的东西。它将显示您的应用程序在哪里花费了大部分时间
  5. 如果您的应用程序执行任何代码生成(如条令),请确保将其配置为在部署时手动运行,而不是在每次请求时运行

如果你已经在drupal上进行了任何自定义开发,你可能需要检查你的代码,以确保它不会花太多时间做数据库查询之类的事情。分析可以帮助识别这些问题。

根据您可以利用缓存的程度,您应该能够在实例上获得更多的用户。