E assim eu mantive meu servidor estável…

by José Antonio on 12/12/2010 · 2 comments

Há vários meses vinha tendo problemas diários de instabilidade no servidor do Zeletron. Todo santo dia o uso de memória do servidor ia a 100% e travava tudo.

Primeiro desconfiei de ataque, mas não havia nenhum rastro de hackers ou qualquer coisa parecida. Depois me sugeriram que fosse algum pacote desatualizado fazendo uma lambança, mas a máquina está sempre atualizada com a última versão stable de tudo.

E assim foi passando o tempo… Com isso, demorei muito para descobrir que o vilão do meu servidor era o Apache que estava gastando RAM demais. A máquina já ligava com 50% da memória usada, e, com as conexões chegando ao blog, ela ia facilmente para 90% fora do horário de pico.

Depois de muito procurar no Google, encontrei a explicação para o problema e a solução. Resumindo a história, o padrão do apache é deixar um número alto de clientes simultâneos (se não me engano eram 150), mesmo que você não precise disso tudo.

A solução é reduzir esse número para o mais baixo que você puder, sempre tomando cuidado para não baixar demais e ter o efeito contrário, o de congestionar o acesso por causa de poucos clientes simultâneos.

A idéia é a seguinte, se você tem no máximo 50 requisições simultâneas, não precisa de 150 nunca. Quanto menos processos simultâneos ele abrir, menos memória ele gasta.

Mas como eu descubro quantos clientes simultâneos são necessários?

O comando apache2ctl status te diz quantas requisições estão sendo tratadas num dado momento. A idéia é pegar um horário de pico e monitorar esse dado, para ver quantas requisições simultâneas estão sendo usadas.

Vejam o exemplo abaixo:

Parent Server Generation: 5
12 requests currently being processed, 8 idle workers

KKKWWKKW_K_K___KK___............................................

Scoreboard Key:
"_" Waiting for Connection, "S" Starting up, "R" Reading Request,
"W" Sending Reply, "K" Keepalive (read), "D" DNS Lookup,
"C" Closing connection, "L" Logging, "G" Gracefully finishing,
"I" Idle cleanup of worker, "." Open slot with no current process

De posse dos dados do comando apache2ctl status, descobri que 20 clientes simultâneos eram suficientes para atender o meu público. Com isso, pude configurar o arquivo apache2.conf (geralmente em /etc/apache2/) com as informações abaixo:

<IfModule mpm_worker_module>
    StartServers          2
    MaxClients           20
    MinSpareThreads      25
    MaxSpareThreads      75
    ThreadsPerChild      25
    MaxRequestsPerChild   0
</IfModule>

Esse pequeno ajuste foi o suficiente para manter o servidor de pé por 15 dias até agora, com um uso de memória bem razoável, sem chegar nunca a 85%.

Pode ser que eu tenha que subir um pouco esses valores mais para frente, apesar de não ter tido nenhuma reclamação de congestionamento do blog nesses 15 dias. Mas o que interessa é que encontrei o X da questão e consegui resolver a equação sem ter que contratar mais memória ou trocar de servidor.


Poderoso Copão

{ 2 comments }

1 Carlos Bueno 13/12/2010 às 8:43

Como leitor leigo já havia notado a dificuldade de acesso ao seu blog e realmente agora o acesso está em ordem.
É ruim quando detalhes como este privam seus leitores de acessar as informações.
Que bom que as coisas estão cada vez melhores por aqui.
Só sinto falta de um maior número de posts!

Abs,

2 José Antonio Oliveira 13/12/2010 às 9:08

Obrigado Carlos!

Ultimamente estou com um monte de tarefas novas no trabalho e outras fora do trabalho também. Tenho tentado postar com mais freqüência, mas não está fácil.

Um abraço!

Comments on this entry are closed.

Previous post:

Next post: