Como definir os ajustes matadores de OOM para daemons permanentemente?

10

Executando alguns servidores Linux com um ou apenas alguns daemons vitais do serviço do sistema, eu gostaria de ajustar o killer da OOM para aqueles processos daemonizados no caso de algo estranho acontecer. Por exemplo, hoje em dia algum servidor Ubuntu executando o MySQL tem um daemon do MySQL morto porque toneladas de apt-checker processam estavam consumindo toda a memória e o kernel achou que era uma boa idéia matar o MySQL.

Eu sei que posso ajustar a pontuação usando o arquivo /proc/$(pidof mysqld)/oom_score_adj para dar ao kernel alguma pista Eu não prefiro que o MySQL seja morto, mas isso não sobrevive a uma reinicialização do serviço. Devo editar scripts init / upstart do pacote para incluir esses ajustes? Não acho que seja uma solução muito elegante, pois faria ajustes em arquivos pertencentes a um pacote. Seria possível conectar-se aos scripts do upstart / init em geral e ajustá-lo condicionalmente? Ou você sugeriria executar um script indefinido como while true{ adjust_oom(); sleep 60;} ?

    
por gertvdijk 19.12.2012 / 12:09

3 respostas

2

Vários sistemas modernos de supervisão de demos têm um meio para fazer isso. (De fato, como existe uma ferramenta de carregamento de cadeia para o trabalho, sem dúvida eles todos têm um meio para fazer isso.)

  • Upstart: Use oom score no arquivo de trabalho.
    oom score -500
  • systemd: Use a configuração OOMScoreAdjust= na unidade de serviço. Você pode usar os arquivos de patch da unidade de serviço para afetar unidades de serviço pré-empacotadas.
    [Service]
    OOMScoreAdjust=-500
  • família de daemontools : Use a ferramenta oom-kill-protect do conjunto de ferramentas do negócio na run programa para o serviço.

    Se você estiver convertendo uma unidade de serviço do sistema, a ferramenta convert-systemd-units irá, de fato, converter a configuração OOMScoreAdjust= em tal chamada de oom-kill-protect .

    #!/bin/nosh

    oom-kill-protect -- -500

    program arguments
    Como bônus, você pode torná-lo parametrizável:
    oom-kill-protect -- fromenv
    e definir o valor do parâmetro no ambiente do serviço (presume-se que seja lido de um envdir associado ao serviço, aqui manipulado com rcctl shim do conjunto de ferramentas do nosh ):
    rcctl set servicename oomprotect -500

Leitura adicional

  • Jonathan de Boyne Pollard (2016). oom-kill-protect . conjunto de ferramentas. Softwares.
  • James Hunt e Clint Byrum (2014). " oom score ". Cookbook Upstart .
  • Lennart Poettering (2013-10-07). " OOMScoreAdjust ". %código%. páginas de manual do systemd. freedesktop.org.
  • Jonathan de Boyne Pollard. systemd.exec . conjunto de ferramentas. Softwares.
  • link
por 07.12.2017 / 15:24
8

Isso é possível no Ubuntu usando o Upstart e a opção de configuração oom score .

oom score

Linux has an "Out of Memory" killer facility. [...]

Normally the OOM killer regards all processes equally, this stanza advises the kernel to treat this job differently.

The "adjustment" value provided to this stanza may be an integer value from -999 (very unlikely to be killed by the OOM killer) up to 1000 (very likely to be killed by the OOM killer). [...]

Example:

# this application is a "resource hog"
oom score 1000

expect daemon
respawn
exec /usr/bin/leaky-app
    
por 21.01.2013 / 16:11
4

Você pode hackear o MySQL (por exemplo, sshd do OpenSSH faz isso), mas isso é um pouco hardcore e muito sujo (problemas com atualizações, etc.)

Você pode fazer isso em um wrapper ou no script de inicialização - a pontuação deve ser herdada (e, em um wrapper, você provavelmente desejará fazer exec mysqld "$@" de qualquer maneira).

Use cgroups - ele dará a você um pouco mais de flexibilidade e poderá se tornar permanente no sentido de que as configurações apropriadas podem ser aplicadas automaticamente na reinicialização do serviço. Veja por exemplo controlando a prioridade de aplicativos usando cgroups para mais informações. Para alcançar o automatismo que você está procurando, você provavelmente vai querer dar uma olhada em libcgroup , que contém um daemon que pode lidar com mudanças de cgroups de um processo em execução na hora de acordo com um conjunto de regras, ou apenas use o cgexec wrapper (do mesmo pacote).

    
por 20.12.2012 / 00:08