Por que o apache reduz a velocidade de um dia para o outro?

6

Saudações,

No meu servidor dedicado do CentOS 5.4, eu configuro o apache com cerca de uma dúzia de hosts virtuais. Eu testo alguns deles, cada um carregado dentro de um segundo; bastante rápido. A média de carga é menor que 1. Sem problemas. Estou executando sites HTML estáticos, um blog WordPress com o MySQL 5.0 ... esses sites não são de alta largura de banda; nada que possa estressar esse servidor.

Na manhã seguinte, começo a trabalhar, carrego o site principal e demora de 10 a 20 segundos para carregar. Eu verifico a média de carga no servidor e ele está em torno de 3, às vezes até 5, uma vez que vi em 8, nunca abaixo de 2. Neste ponto eu normalmente salto o apache:

# apachectl -k graceful

Leva cerca de meio minuto, então tudo está bem novamente. Todos os hosts virtuais são carregados rapidamente, menos de um segundo. A média de carga rapidamente cai abaixo de 1.

Ao verificar / status do servidor, não há muita coisa acontecendo; Ao verificar o tráfego líquido ( vnstat -l ou vnstat -h ), não está sendo usada muita largura de banda. Ambos são comparáveis no início do dia e no final. No entanto, quando eu verifico de manhã, o apache é muito, muito mais lento do que praticamente todo o dia. O que está acontecendo da noite para o dia para fazer com que o apache diminua tanto e consuma muitos recursos do sistema?

# httpd -V
Server version: Apache/2.2.3
# uname -a
Linux myserver.com 2.6.18-92.el5 #1 SMP Tue Jun 10 18:51:06 EDT 2008 x86_64 x86_64 x86_64 GNU/Linux
# free
             total       used       free     shared    buffers     cached
Mem:       1025576    1017292       8284          0       8208      43160
-/+ buffers/cache:     965924      59652
Swap:      2096472     361012    1735460

Suponho que eu poderia configurar um cronjob que normalmente saltava o apache diariamente, mas isso parece uma solução rápida e suja. Eu prefiro encontrar a causa e consertar isso.

ATUALIZAÇÃO 2009-10-28 14:38; amostras coletadas a cada 10 segundos durante cinco minutos com média:

$ sar -W 10 30 && date
Linux 2.6.18-92.el5 (myserver.com)   10/28/2009

02:32:36 PM  pswpin/s pswpout/s
02:32:46 PM     10.31     30.43
02:32:56 PM      2.30     32.93
02:33:06 PM     21.56      0.00
02:33:16 PM      1.80      0.00
02:33:26 PM      5.69     26.67
02:33:36 PM      0.10      0.00
02:33:46 PM     25.70      7.60
02:33:56 PM     10.61      7.11
02:34:06 PM      4.10      2.60
02:34:16 PM      0.70      0.00
02:34:26 PM      0.00      0.00
02:34:36 PM      0.00      0.00
02:34:46 PM      3.80      0.00
02:34:56 PM      0.00      0.00
02:35:06 PM      0.00     11.01
02:35:16 PM      7.70     30.30
02:35:26 PM     20.32      0.00
02:35:36 PM      1.60      0.00
02:35:46 PM     11.60      0.00
02:35:56 PM      2.50      0.00
02:36:06 PM      0.00      0.00
02:36:16 PM      3.60      0.00
02:36:26 PM      0.00      0.00
02:36:36 PM      0.00      0.00
02:36:46 PM      0.00      0.00
02:36:56 PM    445.20     56.60
02:37:06 PM      0.00      0.00
02:37:16 PM      0.00      0.00
02:37:26 PM      0.00      0.00
02:37:36 PM      0.00      0.00
Average:        19.31      6.84
Wed Oct 28 14:37:36 PDT 2009

Curiosamente, o apache não está lento esta manhã. Fiz alguns ajustes no número de servidores iniciados, num servidores extras, número máximo de servidores, etc, ontem. Deixe-me pegar os valores antigos e comparar ...

Valores originais de /etc/httpd/conf/httpd.conf:

StartServers      20
MinSpareServers   20
MaxSpareServers  120
ServerLimit      256
MaxClients       256
MaxRequestsPerChild  4000

Novos valores que, de todas as aparências, parecem funcionar bem:

StartServers     30
MinSpareServers  30
MaxSpareServers  40
ServerLimit      50
MaxClients       50
MaxRequestsPerChild  4000

Provavelmente continuarei a ajustar um pouco essas configurações, mas elas parecem funcionar bem agora.

comando Sar esta manhã:

$ sar -W 10 30 && date
Linux 2.6.18-92.el5 (myserver.com)   10/29/2009

09:31:09 AM  pswpin/s pswpout/s
09:31:19 AM      5.80     54.40
09:31:29 AM     62.10      0.00
09:31:39 AM      0.00      0.00
09:31:49 AM      0.00      0.00
09:31:59 AM      0.00      0.00
09:32:09 AM      3.30      0.00
09:32:19 AM      2.70      0.00
09:32:29 AM      0.00      0.00
09:32:39 AM      0.00      0.00
09:32:49 AM      0.00      0.00
09:32:59 AM      3.10      0.00
09:33:09 AM      5.80      0.00
09:33:19 AM      0.00      0.00
09:33:29 AM      0.00      0.00
09:33:39 AM      0.00      0.00
09:33:49 AM      0.00      0.00
09:33:59 AM      0.00      0.00
09:34:09 AM      0.00      0.00
09:34:19 AM      0.00      0.00
09:34:29 AM      0.00      0.00
09:34:39 AM      4.00      0.00
09:34:49 AM      0.10      0.00
09:34:59 AM      0.00      0.00
09:35:09 AM      4.80      0.00
09:35:19 AM      0.00      0.00
09:35:29 AM    291.29      0.00
09:35:39 AM      0.00      0.00
09:35:49 AM      0.80      0.00
09:35:59 AM      0.00      0.00
09:36:09 AM      0.00      0.00
Average:        12.78      1.81
Thu Oct 29 09:36:09 PDT 2009

A média é menor! E o servidor recebeu mais tráfego do que ontem. Womble, parece que você estava certo! E agora tudo está bem no universo novamente.

John Gardeniers, boa ideia! Ele tem a opção -o [filename] apenas para isso. Obrigado pela dica!

Jeremy Visser, dstat é uma ferramenta muito fofa! Obrigado pela dica! Não foi instalado, teve que yum install dstat .

    
por jedihawk 28.10.2009 / 19:40

2 respostas

7

Com base na sua saída free , eu suspeito strongmente que seus processos do Apache estão strongmente enterrados no swap. A saída de sar -W 1 0 confirmará (ou refutará) essa hipótese (execute-a quando a máquina estiver lenta).

Se os processos do Apache não são todos realmente servindo pedidos (como mostrado por mod_status) você deve ajustar o número de filhos "sobressalentes" (com MaxSpareServers) para que eles sejam colhidos mais rápido (e, portanto, não fique perto de consumir RAM ). Se você realmente precisa do número de crianças que você está executando para atender a carga da solicitação, você precisará de mais memória RAM (eu ficaria com outro de 1 GB para cima; a RAM é barata, o tempo de diagnóstico não é).

    
por 28.10.2009 / 19:54
3

Qual é o processo (s) que consome toda a memória? Tente um iostat / vmstat antes de qualquer reinicialização do apache - pode ser um problema de I / O.

Para monitoramento de tendências, eu aconselho usar munin / colectd (aqueles que têm até mesmo plugins muito úteis para o apache (especialmente para você)).

    
por 29.10.2009 / 00:53