Configurações do Apache 2 para o site de alto tráfego

2

Estou com problemas com a carga do meu site. É um servidor ec2 da amazon com 15 GB de ram e 4 CPUs atrás de um LB.

O apachetop diz que estou obtendo cerca de 80 reqs por segundo, o que parece muito baixo para esse tipo de servidor e a carga (dada por cima) é geralmente em torno de 15, mas aumenta para cerca de 150 em 24 horas. Estou vendo cerca de 100 processos apache ativos a qualquer momento. O Apache está no modo prefork.

O Mysql é usado muito pouco no servidor e quase não há arquivos estáticos.

Aqui estão as minhas configurações do Apache:

Timeout 20
KeepAlive Off
MaxKeepAliveRequests 0
KeepAliveTimeout 3

<IfModule mpm_prefork_module>
    StartServers         40
    MinSpareServers      25
    MaxSpareServers      40
    ServerLimit         400
    MaxClients          400
    MaxRequestsPerChild  4
</IfModule>

Alguém pode aconselhar sobre como ajustar as configurações? Thanx!

Editar: A configuração foi obtida por tentativa e erro. Qualquer e eu quero dizer por um número, mude para estas linhas fazem a carga disparar em como 5 minutos. Ele literalmente salta para gostar 200-300 em questão de minutos. Especialmente MaxRequestsPerChild. Eu tentei com 10, 15, 100, 1000 e a carga simplesmente disparou.

Sobre php - na verdade, existem apenas alguns arquivos php que não são realmente tão caros. Eles simplesmente cuspiram algumas coisas simples.

Se eu ativar o carregamento do KeepAlive, ele também vai para o espaço.

Editar: Isto é o que o status do servidor fornece:

Current Time: Monday, 16-Apr-2012 07:26:07 UTC
Restart Time: Monday, 16-Apr-2012 07:06:44 UTC
Parent Server Generation: 3
Server uptime: 19 minutes 22 seconds
Total accesses: 65803 - Total Traffic: 51.8 MB
CPU Usage: u24.25 s1.99 cu0 cs0 - 2.26% CPU load
56.6 requests/sec - 45.7 kB/second - 825 B/request
65 requests currently being processed, 0 idle workers

WWWCWWCCWWWWCCCWWCWWCWCWWCCWWWCCWWWCWWCWWWSWC..C..W...WCCCC.C.GW
CWCC.CWWCCC.WC..................................................
................................................................
................................................................
................................................................
................................................................
................

Eu vejo muitas conexões no modo "Aguardar", mas não sei por que o req / seg é tão baixo. Apenas 56 e tantos slots estão vazios ...

Atualização: Eu mudei o código um pouco, removi todas as rotinas que poderiam retardar as coisas e ainda estou recebendo apenas 100 reqs por segundo. A carga está estável em cerca de 10 ...

Eu acho que esse tipo de máquina deve ser capaz de fazer muito mais ...

    
por Mathew 15.04.2012 / 21:17

2 respostas

2

Sua situação sugere para mim que o script PHP está esperando algo para ser concluído (como uma consulta SQL ou chamada de API). Você deve poder ativar o módulo Extended Status do apache para ter uma ideia muito melhor do que o apache está fazendo.

Para fazer isso, no seu httpd.conf você precisará ativar o mod_status e ter 'ExtendedStatus On' (veja: link )

por exemplo,

LoadModule status_module modules/mod_status.so
ExtendedStatus On

<Location /server-status>
 SetHandler server-status
 Order deny,allow
 Deny from all
 Allow from xxx.xxx.xxx.xxx
</Location>

Substitua xxx.xxx.xxx.xxx pelo (s) IP (s) que você deseja acessar a página de status e, em seguida, pressione link para ver a saída. A maioria das configurações provavelmente já estão em seus arquivos .conf ou foram comentadas.

Quando você tiver acesso a ele, verá algo semelhante a:

K___K_W_........................................................
................................................................
................................................................
................................................................

Scoreboard Key:
"_" Waiting for Connection, "S" Starting up, "R" Reading Request,
"W" Sending Reply, "K" KeepAlive (read), "D" DNS Lookup, "L" Logging,
"G" Gracefully finishing, "." Open slot with no current process

Isso lhe dá muito mais ideia do que está acontecendo nos bastidores do Apache. Se a minha primeira suposição estiver correta (ou seja, seu script PHP estiver aguardando alguma coisa), você verá muitas tarefas no modo 'W'.

Tente - se você ainda precisar de ajuda, deixe-me saber como é a saída acima.

    
por 16.04.2012 / 02:01
2

Até a média de carga de 15 é muito alta - é indicativo de que o sistema está se tornando um gargalo.

O que está sendo executado no Apache?

Se for conteúdo dinâmico, verifique se as CPUs são completamente utilizadas; o código pode precisar de alguma otimização ou você pode precisar escalar para mais instâncias do EC2 para lidar com os requisitos de CPU do conteúdo.

Se envolver os clientes carregando uma quantidade decente de dados, você pode estar sobrecarregando o disco (verifique os números dos iowait no topo) ou até mesmo a largura de banda disponível.

Dependendo do que está sendo executado, você pode usar um MPM com melhor desempenho que o pré-teste.

MaxRequestsPerChild 4 é incrivelmente baixo - você sabe por que isso está definido? E por que KeepAlive Off está definido? Ambas as configurações são muito ruins do ponto de vista do desempenho; você pode dar algumas informações sobre como a configuração chegou onde está?

    
por 15.04.2012 / 21:29

Tags