Eu tenho um aplicativo de serviço daemon executando um servidor Ubuntu (20.04.1). A memória física total é de 2G e o espaço de troca é de 4G.
Às vezes, meu serviço foi morto pelo sistema operacional silenciosamente, embora eu adicionei OOMScoreAdjust=-1000
ao meu arquivo de descrição do serviço systemd em /etc/systemd/system/
, mas é um aplicativo crítico que NÃO deve ser morto. Eu acho que a razão pela qual ele foi morto talvez seja por usar muito mais memória.
Eu preciso obter logs detalhados sobre o uso de memória do meu serviço, por exemplo, uma entrada de log a cada minuto, para que eu possa descobrir o valor máximo disso e ajustar os requisitos de outros serviços, como o postgresql.
É um aplicativo daemon e executando um VPS na nuvem, portanto, NÃO posso iniciar um top
comando e assisti-lo continuamente.
Existe uma maneira, em que eu possa gerar tal log?
Obrigado!
Você pode fazer isso de maneira profissional ou hack. Você pode usar várias soluções de monitoramento e/ou contabilidade de processos, ou pode simplesmente executar a
systemctl status | grep something
cada minuto e gravar o uso de memória conforme relatado pelo Systemd (que usa grupos de controle do kernel).Com base na resposta de Halfgaar, fazendo de maneira simples, mas sem
systemd status | grep something
Primeiro, eu recomendaria fortemente o uso de uma solução de monitoramento de algum tipo - instalar o Prometheus systemd-exporter deve ser bastante fácil e executar o Prometheus em qualquer outra máquina para recuperar as estatísticas deve ser - pode até estar em um dispositivo em casa/corp por apenas contanto que você depure esse problema. Nesta configuração, as métricas
systemd_process_resident_memory_bytes
,systemd_process_virtual_memory_bytes
esystemd_process_virtual_memory_max_bytes
provavelmente seriam as mais interessantes.cgroups (tudo isso dependendo da v2) tem um sistema de arquivos em /sys/fs/cgroup no qual você pode consultar muitas informações. O mais interessante para você é
memory.stat
, do qual a primeira linhaanon $someNumber
é provavelmente o valor mais interessante (fornecendo bytes de memória em uso que não são suportados por arquivos e, portanto, não podem ser removidos da memória em nenhum outro lugar que não seja swap).Se você quiser isso por serviço systemd, você pode usar, por exemplo
/sys/fs/cgroup/system.slice/systemd-journald.service/memory.stat
, , fornecendo a memória para tudo em systemd-journald.service (o processo para este serviço e tudo iniciado por isso). Você também pode diferenciar entresystem
euser
(minha sessão gráfica atual no meu laptop, onde escrevo isso, estaria emuser
) usando/sys/fs/cgroup/system.slice/memory.stat
/.../user.slice/memory.stat
em vez disso.Sua versão mais antiga do Ubuntu pode ter cgroups v1, nesse caso os caminhos são diferentes - dê uma olhada nos documentos para isso: https://manpages.ubuntu.com/manpages/focal/man7/cgroups.7.html para cgroups em geral , https://www.kernel.org/doc/Documentation/cgroup-v1/memory.txt#cat-sysfscgroupmemory0memoryusage_in_bytes para controlador de memória cgroup v1.
Depois de alguns experimentos, sinto que é uma solução boa e simples o suficiente:
Adicione um trabalho crontab para executar o seguinte comando a cada minuto:
*/1 * * * * top -bn1|grep my_app_name >> /some/where/memory-usage.log
Com este arquivo de log, posso facilmente descobrir o uso máximo.