O servidor Linux usa apenas 60% da memória e depois troca

12

Eu tenho um servidor Linux que está executando nosso sistema de backup bacula. A máquina está moendo como louca porque está ficando pesada para trocar. O problema é que ele está usando apenas 60% de sua memória física!

Aqui está a saída de free -m:

free -m
             total       used       free     shared    buffers     cached
Mem:          3949       2356       1593          0          0          1
-/+ buffers/cache:       2354       1595
Swap:         7629       1804       5824

e alguns exemplos de saída de vmstat 1:

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 1843536 1634512      0   4188   54   13  2524   666    2    1  1  1 89  9  0
 1 11 1845916 1640724      0    388 2700 4816 221880  4879 14409 170721  4  3 63 30  0
 0  9 1846096 1643952      0      0 4956  756 174832   804 12357 159306  3  4 63 30  0
 0 11 1846104 1643532      0      0 4916  540 174320   580 10609 139960  3  4 64 29  0
 0  4 1846084 1640272      0   2336 4080  524 140408   548 9331 118287  3  4 63 30  0
 0  8 1846104 1642096      0   1488 2940  432 102516   457 7023 82230  2  4 65 29  0
 0  5 1846104 1642268      0   1276 3704  452 126520   452 9494 119612  3  5 65 27  0
 3 12 1846104 1641528      0    328 6092  608 187776   636 8269 113059  4  3 64 29  0
 2  2 1846084 1640960      0    724 5948    0 111480     0 7751 116370  4  4 63 29  0
 0  4 1846100 1641484      0    404 4144 1476 125760  1500 10668 105358  2  3 71 25  0
 0 13 1846104 1641932      0      0 5872  828 153808   840 10518 128447  3  4 70 22  0
 0  8 1846096 1639172      0   3164 3556  556 74884   580 5082 65362  2  2 73 23  0
 1  4 1846080 1638676      0    396 4512   28 50928    44 2672 38277  2  2 80 16  0
 0  3 1846080 1628808      0   7132 2636    0 28004     8 1358 14090  0  1 78 20  0
 0  2 1844728 1618552      0  11140 7680    0 12740     8  763 2245  0  0 82 18  0
 0  2 1837764 1532056      0 101504 2952    0 95644    24  802 3817  0  1 87 12  0
 0 11 1842092 1633324      0   4416 1748 10900 143144 11024 6279 134442  3  3 70 24  0
 2  6 1846104 1642756      0      0 4768  468 78752   468 4672 60141  2  2 76 20  0
 1 12 1846104 1640792      0    236 4752  440 140712   464 7614 99593  3  5 58 34  0
 0  3 1846084 1630368      0   6316 5104    0 20336     0 1703 22424  1  1 72 26  0
 2 17 1846104 1638332      0   3168 4080 1720 211960  1744 11977 155886  3  4 65 28  0
 1 10 1846104 1640800      0    132 4488  556 126016   584 8016 106368  3  4 63 29  0
 0 14 1846104 1639740      0   2248 3436  428 114188   452 7030 92418  3  3 59 35  0
 1  6 1846096 1639504      0   1932 5500  436 141412   460 8261 112210  4  4 63 29  0
 0 10 1846104 1640164      0   3052 4028  448 147684   472 7366 109554  4  4 61 30  0
 0 10 1846100 1641040      0   2332 4952  632 147452   664 8767 118384  3  4 63 30  0
 4  8 1846084 1641092      0    664 4948  276 152264   292 6448 98813  5  5 62 28  0

Além disso, a saída do top classificada pelo tempo da CPU parece apoiar a teoria de que a troca é o que está atolando o sistema:

