Log de oom killer

3

Eu estou executando uma máquina virtual em um provedor onde você paga por tudo que você usa (CPU, memória, disco IO, largura de banda, etc). Atualmente minha máquina tem 512MB de RAM e 1GB de área de troca.

A versão do kernel é 3.8.0-21 e a distribuição é Ubuntu 13.04, mas suspeito que o kernel possa ser customizado, porque as atualizações do kernel são retidas.

Eu executo alguns cron jobs onde processos Python estão fazendo coisas com um banco de dados PostgreSQL. Ultimamente, os processos em Python foram mortos pelo assassino da OOM.

Eu não preciso de ajuda para resolver o problema real, posso aumentar a memória, reprogramar as tarefas do cron, desativar a supercomprometimento de memória, ajustar as configurações do PostgreŚQL, alterar o funcionamento dos programas em Python, mas primeiro gostaria de sabe exatamente porque isso acontece (para fazer a correção correta). A única coisa é que eu tenho muito livre de swap no momento da matança, mas sem memória física.

Eu tenho o seguinte no log do kernel:

[4003981.650341] select 1 (init), adj 0, size 249, to kill
[4003981.650349] select 609 (rsyslogd), adj 0, size 609, to kill
[4003981.650359] select 17139 (postgres), adj 0, size 635, to kill
[4003981.650361] select 10381 (postgres), adj 0, size 6719, to kill
[4003981.650365] select 14153 (postgres), adj 0, size 7296, to kill
[4003981.650367] select 14159 (postgres), adj 0, size 7300, to kill
[4003981.650370] select 26802 (python3), adj 0, size 70767, to kill
[4003981.650372] send sigkill to 26802 (python3), adj 0, size 70767

Eu corro wmstat a cada segundo na mesma época (o processo em Python foi morto antes de 12:13:48):

2014-02-01 12:13:43 procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
2014-02-01 12:13:43  r  b   swpd   free  inact active   si   so    bi    bo   in   cs us sy id wa
2014-02-01 12:13:43  1  0     55      5    216    217    0    0   964   396  386  514 71 10  0 18
2014-02-01 12:13:44  1  1     55     87    185    166    0    0 22304 14536  907 1241 53  9  0 38
2014-02-01 12:13:45  1  0     55     60    190    189    0    0 21768 17344 1216 4581 21 26  0 53
2014-02-01 12:13:46  1  1     57      6    218    214    0    0 22264  4836 1031 3696 22 43  0 35
2014-02-01 12:13:47  2  1     59      4    217    218    0    0 28228 29892 1045 6234 22 34  0 44
2014-02-01 12:13:48  1  2     73    272     97     74    0    0 39436 14372  975 3708 10 38  0 52
2014-02-01 12:13:49  1  0     73    185    173     85    0    0 78400   356 1154 1943 23 33  0 44
2014-02-01 12:13:51  1  1     73    247    132     65    0    0  1936     0  165  188  7 13 69 11

Agora, para a pergunta real: eu vi outras perguntas aqui ( como esta ), onde há um log com mais detalhes sobre a memória (DMA, memória normal, etc). Eu não consigo encontrá-lo em qualquer lugar no meu sistema. É algo que precisa ser ativado ou onde posso encontrá-lo?

A informação que estou procurando é algo assim:

Free pages:        6524kB (0kB HighMem)
Active:20 inactive:23 dirty:0 writeback:0 unstable:0 free:1631 slab:874 mapped:20 pagetables:90
DMA free:6524kB min:1200kB low:1500kB high:1800kB active:80kB inactive:92kB present:16384kB pages_scanned:41 all_unreclaimable? no
lowmem_reserve[]: 0 0 0
Normal free:0kB min:0kB low:0kB high:0kB active:0kB inactive:0kB present:0kB pages_scanned:0 all_unreclaimable? no
lowmem_reserve[]: 0 0 0
HighMem free:0kB min:128kB low:160kB high:192kB active:0kB inactive:0kB present:0kB pages_scanned:0 all_unreclaimable? no
lowmem_reserve[]: 0 0 0
DMA: 411*4kB 252*8kB 113*16kB 27*32kB 1*64kB 1*128kB 0*256kB 0*512kB 0*1024kB 0*2048kB 0*4096kB = 6524kB
Normal: empty
HighMem: empty
Swap cache: add 24282, delete 24269, find 7705/11790, race 0+0
Free swap  = 124768kB
Total swap = 128448kB
Out of Memory: Killed process 453 (smbd).
    
por ygram 01.02.2014 / 14:37

2 respostas

2

Não sei ao certo qual log você está se referindo, mas há um sistema de registro que é frequentemente incluído na maioria das distros chamada sar , normalmente em um pacote chamado sysstat .

Também escrevi este U & QA & A que abrange uma variedade de métodos para registro de informações de desempenho, intitulado: " Comandos para determinar o nível de uso do servidor "

Referências adicionais de sar

por 01.02.2014 / 16:37
0

Deixe-me primeiro explicar quando e por que o OOMKiller é invocado?

No seu caso você tem 512 RAM + 1GB de memória Swap. Então, em teoria, sua CPU tem acesso a um total de 1,5 GB de memória virtual.

Agora, há algum tempo tudo está funcionando bem dentro de 1,5 GB de memória total. Mas de repente (ou gradualmente) seu sistema começou a consumir mais e mais memória e chegou a um ponto em torno de 95% da memória total usada.

Agora diga que qualquer processo (no seu caso python) solicitou um grande chunck de memória do kernel. O kernel verifica a memória disponível e descobre que não há como alocar mais memória ao processo. Então, ele tentará liberar alguma memória chamando / invocando OOMKiller ( link ).

OOMKiller tem seu próprio algoritmo para classificar a classificação de cada processo. Normalmente, qual processo usa mais memória se torna a vítima (python em seu primeiro conjunto de logs; e smbd na seção posterior de logs).

Onde posso encontrar logs do OOMKiller?

Normalmente, no diretório / var / log. Ou /var/log/kern.log ou / var / log / dmesg

Espero que isso ajude você.

Algumas soluções típicas:

  1. Aumenta a memória (não troca)
  2. Encontre os vazamentos de memória no seu programa e corrija-os
  3. Restringir a memória que qualquer processo pode consumir (por exemplo, a memória da JVM pode ser restrita usando JAVA_OPTS)
  4. Veja os registros e o google:)
por 05.04.2016 / 02:31