Redefine o processo de execução quando certa quantidade de memória é consumida

6

Estou executando um Hydra no Raspberry PI. Houve alguns problemas com o programa, mas além destes, há um vazamento de memória oculta no programa. A fonte é muito grande e realmente não consegue encontrar o problema. Infelizmente, ao atingir o limite de memória, o programa não trava - em vez disso, ele retorna um monte de mensagens de erro. Quando digo bando, quero dizer centenas.

Entãoeupenseiqueseeunãopudessedesalocaramemóriadentrodoprograma,eupoderiaprecisarredefinirtodooprocesso.Entãoeupreciso:

  1. Protegerousoderecursosdoprocesso
  2. Pareoprocessograciosamente(parecidocomCtrl+C,oprogramadiz" sinal recebido 2 " então)
  3. Inicie o processo novamente

Eu devo fazer isso até consertar o programa para morrer em erros - ou não produzi-los em primeiro lugar.

Se você conhece a hydra e está curioso sobre os erros, encontrei pelo menos alguma coisa no código:

[ERROR] Fork for children failed: Cannot allocate memory
[ERROR] socketpair creation failed: Too many open files

A segunda parte dos erros vem da função do sistema perror C. É uma espécie de último erro.

    
por Tomáš Zato 16.01.2014 / 00:36

1 resposta

6

# 1 - Deus

Aqui está uma idéia usando a estrutura de monitoramento de processos Deus . Este aplicativo é escrito em Ruby, mas pode ser usado para assistir a outros processos e protegê-los contra o processo de execução, como a morte ou, no seu caso, usar muita memória RAM.

Configuração do Ruby

Supondo que você tenha o Ruby instalado - você pode usar o rvm (também conhecido como Ruby Version Manager) para fazer isso se você não o fizer , mas precisará ser instalado e / ou executado como root. Esta é uma exigência de deus. Você também pode instalar o Ruby a partir dos repositórios da sua distribuição, se estiver disponível.

Configuração de Deus

Com uma instalação de Ruby funcional, você instala a gema de Deus assim:

$ [sudo] gem install god

Exemplo

Você pode usar essa configuração simples de Deus para fazer o que quiser.

# /path/to/simple.god
God.watch do |w|
  w.name = "hydra"
  w.start = "<command to run hydra>"
  w.keepalive(:memory_max => 150.megabytes,
              :cpu_max => 50.percent)
end

Em seguida, invoque-o assim:

$ god -c /path/to/simple.god -D

Agora, se o Hydra exceder a utilização da CPU ou a memória usada, Deus irá reiniciá-lo. OBSERVAÇÃO: Por padrão, essas propriedades serão verificadas a cada 30 segundos e serão acionadas se houver um excedente de três de cinco verificações.

Indo mais longe

Dê uma olhada na documentação no site de Deus . O exemplo acima é de lá e eles fazem um trabalho muito mais completo de cobrir os detalhes.

# 2 - Monitor de Recursos do Processo

Outra alternativa é o Process Resource Monitor . A lista de recursos mostra que ele pode monitorar recursos por processo.

  • per-process/per-user rule based resource limits

trecho da descrição

Process Resource Monitor (PRM) is a CPU, Memory, Processes & Run (Elapsed) Time resource monitor for Linux & BSD. The flexibility of PRM is achieved through global scoped resource limits or rule-based per-process / per-user limits. A great deal of control of PRM is maintained through a number of ignore options, ability to configure soft/hard kill triggers, wait/recheck timings and to send kill signals to parent/children process trees. Additionally, the status output is very verbose by default with support for sending log data through syslog.

Exemplo

Para monitorar o Hydra, poderíamos criar um arquivo de regras como este, /usr/local/prm/rules//hydra.cmd :

IGNORE=""
MAX_CPU="50"
MAX_MEM="150"
MAX_PROC="0"
# we dont care about the process run time, set value 0 to disable check
MAX_ETIME="0"
KILL_TRIG="3"
# we want to set a bit longer soft rechecks as sometimes the problem fixes
# itself
KILL_WAIT="20"
KILL_PARENT="1"
KILL_SIG="9"
KILL_RESTART_CMD="/etc/init.d/hydra restart"

prm é executado via cron, /etc/cron.d/prm em intervalos de 5 minutos. De acordo com os documentos, isso provavelmente deveria ser deixado em paz.

    
por 16.01.2014 / 03:44