top - 09:05:32 up 37 days, 23:24,  1 user,  load average: 9.75, 8.24, 7.12
Tasks: 173 total,   1 running, 172 sleeping,   0 stopped,   0 zombie
Cpu(s):  1.6%us,  1.4%sy,  0.0%ni, 76.1%id, 20.6%wa,  0.1%hi,  0.2%si,  0.0%st
Mem:   4044632k total,  2405628k used,  1639004k free,        0k buffers
Swap:  7812492k total,  1851852k used,  5960640k free,      436k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+    TIME COMMAND                                                                                                                             
 4174 root      17   0 63156  176   56 S    8  0.0   2138:52  35,38 bacula-fd                                                                                                                            
 4185 root      17   0 63352  284  104 S    6  0.0   1709:25  28,29 bacula-sd                                                                                                                            
  240 root      15   0     0    0    0 D    3  0.0 831:55.19 831:55 kswapd0                                                                                                                              
 2852 root      10  -5     0    0    0 S    1  0.0 126:35.59 126:35 xfsbufd                                                                                                                              
 2849 root      10  -5     0    0    0 S    0  0.0 119:50.94 119:50 xfsbufd                                                                                                                              
 1364 root      10  -5     0    0    0 S    0  0.0 117:05.39 117:05 xfsbufd                                                                                                                              
   21 root      10  -5     0    0    0 S    1  0.0  48:03.44  48:03 events/3                                                                                                                             
 6940 postgres  16   0 43596    8    8 S    0  0.0  46:50.35  46:50 postmaster                                                                                                                           
 1342 root      10  -5     0    0    0 S    0  0.0  23:14.34  23:14 xfsdatad/4                                                                                                                           
 5415 root      17   0 1770m  108   48 S    0  0.0  15:03.74  15:03 bacula-dir                                                                                                                           
   23 root      10  -5     0    0    0 S    0  0.0  13:09.71  13:09 events/5                                                                                                                             
 5604 root      17   0 1216m  500  200 S    0  0.0  12:38.20  12:38 java                                                                                                                                 
 5552 root      16   0 1194m  580  248 S    0  0.0  11:58.00  11:58 java

Aqui está o mesmo classificado pelo tamanho da imagem da memória virtual:

top - 09:08:32 up 37 days, 23:27,  1 user,  load average: 8.43, 8.26, 7.32
Tasks: 173 total,   1 running, 172 sleeping,   0 stopped,   0 zombie
Cpu(s):  3.6%us,  3.4%sy,  0.0%ni, 62.2%id, 30.2%wa,  0.2%hi,  0.3%si,  0.0%st
Mem:   4044632k total,  2404212k used,  1640420k free,        0k buffers
Swap:  7812492k total,  1852548k used,  5959944k free,      100k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+    TIME COMMAND                                                                                                                             
 5415 root      17   0 1770m   56   44 S    0  0.0  15:03.78  15:03 bacula-dir                                                                                                                           
 5604 root      17   0 1216m  492  200 S    0  0.0  12:38.30  12:38 java                                                                                                                                 
 5552 root      16   0 1194m  476  200 S    0  0.0  11:58.20  11:58 java                                                                                                                                 
 4598 root      16   0  117m   44   44 S    0  0.0   0:13.37   0:13 eventmond                                                                                                                            
 9614 gdm       16   0 93188    0    0 S    0  0.0   0:00.30   0:00 gdmgreeter                                                                                                                           
 5527 root      17   0 78716    0    0 S    0  0.0   0:00.30   0:00 gdm                                                                                                                                  
 4185 root      17   0 63352  284  104 S   20  0.0   1709:52  28,29 bacula-sd                                                                                                                            
 4174 root      17   0 63156  208   88 S   24  0.0   2139:25  35,39 bacula-fd                                                                                                                            
10849 postgres  18   0 54740  216  108 D    0  0.0   0:31.40   0:31 postmaster                                                                                                                           
 6661 postgres  17   0 49432    0    0 S    0  0.0   0:03.50   0:03 postmaster                                                                                                                           
 5507 root      15   0 47980    0    0 S    0  0.0   0:00.00   0:00 gdm                                                                                                                                  
 6940 postgres  16   0 43596   16   16 S    0  0.0  46:51.39  46:51 postmaster                                                                                                                           
 5304 postgres  16   0 40580  132   88 S    0  0.0   6:21.79   6:21 postmaster                                                                                                                           
 5301 postgres  17   0 40448   24   24 S    0  0.0   0:32.17   0:32 postmaster                                                                                                                           
11280 root      16   0 40288   28   28 S    0  0.0   0:00.11   0:00 sshd                                                                                                                                 
 5534 root      17   0 37580    0    0 S    0  0.0   0:56.18   0:56 X                                                                                                                                    
30870 root      30  15 31668   28   28 S    0  0.0   1:13.38   1:13 snmpd                                                                                                                                
 5305 postgres  17   0 30628   16   16 S    0  0.0   0:11.60   0:11 postmaster                                                                                                                           
27403 postfix   17   0 30248    0    0 S    0  0.0   0:02.76   0:02 qmgr                                                                                                                                 
10815 postfix   15   0 30208   16   16 S    0  0.0   0:00.02   0:00 pickup                                                                                                                               
 5306 postgres  16   0 29760   20   20 S    0  0.0   0:52.89   0:52 postmaster                                                                                                                           
 5302 postgres  17   0 29628   64   32 S    0  0.0   1:00.64   1:00 postmaster

