php-fpm ou nginx limitando?

1

Estou usando o blitz.io para basicamente explodir meu site com tráfego para ver como meu 'administrador de sistema de aprendizado' se mantém sob carga. Eu percebo que isso é tão eficaz ou relevante para o mundo real quanto uma marreta, mas eu realmente queria apenas ver uma comparação quando mudei de cenário.

Minha configuração na ordem de comunicação (tudo no Amazon EC2), Amazon Linux AMI

  • 1x balanceador de carga elástica da Amazon
  • 2x servidores Nginx que são enviados para ...
  • 1x servidor php-fpm (em breve será 2x). Que se conecta a ...
  • 1 servidor RDS mysql

Tudo está por trás de um VPC

Para meu teste, o site que estou atendendo é uma instalação do Wordpress com o W3 Total Cache.

Originalmente eu tinha 1x Nginx + 1x Php-fpm (1x Rds está implícito) todos como micro-servidores. Acredito que recebi 850 req / s antes de começar a receber muitos tempos de espera (tempos > 1000ms).

Durante esse tempo, a CPU atingiu 100% no phpfpm e no nginx. Então ..

Eu adicionei um segundo servidor nginx. Depois disso, converti os dois servidores nginx para 'large', bem como o php-fpm para 'large'.

Eu multipliquei minhas configurações do php-fpm x5 e para meu espanto os testes foram quase idênticos ... a única diferença desta vez é tanto a CPU quanto a memória foram de aproximadamente 5% em todos os 3 servidores. É como se quase todos os recursos estivessem sendo usados. Eu olhei em meus registros por erros e realmente não vi muito ...

Eu olhei minhas configurações muitas vezes e sei que estou perdendo algo enorme ...

O conteúdo do site para a seção wordpress pode ser completamente copiável ... se eu atualizar qualquer coisa nele, eu limparei o cache. Há uma segunda metade no meu site, mas seu conteúdo estático ALL, nenhuma consulta do banco de dados. Eu uso um script 'carregador' php que carrega em vários conteúdos de arquivos de inclusão, mas é isso .. muito leve.

Eu ouvi algo sobre ulimit ou melhor ... isso poderia ser um problema?

Estou tentando fazer 6000 usuários ao longo de um minuto

Minhas configurações

Servidor 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/*;
}

configuração nginx relevante ...

/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;   

Servidor 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

Se alguém tiver alguma ideia, isso será muito apreciado. Eu definitivamente estou atingindo algum tipo de 'limite invisível' que não estou vendo.

Obrigado!

PS Se você tem uma maneira melhor de avaliar, eu seria todo ouvidos ..

screenshot do RDS está no comentário abaixo (guardei no micro)

aqui está o que aconteceu com o teste

    
por Tallboy 31.03.2013 / 16:32

1 resposta

1

Parece que você está atingindo limites sim, como número de intervalo de portas efêmeras, número de descritores de arquivos máx. abertos, esgotamento de soquetes, troca de memória em disco ou até mesmo quando você sai da memória do soquete.

Veja o / var / log / messages, o dmesg, / proc / net / sockstat para procurar pistas sobre onde estão seus afunilamentos.

Sem registros, é difícil ajudar.

    
por 01.04.2013 / 20:35