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 swappiness
parâ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.
Respostas:
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.
fonte
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
postmaster
processos 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 todospostmaster
processos? 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 cadapostmaster
processo 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.
Para quantos threads de liberação você está configurado? Usar
para descobrir e
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.
fonte
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.
fonte
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.
fonte
Você pode tentar desativar totalmente a troca?
ou algo assim - pelo menos, que valide a troca de seu problema, e não de outra coisa.
fonte
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 .
fonte
/proc/sys/vm/swappiness
.Você pode definir manualmente a permuta do kernel, que você pode ver
/proc/sys/vm/swappiness
ou emitir o comandosysctl vm.swappiness
. A troca é uma configuração do kernel que determina quanto a troca é usada.Ao definir,
sudo sysctl vm.swappiness=0
você está desativando efetivamente a partição de troca. Para fazer essa alteração permanente, você pode adicionar / modificarvm.swappiness=0
no/etc/sysctl.conf
. Você deve ver o que é um bom valor para você. Pessoalmente, eu o configureivm.swappiness=10
, sendo 60 o valor padrão.fonte
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
fonte
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.
fonte
Você investigou problemas com o cache do inode?
slabtop
deve, pelo menos, dar um ponto de partida se você estiver enfrentando algo assim.fonte
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.
fonte