Tentei ajustar o swappinessparâmetro do kernel para valores altos e baixos, mas nada parece mudar o comportamento aqui. Estou sem saber o que está acontecendo. Como posso descobrir o que está causando isso?

Atualização: o sistema é um sistema totalmente de 64 bits; portanto, não há dúvida de limitações de memória devido a problemas de 32 bits.

Atualização2: Como mencionei na pergunta original, eu já tentei ajustar o swappiness para todos os tipos de valores, incluindo 0. O resultado é sempre o mesmo, com aproximadamente 1,6 GB de memória restante não utilizado.

Update3: Adicionado saída superior às informações acima.

Kamil Kisiel
fonte
2
Parece que o Linux não está usando o cache da página para nada, mas você ainda tem uma grande quantidade de memória livre. Algo está claramente errado.
David Pashley
1
Você pode postar alguns detalhes adicionais do sistema operacional Linux? Fornecedor, lançamento, versão do kernel, etc? Há algumas ferramentas que eu gostaria de sugerir, mas algumas delas exigem uma versão específica do kernel ou uma versão da biblioteca de suporte.
Christopher Cashell

Respostas:

6

O desempenho do Bacula é altamente dependente do banco de dados. Provavelmente, é o postgresql que está matando seu servidor. A alta média de carga e a porcentagem bastante grande de tempo de CPU gasta no estado de espera mostram claramente que ele está aguardando E / S de disco ... E é isso que o PostgreSQL está fazendo. Para cada arquivo em seu backup, defina pelo menos uma instrução UPDATE. Não se preocupe com a troca.

Ajuste a instalação do PostgreSQL. Possivelmente, forneça ao banco de dados individual (ou mesmo tabelas) seus próprios discos / conjuntos de ataques para espalhar a E / S. Você pode forçar o PostgreSQL a usar gravações assíncronas, se ainda não estiver ... Embora esteja trocando a integridade do banco de dados pelo desempenho da gravação. Aumente a memória compartilhada disponível para o PostgreSQL. Isso aliviará pelo menos grande parte da leitura no banco de dados. Se você nunca fez isso, execute o VACCUM ANALYZE no banco de dados Bacula também para fornecer ao otimizador de consulta algo para trabalhar.

De longe, o ponto mais fraco de Bacula são as dependências do banco de dados (e a morte cerebral de algumas delas ...) Execute uma limpeza de um backup grande e recente e observe quanto tempo (muitas vezes) leva para executar algumas dezenas de milhões de consultas. .. Bacula gosta comparativamente poucos arquivos grandes, caso contrário, é um cachorro.

Alexandre Carmel-Veilleux
fonte
Obrigado. Isso realmente parece ser o cerne do problema. Vamos procurar maneiras de corrigi-lo.
Kamil Kisiel
19

Você está ligado à E / S. Seu sistema é um pequeno bote salva-vidas, atingido por um mar tempestuoso de ondas de paginação de buffer / cache / VM com 100 pés de altura.

Uau. Apenas Uau. Você está movendo cerca de 100Mbyte / s de sua E / S, ultrapassou 50% do tempo de CPU na espera de E / S e possui 4Gb de RAM. A contrapressão na VM deste servidor deve ser enorme. Em circunstâncias "normais", quando o sistema começa a armazenar em cache / buffer, qualquer RAM livre que você tiver será consumida viva em menos de 40 segundos .

Seria possível para deixar as configurações de /proc/sys/vm? Isso forneceria algumas dicas sobre o que seu kernel considera "normal".

Esses postmasterprocessos também indicam que você está executando o PostgreSQL em segundo plano. Isso é normal para sua configuração? O PostgreSQL em uma configuração padrão usará muito pouca RAM, mas uma vez que seja reajustado para velocidade, ele poderá consumir 25% a 40% da sua RAM disponível rapidamente. Portanto, posso apenas supor que, dado o número deles na saída, você esteja executando algum tipo de banco de dados de produção enquanto estiver executando backups. Isso não é um bom presságio. Você pode dar mais informações sobre por que ele está sendo executado? Qual é o tamanho do parâmetro de memória compartilhada para todospostmasterprocessos? Seria possível desligar o serviço ou reconfigurar temporariamente o banco de dados para usar menos conexões / buffers enquanto os backups estão em execução? Isso ajudará a aliviar parte da pressão da E / S já sobrecarregada e da RAM livre. Lembre-se de que cada postmasterprocesso consome RAM acima e além do que o banco de dados usa para o cache interno. Portanto, ao fazer ajustes nas configurações de memória, tenha cuidado com o que é "compartilhado" e o que é "por processo" .

