O Apache 2.2.22 é capaz de sustentar 1.000 clientes conectados simultaneamente?

1

Para um artigo em um jornal, estou testando 5 servidores web diferentes (Apache2, Cherokee, Lighttpd, Monkey e Nginx).

Os testes realizados consistem em medir os tempos de execução, bem como diferentes parâmetros como o número de solicitações atendidas por segundo, a quantidade de RAM, a CPU usada, durante uma carga crescente de clientes simultâneos (de 1 a 1.000 com um passo de 10) cada cliente enviando 1.000.000 requet de um pequeno arquivo fixo, depois de um arquivo fixo médio, depois um pequeno conteúdo dinâmico (hello.php) e finalmente um conteúdo dinâmico complexo (o cálculo do reembolso de um empréstimo) .

Todos os servidores da web são capazes de sustentar essa carga (até 1.000 clientes), mas o Apache2, que sempre pára de responder quando o teste atinge 450 a 500 clientes simultâneos.

Minha configuração é:

  • CPU: AMD FX 8150 8 núcleos a 4,2 GHz
  • RAM: 32 Gb.
  • SSD: 2 x SATA6 Crucial de 240 Gb
  • SO: Ubuntu 12.04.3 64 bits
  • WS: Apache 2.2.22

Minha configuração do Apache2 é a seguinte:

/etc/apache2/apache2.conf

LockFile ${APACHE_LOCK_DIR}/accept.lock
PidFile ${APACHE_PID_FILE}
Timeout 30
KeepAlive On
MaxKeepAliveRequests 1000000
KeepAliveTimeout 2
ServerName "fnux.net"
<IfModule mpm_prefork_module>
  StartServers         16
  MinSpareServers      16
  MaxSpareServers      16
  ServerLimit        2048 
  MaxClients         1024
  MaxRequestsPerChild   0
</IfModule>
User ${APACHE_RUN_USER}
Group ${APACHE_RUN_GROUP}
AccessFileName .htaccess
<Files ~ "^\.ht">
  Order allow,deny
  Deny from all
  Satisfy all
