Назад | Перейти на главную страницу

php-fpm или nginx?

Я использую blitz.io, чтобы заполнить свой сайт трафиком, чтобы увидеть, как мой «обучающийся системный администратор» выдерживает нагрузку. Я понимаю, что это так же эффективно или актуально для реального мира, как кувалда, но мне действительно хотелось просто увидеть сравнение, когда я меняю настройку.

Моя настройка в порядке связи (все на Amazon EC2), Amazon Linux AMI

Все за VPC

Для моего тестирования сайт, который я обслуживаю, представляет собой установку Wordpress с W3 Total Cache.

Первоначально у меня был 1x Nginx + 1x Php-fpm (подразумевается 1x Rds), все как микросерверы. Я считаю, что у меня было 850 запросов в секунду, прежде чем я начал получать много тайм-аутов (время> 1000 мс).

За это время процессор работал на 100% как на phpfpm, так и на nginx. Так..

Затем я добавил второй сервер nginx. После этого я преобразовал оба сервера nginx в «большие», а также php-fpm в «большие».

Я умножил свои настройки php-fpm в 5 раз, и, к моему ужасу, тесты были почти идентичными ... единственная разница на этот раз в том, что и ЦП, и память на всех трех серверах стали МАКСИМАЛЬНЫМИ примерно на 5%. Это похоже на то, что почти НИКАКИЕ ресурсы не использовались. Я поискал в журналах ошибки и особо не увидел ...

Я много раз просматривал свои настройки и знаю, что упускаю что-то огромное ...

Контент сайта для раздела wordpress может быть полностью кэшируемым ... если я что-нибудь обновлю в нем, я очищу кеш. На моем сайте есть вторая половина, но ВСЕ статическое содержимое, без запросов к базе данных. Я использую сценарий php 'loader', который загружает различный контент из включаемых файлов, но это ... довольно легкий.

Я что-то слышал о ulimit или скорее .. это может быть проблемой?

Я пытаюсь сделать 6000 пользователей в течение 1 минуты

Мои конфиги

Сервер 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/cache-descriptors.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 находится в комментарии ниже (я сохранил его на микро)

вот что случилось с тестом

Кажется, вы достигли пределов, да, таких как количество временных диапазонов портов, количество максимальных открытых дескрипторов файлов, истощение сокетов, перестановка памяти на диск или даже выход из памяти сокета.

Посмотрите / var / log / messages, dmesg, / proc / net / sockstat, чтобы узнать, где находятся ваши узкие места.

Без логов трудно помочь.