Se você estiver usando o PostgreSQL como parte do seu processo de backup, tente ajustá-lo para aceitar apenas o número mínimo de conexões e reduza os parâmetros por processo para algo razoável (apenas alguns megas cada). A desvantagem disso é que o PostgreSQL se espalhará para o disco se não puder trabalhar com o conjunto de dados na RAM como ele deseja, de modo que realmente aumentará a E / S do disco , então ajuste-o com cuidado.

O X11 por si só não ocupa muita memória, mas uma sessão completa da área de trabalho pode consumir vários megas. Efetue logout de todas as sessões ativas que você possui e execute sua conexão no console ou através do SSH.

Ainda assim, acho que não é inteiramente um problema de memória. Se você tiver uma espera de E / S superior a 50% por longos períodos de tempo (e você estiver publicando números que atingem os anos 70), o gargalo resultante acabará esmagando o restante do sistema. Bem como Darth Vader esmaga pescoços.

Alguém do lado comercial do aperto de morte de Darth Vader

Para quantos threads de liberação você está configurado? Usar

cat /proc/sys/vm/nr_pdflush_threads

para descobrir e

echo "vm.nr_pdflush_threads = 1" >> /etc/sysctl.conf

para configurá-lo como um único encadeamento. Observe que o último comando faz o carregamento permanente durante a reinicialização. Ver 1 ou 2 não é incomum. Se você possui vários núcleos ou muita capacidade de eixo / barramento para E / S, convém aumentá-los (um pouco). Mais threads de liberação = mais atividade de E / S, mas também mais tempo de CPU gasto na espera de E / S.

É o valor padrão ou você o ultrapassou? Se você o ultrapassou, já pensou em diminuir o número para reduzir a pressão nas operações de E / S? Ou você tem um grande número de eixos e canais para trabalhar; nesse caso, você considerou aumentar o número de encadeamentos?

PS: você deseja definir a troca com os valores mais baixos, e não com os valores mais altos, para impedir a troca. Valor mais alto = 100 = troca como louco quando parece certo, valor mais baixo = 0 = tente não trocar de jeito nenhum.

Avery Payne
fonte
Vou dar uma olhada em algumas de suas sugestões. Não, eu não sou louco e estou executando um banco de dados de produção no sistema de backup. O PostgreSQL faz parte do sistema de backup, pois o Bacula usa isso como seu armazenamento de informações para rastrear o que está em qual fita, etc. Vou dar uma olhada no ajuste de alguns dos parâmetros especificados. A alta taxa de transferência de E / S é resultado de outros servidores despejando dados na bandeja de disco desse servidor e, posteriormente, puxando esses dados e gravando-os em uma biblioteca de fitas LTO4.
Kamil Kisiel
Como são organizados os discos do servidor? Você está usando uma configuração de unidade espelhada?
Avery Payne
1
1 para prosa roxo :)
pjc50
Sim, eu estava me sentindo um pouco criativo naquele dia. Desculpe pelo drama. :)
Avery Payne
7

Se você observar os blocos lidos por segundo (bi) em E / S, ela diminui a atividade de troca por várias ordens de magnitude. Eu não acho que o uso da troca seja o que está causando a debulha do disco, acho que você tem algo em execução na caixa que simplesmente está causando muita atividade no disco (leituras).

Eu investigaria os aplicativos em execução e veria se você pode encontrar o culpado.

Christopher Cashell
fonte
Bem, como eu disse, está executando o sistema de backup bacula. Os bloqueios provavelmente são o resultado de o servidor descarregar dados para sua matriz de discos SAS conectada externamente.
Kamil Kisiel
1
Você tem certeza de que o disco está na lixeira da troca e não dos backups? Quais outros processos estão sendo executados na caixa? Se o kernel é novo o suficiente, existem algumas ferramentas muito úteis por aí (iotop) que podem explorar as entranhas do uso io e até mesmo definir a prioridade de IO (ionice) se você estiver usando o agendador de CFO IO.
Christopher Cashell
6

