Apache ocupando muito CPU

3

Estou tentando gerenciar um servidor na Amazon para uma rede de sites que recebe cerca de 100 milhões de visualizações de página por mês. Infelizmente, ninguém da minha equipe de 5 desenvolvedores tem muita experiência em administração de servidores.

Neste momento, temos o MaxClients definido para 1400. Atualmente, nosso tráfego é mediano e temos 1150 processos totais do Apache em execução, que usam cerca de 2% de CPU cada! Dos 1150, 800 deles estão atualmente dormindo, mas ainda ocupando a CPU. Tenho certeza de que existem maneiras de otimizar isso. Eu tenho alguns pensamentos:

  1. Parece que o Apache está criando um novo processo para cada conexão. Isso é normal?
  2. Existe uma maneira de eliminar mais rapidamente os processos de suspensão?
  3. Devemos ativar o KeepAlive? Cada página carrega cerca de 15-20 gráficos de tamanho médio e um monte de javascript / css.

Então, aqui está nossa configuração do Apache. Nós planejamos contratar um administrador de servidores o mais rápido possível, mas eu realmente aprecio alguns conselhos até que possamos encontrar alguém.

Timeout 25
KeepAlive Off
MaxKeepAliveRequests 200
KeepAliveTimeout 5

<IfModule prefork.c>
StartServers         100
MinSpareServers      20
MaxSpareServers      50
ServerLimit          1400
MaxClients           1400
MaxRequestsPerChild  5000
</IfModule>

<IfModule worker.c>
StartServers         4
MaxClients           400
MinSpareThreads      25
MaxSpareThreads      75
ThreadsPerChild      25
MaxRequestsPerChild  0
</IfModule>

Saída máxima completa:

top - 23:44:36 up 1 day,  6:43,  4 users,  load average: 379.14, 379.17, 377.22
Tasks: 1153 total, 379 running, 774 sleeping,   0 stopped,   0 zombie
Cpu(s): 71.9%us, 26.2%sy,  0.0%ni,  0.0%id,  0.0%wa,  0.0%hi,  1.9%si,  0.0%st
Mem:  70343000k total, 23768448k used, 46574552k free,   527376k buffers
Swap:        0k total,        0k used,        0k free, 10054596k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
 1756 mysql     20   0 10.2g 1.8g 5256 S 19.8  2.7 904:41.13 mysqld
21515 apache    20   0  396m  18m 4512 R  2.1  0.0   0:34.42 httpd
21524 apache    20   0  396m  18m 4032 R  2.1  0.0   0:32.63 httpd
21544 apache    20   0  394m  16m 4084 R  2.1  0.0   0:36.38 httpd
21643 apache    20   0  396m  18m 4360 R  2.1  0.0   0:34.20 httpd
21817 apache    20   0  396m  17m 4064 R  2.1  0.0   0:38.22 httpd
22134 apache    20   0  395m  17m 4584 R  2.1  0.0   0:35.62 httpd
22211 apache    20   0  397m  18m 4104 R  2.1  0.0   0:29.91 httpd
22267 apache    20   0  396m  18m 4636 R  2.1  0.0   0:35.29 httpd
22334 apache    20   0  397m  18m 4096 R  2.1  0.0   0:34.86 httpd
22549 apache    20   0  395m  17m 4056 R  2.1  0.0   0:31.01 httpd
22612 apache    20   0  397m  19m 4152 R  2.1  0.0   0:34.34 httpd
22721 apache    20   0  396m  18m 4060 R  2.1  0.0   0:32.76 httpd
22932 apache    20   0  396m  17m 4020 R  2.1  0.0   0:37.34 httpd
22933 apache    20   0  396m  18m 4060 R  2.1  0.0   0:34.77 httpd
22949 apache    20   0  396m  18m 4060 R  2.1  0.0   0:34.61 httpd
22956 apache    20   0  402m  24m 4072 R  2.1  0.0   0:41.45 httpd
    
por andrewtweber 24.06.2011 / 01:35

2 respostas

3

Parece que você está usando o premp mpm. A maior parte dessa resposta pressupõe isso.

It appears Apache is creating a new process for every single connection. Is this normal?

Para prefork? Sim.

Is there a way to more quickly kill the sleeping processes?

Tem certeza de que esses processos não estão fazendo nada? Com a sua configuração MaxSpareSevers, você deve ter até 50 processos ociosos. Habilite mod_status e configure ExtendedStatus para permitir que você visualize o placar do Apache e permita que você veja o que está acontecendo.

Should we turn KeepAlive on? Each page loads about 15-20 medium-sized graphics and a lot of javascript/css.

Ativar o KeepAlive é uma boa ideia. Ele permitirá que os clientes enfileirem solicitações e permitam que você reutilize os processos do Apache com mais eficiência.

Como com a maioria dos ajustes. Meça primeiro para criar sua linha de base, depois mude uma coisa e depois meça novamente para tentar determinar qual efeito você pode ter. Usar (e representar graficamente) mod_status é útil para isso.

Você pode usar o trabalhador mpm, o que tende a ajudar no desempenho. No entanto, algumas bibliotecas (notavelmente algumas bibliotecas PHP) não funcionam bem com o worker mpm. YMMV

Para determinar qual mpm você está usando, execute: apache2 -V (ou httpd -V dependendo da distribuição)

    
por 24.06.2011 / 05:05
4

Existem livros inteiros escritos sobre este tópico, mas para simplificar:

Executa o banco de dados em uma camada separada

A carga de trabalho do banco de dados e a carga de trabalho do servidor da Web são totalmente diferentes e estarão explorando recursos de formas conflitantes. É melhor mantê-los separados, isso ajudará você a se expandir no futuro.

Isolar conteúdo estático e dinâmico

Considere a possibilidade de executar um servidor da Web mais rápido, como o nginx, para conteúdo estático e ignorar completamente o apache. Se você puder, execute nginx em todos os lugares.

KeepAlive definitivamente ajudará

Muitos dos seus recursos estão sendo queimados por falhas de conexão.

PageTest

Para mais bons conselhos, eu recomendo: link . Isso mostrará por que o site está demorando muito para ser carregado e tem várias dicas de práticas recomendadas para corrigir o desempenho: ativando a compactação gzip, minificando o javascript e o css, etc. etc. Dê uma lida.

    
por 24.06.2011 / 06:17