php-fpm 或 nginx 是否超出上限?

php-fpm 或 nginx 是否超出上限?

我使用 blitz.io 来给我的网站带来大量流量,看看我的“学习系统管理员”在负载下的表现如何。我意识到这和大锤一样有效或与现实世界相关,但我真的想看看当我更改设置时进行比较。

我的通信设置(全部在 Amazon EC2 上)、Amazon Linux AMI

  • 1x Amazon 弹性负载均衡器
  • 2x Nginx 服务器上游至...
  • 1x Php-fpm 服务器(很快将变为 2x)。连接到...
  • 1 个 RDS mysql 服务器

一切都在 VPC 后面

为了进行测试,我所服务的网站是带有 W3 Total Cache 的 Wordpress 安装。

最初,我有 1x Nginx + 1x Php-fpm(隐含 1x Rds),全部作为微服务器。我相信在我开始遇到大量超时(时间 > 1000ms)之前,我的请求速度为 850/秒。

在此期间,phpfpm 和 nginx 的 CPU 都达到了 100%。所以……

然后我添加了第二个 nginx 服务器。之后,我将两个 nginx 服务器都转换为“大”,并将 php-fpm 也转换为“大”。

我将 php-fpm 设置乘以 5,令我沮丧的是,测试结果几乎完全相同……这次唯一的区别是所有 3 台服务器上的 CPU 和内存都达到了最大值约 5%。就好像几乎没有使用任何资源。我查看了日志中的错误,但并没有发现太多错误……

我已经多次查看过我的设置并且我知道我遗漏了一些重要的东西......

wordpress 部分的网站内容可以完全缓存...如果我更新了其中的任何内容,我将清除缓存。我的网站还有后半部分,但都是静态内容,没有数据库查询。我确实使用了一个 php“加载器”脚本,它可以从包含文件中加载各种内容,但仅此而已...非常轻量级。

我听说过一些事情,ulimit或者更确切地说......这可能是一个问题吗?

我试图在 1 分钟内处理 6000 个用户

我的配置

服务器1:Nginx

nginx.conf

user  www www;

worker_processes  auto;

events {
    worker_connections  1024;
}

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;

http {

    server_tokens  off;

    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;

    keepalive_timeout  65;

    sendfile        on;

    tcp_nopush      on;

    tcp_nodelay     off; 

    gzip              on;
    gzip_http_version 1.0;
    gzip_disable      "msie6";
    gzip_comp_level   5;
    gzip_buffers      16 8k;
    gzip_min_length   256;
    gzip_proxied      any;
    gzip_vary         on;
    gzip_types
      # text/html is always compressed by HttpGzipModule
      text/css
      text/plain
      text/x-component
      application/javascript
      application/json
      application/xml
      application/xhtml+xml
      application/x-font-ttf
      application/x-font-opentype
      application/vnd.ms-fontobject
      image/svg+xml
      image/x-icon;

    ssl_protocols              SSLv3 TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers                RC4:HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers  on;

    ssl_session_cache    shared:SSL:10m; 
    ssl_session_timeout  10m;

    upstream php {
        # ip_hash;
        server  10.0.0.210:9001;
    }

    include sites-enabled/*;
}

相关的 nginx 设置..

/etc/nginx/conf/缓存描述符.conf

open_file_cache          max=1000 inactive=20s;
open_file_cache_valid    30s;
open_file_cache_min_uses 2;
open_file_cache_errors   on;   

服务器2:php-fpm

php-fpm.conf

include=/etc/php-fpm.d/*.conf

[global]
pid = /var/run/php-fpm/php-fpm.pid
error_log = /var/log/php-fpm/error.log
log_level = notice

emergency_restart_threshold = 5
emergency_restart_interval = 2

php.ini

In this file I honestly didnt change much in php.ini except for the CGI path setting for the nginx zero day exploit. Maybe one more setting or two but vanilla for the most part

/etc/php-fpm.d/www.conf

[www]

listen = 9001

; # nginx-master, nginx-2
listen.allowed_clients = 10.0.0.248,10.0.0.155

user = www
group = www

pm = dynamic
pm.max_children = 500
pm.start_servers = 150
pm.min_spare_servers = 50
pm.max_spare_servers = 250
pm.max_requests = 1200

request_terminate_timeout = 30

slowlog = /var/log/php-fpm/www-slow.log

security.limit_extensions = .php

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

php_value[session.save_handler] = files
php_value[session.save_path] = /var/lib/php/session

如果有人有任何想法,我将不胜感激。我肯定遇到了某种我没有看到的“隐形极限”。

谢谢!

PS:如果您有更好的基准测试方法,我会洗耳恭听。

RDS 的截图在下面的评论中(我把它保存在 micro 上)

以下是测试发生的情况

闪电战

答案1

看起来您确实已经达到了极限,例如临时端口范围的数量、打开的最大文件描述符的数量、套接字的耗尽、内存交换到磁盘,或者甚至套接字内存不足。

查看 /var/log/messages、dmesg、/proc/net/sockstat 来寻找瓶颈所在的线索。

如果没有日志就很难提供帮助。

相关内容