Veja se este link responde a algumas de suas perguntas. Eu vejo regularmente a paginação do Linux (sem troca) de memória muito antes da utilização de 60%. Esta é uma parte esperada de seu ajuste de memória:

http://www.sheepguardingllama.com/?p=2252

Mas sua falta de buffers / cache me preocupa. Isso parece muito incomum. Então, eu estou pensando que algo mais está errado.

Scott Alan Miller
fonte
Ei - boa ligação - onde estão os buffers / cache? Eles estão desligados? Algo os está invalidando constantemente?
9119 MikeyB
6

Você pode tentar desativar totalmente a troca?

swapoff /dev/hdb2

ou algo assim - pelo menos, que valide a troca de seu problema, e não de outra coisa.

Tim Howland
fonte
+1 para confirmar que o diagnóstico presumido é realmente a causa do problema.
Wayne
Vou tentar fazer isso amanhã no trabalho. Além disso, meu spaw não está em / dev / hdb2;)
Kamil Kisiel
Deve-se notar, porém, que, apesar de ser uma boa ajuda para o diagnóstico, isso é muito perigoso em um sistema de produção. Se você realmente precisar da troca, ficará rapidamente sem memória RAM. E, em seguida, o assassino OOM virá e matar um processo aleatório, que pode ser apenas a sua produção DB ...
sleske
Concordou - você não deve fazer isso em lugar algum perto da produção.
21415 Tim Howland
3

Por padrão, a troca é definida como 60.

cat / proc / sys / vm / swappiness 60

Swappiness é um kernel usado para ajustar quanto o kernel favorece trocar sobre RAM; swappiness alto significa que o kernel trocará muito, e swappiness baixo significa que o kernel tentará não usar espaço de troca.

Podemos mudar essa edição do valor de vm.swappiness em /etc/sysctl.conf .

nitinas
fonte
Ou você pode escrever a porcentagem diretamente em /proc/sys/vm/swappiness.
user2284570
2

Você pode definir manualmente a permuta do kernel, que você pode ver /proc/sys/vm/swappinessou emitir o comando sysctl vm.swappiness. A troca é uma configuração do kernel que determina quanto a troca é usada.

Ao definir, sudo sysctl vm.swappiness=0você está desativando efetivamente a partição de troca. Para fazer essa alteração permanente, você pode adicionar / modificar vm.swappiness=0no /etc/sysctl.conf. Você deve ver o que é um bom valor para você. Pessoalmente, eu o configurei vm.swappiness=10, sendo 60 o valor padrão.

viajante
fonte
Não exatamente, com swappiness = 0, você está dizendo que nunca troque se houver uma maneira de evitá-lo, mas ainda troque se a única outra opção for falhar em uma alocação ou eliminar o OOM. Acho que uma troca de 30 é uma boa melhoria em laptops, mas não tive a necessidade de mexer com ela em outros sistemas.
LapTop006
1

Outra coisa que você pode querer observar é a fila de execução do kernel e os processos ininterruptos (as colunas 'r' e 'b' no vmstat) são um indicador de que o sistema está saturado às vezes. Em uma nota lateral, não confunda saturação com utilização ... o problema real pode ser uma pilha de processos faminta contra o kernel saturado :-(

Você também pode executar 'pmap -x [PID]' para obter detalhes adicionais da memória de alguns dos processos que mais consomem. Eu te desejo sorte!

Matt

Matt Cummings
fonte
1

Talvez você tenha processos de curta duração que usam muita memória e depois saia antes de ter a chance de notá-los.

Isso seria consistente com o que você está vendo de qualquer maneira.

MarkR
fonte
1

Você investigou problemas com o cache do inode? slabtopdeve, pelo menos, dar um ponto de partida se você estiver enfrentando algo assim.

serverhorror
fonte
0

Enquanto seu sistema tiver 64 bits, o sistema pode não ser capaz de endereçar toda a memória disponível. Essa é uma limitação do chipset. Por exemplo, a geração anterior do Mac mini "suporta" 4 GB de RAM, mas apenas 3,3 GB eram realmente endereçáveis.

Dustin
fonte
É um SGI Altix XE240, estou bastante certeza de que ele pode suportar mais de 4 GB de RAM como eu unidades de demonstração usado com 32 GB.
Kamil Kisiel
'tis não uma limitação chipset nos velhos mini, que pode chipset 8GB, no entanto a Apple não adicionar as linhas de endereçamento para lidar com ele adequadamente (IIRC, mas há um caso geral, há entre vários fabricantes)
LapTop006