</Files>
DefaultType None
HostnameLookups Off
ErrorLog ${APACHE_LOG_DIR}/error.log
LogLevel emerg
Include mods-enabled/*.load
Include mods-enabled/*.conf
Include httpd.conf
Include ports.conf
LogFormat "%v:%p %h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" vhost_combined
LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %O" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent
Include conf.d/
Include sites-enabled/

/etc/apache2/ports.conf

NameVirtualHost *:8180
Listen 8180
<IfModule mod_ssl.c>
  Listen 443
</IfModule>
<IfModule mod_gnutls.c>
  Listen 443
</IfModule>

/ etc / apache2 / mods-available

<IfModule mod_fastcgi.c>
   AddHandler php5-fcgi .php
   Action php5-fcgi /cgi-bin/php5.external
   <Location "/cgi-bin/php5.external">
     Order Deny,Allow
     Deny from All
     Allow from env=REDIRECT_STATUS
   </Location>
 </IfModule>

/ etc / apache2 / sites-available / default

<VirtualHost *:8180>
  ServerAdmin webmaster@localhost
  DocumentRoot /var/www/apache2
  <Directory />
    Options FollowSymLinks
    AllowOverride None
  </Directory>
  <Directory /var/www/>
    Options Indexes FollowSymLinks MultiViews
    AllowOverride None
    Order allow,deny
    allow from all
  </Directory>
  ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
  <Directory "/usr/lib/cgi-bin">
    AllowOverride None
    Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
    Order allow,deny
    Allow from all
  </Directory>
ErrorLog ${APACHE_LOG_DIR}/error.log
LogLevel emerg
#####   CustomLog ${APACHE_LOG_DIR}/access.log combined
Alias /doc/ "/usr/share/doc/"
  <Directory "/usr/share/doc/">
    Options Indexes MultiViews FollowSymLinks
    AllowOverride None
    Order deny,allow
    Deny from all
    Allow from 127.0.0.0/255.0.0.0 ::1/128
  </Directory>
  <IfModule mod_fastcgi.c>
    AddHandler php5-fcgi .php
    Action php5-fcgi /php5-fcgi
    Alias /php5-fcgi /usr/lib/cgi-bin/php5-fcgi
    FastCgiExternalServer /usr/lib/cgi-bin/php5-fcgi -host 127.0.0.1:9000 -pass-header Authorization
  </IfModule>
</VirtualHost>

/etc/security/limits.conf

* soft nofile 1000000
* hard nofile 1000000

Então, eu realmente aprecio o seu conselho para configurar o Apache2 para torná-lo capaz de sustentar 1.000 clientes simultâneos, se isso for possível.

TIA por sua ajuda. Felicidades.

@Laszlo Valco: Eu faço 100 por 100 de acordo com o seu ponto e é por isso que vim aqui para pedir conselhos e ajuda para configurar o Apache2, a fim de torná-lo capaz de sustentar essa carga.

Agora, estou confortável em fazer isso para todos os outros servidores da Web, mas admito que sou burro e completamente ignorante das configurações do Apache2.

BTW, a configuração atual do Apache2 acima não é a padrão, mas mais uma vez concordo que não atende a necessidade de manter meus testes.

Então, você poderia ser gentil o suficiente para explicar como definir os números que afetam os processos de trabalho de forma que o processo de 1.000 filhos esteja disponível?

Eu acho que está na seção "IfModule mpm_prefork_module" do arquivo "/etc/apache2/apache2.conf", mas não tenho idéia de como definir os valores corretos de acordo com as minhas capacidades de hardware (especialmente a quantidade de RAM que é de 32 Gb) e minha necessidade de atingir 1.000 clientes conectados simultaneamente.

Sua experiência seria muito apreciada para me ajudar a usar os valores corretos, já que, mesmo depois de longas pesquisas, não consegui encontrar explicações claras sobre como fazer isso.

TIA para mais informações.

Felicidades.

    
por Fnux 27.10.2013 / 01:45

2 respostas

0

Não estou muito convencido de que seu benchmark é muito útil quando feito com configurações como essa. Fazer qualquer benchmark de desempenho com configurações padrão (ou similares a isso) me parece um pouco inútil. Se alguém estiver interessado em desempenho, é imperativo ajustar a configuração, cortando todos os recursos de degradação de desempenho, que não são absolutamente necessários. Então, por que esse alguém estaria interessado em um benchmark que não mostrasse o poder real desses servidores, mas mostrasse o que a configuração padrão achava útil?

Portanto, se a ideia é fazer um benchmark de desempenho adequado, você deve configurar uma lista real de requisitos funcionais e fazer algumas pesquisas sobre como configurar esses softwares para atender aos requisitos funcionais e executar também que possível. A configuração padrão do Apache é notoriamente não favorável ao desempenho, por exemplo.

E para ajudá-lo com sua configuração do Apache: defina os números que afetam os processos do trabalhador de forma que o processo filho de 1000 esteja sempre disponível.

Tente estas configurações para prefork MPM:

StartServers       1024
MinSpareServers     128
MaxSpareServers    1024
ServerLimit        2048 
MaxClients         2048
MaxRequestsPerChild   0

ou estes para o trabalhador MPM:

ServerLimit          64
StartServers         32
MaxClients         2048
MinSpareThreads     128
MaxSpareThreads    1024
ThreadsPerChild      32

Além disso, por favor, reconheça que a linha <IfModule mpm_prefork_module> excluirá essa seção, a menos que você use o módulo MPM ou altere o nome do módulo nessa linha.

    
por 27.10.2013 / 02:38
1

Quando você usa o worker MPM encadeado, isso depende apenas de quantos recursos você tem disponível (CPU e memória); o apache terá 100 threads simultâneos se você tiver, digamos, 4GB disponíveis para ele.

O

mod_prefork está obsoleto e deve ser evitado para qualquer aplicação séria.

    
por 27.10.2013 / 17:05