Apache e uso de memória

4

Eu alugo um servidor Gentoo com a pilha LAMP usual (prefork Apache MPM) + suPHP.

Ocasionalmente, meu servidor fica sem memória e fica mais lento (responde aos pings, mas é praticamente impossível efetuar login, e os pressionamentos de tecla enviados pelo SSH podem levar minutos para serem ecoados, muito menos processados) . Muitas coisas do oom_killer nos logs do sistema também.

Isso é o que eu vejo em top durante um desses momentos:

top - 16:45:05 up 22 days,  8:08,  3 users,  load average: 104.26, 103.87, 93.3
Tasks: 393 total,   1 running, 388 sleeping,   0 stopped,   4 zombie
Cpu(s):  4.6%us,  9.3%sy,  0.8%ni,  0.0%id, 84.8%wa,  0.0%hi,  0.5%si,  0.0%st
Mem:   2042128k total,  1634392k used,   407736k free,     1792k buffers
Swap:        0k total,        0k used,        0k free,    27724k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
 3125 apache    20   0  288m 105m 1368 S    0  5.3   0:01.00 apache2
 2886 apache    20   0  285m 102m 1368 S    0  5.1   0:02.44 apache2
 3048 apache    20   0  279m  96m 1192 D    0  4.8   0:01.58 apache2
 3037 apache    20   0  278m  95m 1076 S    0  4.8   0:02.23 apache2
 3014 apache    20   0  278m  94m 1204 D    0  4.8   0:01.81 apache2
 2859 apache    20   0  274m  91m 1368 S    0  4.6   0:00.63 apache2
 3016 apache    20   0  269m  86m 1368 S    0  4.3   0:01.49 apache2
 2887 apache    20   0  269m  86m 1192 D    0  4.3   0:01.06 apache2
 2753 apache    20   0  269m  86m 1368 S    0  4.3   0:01.09 apache2
 3036 apache    20   0  266m  83m 1372 S    1  4.2   0:01.10 apache2
 3006 apache    20   0  266m  83m 1368 S    0  4.2   0:01.98 apache2
 3007 apache    20   0  265m  82m 1372 S    0  4.1   0:02.00 apache2
 3064 apache    20   0  264m  81m 1368 S    0  4.1   0:00.57 apache2
 3045 apache    20   0  263m  80m 1368 S    0  4.1   0:00.60 apache2
 2888 apache    20   0  263m  79m  416 S    0  4.0   0:01.09 apache2
 2862 apache    20   0  260m  77m 1368 S    1  3.9   0:01.95 apache2
 2891 apache    20   0  259m  76m 1332 D    0  3.9   0:01.98 apache2
 3046 apache    20   0  258m  75m 1080 S    0  3.8   0:01.20 apache2
 2873 apache    20   0  255m  72m 1380 S    0  3.6   0:01.51 apache2
 2987 apache    20   0  252m  69m 1368 S    0  3.5   0:01.04 apache2
 2666 apache    20   0  250m  67m 1368 S    0  3.4   0:00.72 apache2
 2903 apache    20   0  248m  66m 1368 S    0  3.3   0:01.02 apache2
 3013 apache    20   0  247m  63m  416 S    0  3.2   0:01.02 apache2

Note que o PHP está rodando no modo CGI, então isso é apenas o Apache sem nenhum módulo PHP.

Francamente, não entendo por que outro motivo seria lento, a não ser que fosse executado com muita memória RAM, mas ele afirma ter 400 MB de RAM livre. "84,8% wa" também indica que o sistema está aguardando operações de E / S (paginação?).

Coisas que tentei:

  • Desabilitando o swap, com a esperança de que as coisas que começam a consumir memória desenfreadamente simplesmente travem em vez de deixar o servidor um pouco difícil - isso não funcionou, provavelmente apenas começou a procurar arquivos mapeados na memória (executáveis e SOs)
  • Configurando o oom_adj do processo raiz do Apache para 15
  • Ajustando as configurações do MPM:

    StartServers         5
    MinSpareServers      5
    MaxSpareServers      10
    MaxClients           50
    MaxRequestsPerChild  10
    MaxMemFree           1024
    

Por enquanto, reduzi MaxClients para 25, mas agora as solicitações de página levam vários segundos para serem processadas, e algumas crianças com o FlashGet teoricamente podem entupir todos os processos do Apache e tornar todos os sites inacessíveis: /

Perguntas:

  1. Alguém pode sugerir alguns ajustes na configuração do Apache que poderiam melhorar radicalmente minha situação?

  2. É possível dizer ao Linux para não trocar / sair da página sshd, bash e todo o resto requerido para eu ssh in e matar processos de fuga?

  3. Se a resposta à pergunta acima for "não", alguém explique-me como é que hoje em dia os sistemas operacionais modernos são terrivelmente falhos. Soa como falha épica no design do SO para mim: (

por Vladimir Panteleev 31.08.2010 / 17:28

1 resposta

2

Seu apache processa cada uso com cerca de 80 MB de memória (coluna RES). Isso é enorme - aqui eu tenho um servidor web com o apache 2.2 usado para executar CGIs e cada processo usa cerca de 5 MB. Agora, se você tem 50 processos apache, cada um usando 80MB, então você está trocando muito. Quando descobrirmos por que você está consumindo tanta memória, provavelmente resolveremos o problema.

Você pode postar seu arquivo de configuração do Apache?

    
por 31.08.2010 / 17:44