Vazamento de memória no servidor web

Vazamento de memória no servidor web

Ultimamente tenho tido alguns problemas de desempenho do servidor. Atualmente estamos executando um servidor Fedora com 4 GB e 160 GB de espaço em disco. Estamos praticamente limitando o disco, com todos os arquivos que temos a bordo. Estamos executando vários sites com vários backups para cada site. Porém, apenas um site realmente obtém tráfego. É um site de comércio eletrônico com uma boa quantidade de visitantes.

Ultimamente, tem havido tempos de carregamento lentos e noto que nossa memória livre está ficando muito baixa (abaixo de um GB). Vou reiniciar o servidor (o que tenho que fazer 3 vezes ao dia agora) e tudo ficará bem. Começamos com 2,2 GB de memória liberada, mas depois de 3 ou 4 horas você percebe que a memória está sendo absorvida e o tempo de carregamento aumenta. Não consigo descobrir de onde isso vem ou se é hora de atualizarmos para um servidor melhor. Eu só não quero atualizar, então percebo que estou com gargalos em algum lugar com solicitações do MySQL.

Qualquer idéia ou sugestão seria apreciada.

EDITAR-

Existem 3 vhosts também e tenho mais de 60.000 arquivos.

             total       used       free     shared    buffers     cached
Mem:          4003       3372        630          0        398       1717
-/+ buffers/cache:       1256       2746
Swap:         8189          0       8189

21:21:49 up 46 min,  1 user,  load average: 3.75, 4.20, 4.03

procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 0  2      0 592728 409640 1838360    0    0   165   411  953  473  9  8 47 36  0

E aqui está o instantâneo principal.

 1356 mysql     20   0 1374m 219m 5320 S  5.6  5.5  14:06.21 mysqld
15796 root      20   0  103m  20m  440 D  1.0  0.5   0:04.42 sendmail
 1081 root      20   0  103m  20m  440 D  0.7  0.5   0:21.73 sendmail
24013 root      20   0 97416  22m 2648 D  0.7  0.6   0:15.15 mailq
 1525 root      20   0  247m 7980 3472 S  0.3  0.2   0:06.88 vlogger (access
 1530 apache    20   0  539m  13m 3008 S  0.3  0.3   0:03.56 httpd
 2399 apache    20   0  539m  12m 2748 S  0.3  0.3   0:00.85 httpd
 5763 root      20   0  121m 4932 3868 S  0.3  0.1   0:00.07 sshd
12326 apache    20   0  539m  12m 2992 S  0.3  0.3   0:00.38 httpd
12421 apache    20   0  539m  12m 2988 S  0.3  0.3   0:00.45 httpd
16396 apache    20   0  538m  12m 2284 S  0.3  0.3   0:00.09 httpd
17050 root      20   0 15368 1256  868 R  0.3  0.0   0:00.09 top
    1 root      20   0 37336 4104 1908 S  0.0  0.1   0:02.82 systemd
    2 root      20   0     0    0    0 S  0.0  0.0   0:00.00 kthreadd
    3 root      20   0     0    0    0 S  0.0  0.0   0:00.03 ksoftirqd/0
    5 root       0 -20     0    0    0 S  0.0  0.0   0:00.00 kworker/0:0H
    6 root      20   0     0    0    0 S  0.0  0.0   0:00.00 kworker/u:0
    7 root       0 -20     0    0    0 S  0.0  0.0   0:00.00 kworker/u:0H
    8 root      RT   0     0    0    0 S  0.0  0.0   0:00.11 migration/0
    9 root      RT   0     0    0    0 S  0.0  0.0   0:00.01 watchdog/0
   10 root      RT   0     0    0    0 S  0.0  0.0   0:00.14 migration/1
   12 root       0 -20     0    0    0 S  0.0  0.0   0:00.00 kworker/1:0H
   13 root      20   0     0    0    0 S  0.0  0.0   0:00.02 ksoftirqd/1
   14 root      RT   0     0    0    0 S  0.0  0.0   0:00.01 watchdog/1
   15 root      RT   0     0    0    0 S  0.0  0.0   0:00.15 migration/2
   17 root       0 -20     0    0    0 S  0.0  0.0   0:00.00 kworker/2:0H
   18 root      20   0     0    0    0 S  0.0  0.0   0:00.03 ksoftirqd/2
   19 root      RT   0     0    0    0 S  0.0  0.0   0:00.01 watchdog/2
   20 root      RT   0     0    0    0 S  0.0  0.0   0:00.11 migration/3
   22 root       0 -20     0    0    0 S  0.0  0.0   0:00.00 kworker/3:0H
   23 root      20   0     0    0    0 S  0.0  0.0   0:00.02 ksoftirqd/3
   24 root      RT   0     0    0    0 S  0.0  0.0   0:00.01 watchdog/3
   25 root       0 -20     0    0    0 S  0.0  0.0   0:00.00 cpuset
   26 root       0 -20     0    0    0 S  0.0  0.0   0:00.00 khelper
   27 root      20   0     0    0    0 S  0.0  0.0   0:00.00 kdevtmpfs
   28 root       0 -20     0    0    0 S  0.0  0.0   0:00.00 netns
   29 root      20   0     0    0    0 S  0.0  0.0   0:00.00 xenwatch

Responder1

Aumente o sar e produza a tabela ps a cada minuto. Veja minha resposta detalhadaaqui.

Na próxima vez que o servidor explodir, use sar -rpara ajudar a rastrearquandoaconteceu. Agora use a saída do ps-cronjob ou do meuwrapper perl para ps no github, para descobrir qual processo pode ter sido o culpado.

Digamos que o servidor explodiu entre 12h00:00 e 13h00:00. Usar sar -r -s 12:00:00 -e 13:00:00. A partir disso, você deverá ver um aumento nos dados. (Se for mais fácil, existe um utilitário baseado em Java para fazer gráficos, mas geralmente não vale a pena.) Digamos que você veja um pico (ou uma depressão) às 12h15. Agora verifique a saída ps em colunas para um intervalo de tempo entre, digamos, 12h e 12h15, classifique-o por pid e depois por hora e observe as colunas de memória:

awk '/^=== .* 12:00:/,/^=== .* 12:16:/' /var/log/sa/ps/today |
 sort -k 1n -k 16 

(As opções de classificação assumem que a hora está na coluna 16, o que pode ou não ser o caso). Agora você pode filtrar essa saída através do awk novamente para encontrar diferenças entre as linhas de saída:

... | awk 'lastpid && lastpid==$1 && last != $0 { print} /^[0-9]/ { lastpid=$1;last=$0; }'

Esse é um filtro bastante grosseiro. Para alguns processos (cuja linha de comando muda o tempo todo, como mysql, postgresql e snmpd), isso não será muito útil, mas espero que você possa ajustar o awk para ajudá-lo a encontrar o(s) culpado(s).

informação relacionada