Meu aplicativo é executado como um processo em segundo plano no Linux. Atualmente, ele é iniciado na linha de comando em uma janela do Terminal.
Recentemente, um usuário estava executando o aplicativo por um tempo e ele morreu misteriosamente. O texto:
Morto
estava no terminal. Isso aconteceu duas vezes. Perguntei se alguém em um terminal diferente usava o comando kill para matar o processo? Não.
Sob quais condições o Linux decidiria matar meu processo? Eu acredito que o shell exibiu "matado" porque o processo morreu após receber o sinal de matar (9). Se o Linux enviou o sinal de interrupção, deve haver uma mensagem em um log do sistema em algum lugar que explique por que ele foi morto?
/var/log/messages
(3) a concha sob a qual o ran processo que é o processo que imprime aKilled
notificação quando o estado de saída dewaitpid(2)
indica o processo filho morreu de sinal 9./var/log/syslog
Respostas:
Se o usuário ou sysadmin não matou o programa, o kernel pode ter. O kernel apenas mataria um processo em circunstâncias excepcionais, como falta de recursos extrema (pense em exaustão de mem + swap).
fonte
dmesg
para ver o log do kernel: aqui encontro meus processos python mortos pelo kernel devido ao consumo extremo de memória virtual.Tentar:
Onde
-B100
significa o número de linhas antes da morte acontecer.Omitir -T no Mac OS.
fonte
info egrep
: "egrep é o mesmo que grep -E. ... Chamada direta, pois egrep ou fgrep está obsoleto" #'killed process'
você pode simplesmente usar emgrep
vez deegrep
sem outras alterações. Para um padrão mais complexo, você alteraria substituir, por exemplo,egrep -i -B100 'foo|ba[rz]'
porgrep -E -i -B100 'foo|ba[rz]'
. Esta sessão de perguntas e respostas fornece mais detalhes.dmesg -T
a fim de obter timestamps legíveisParece um bom artigo sobre o assunto: Domando o assassino do OOM .
A essência é que o Linux supercomprometememória. Quando um processo pede mais espaço, o Linux concede esse espaço, mesmo que seja reivindicado por outro processo, supondo que ninguém realmente use toda a memória que solicita. O processo obterá uso exclusivo da memória alocada quando realmente o usar, e não quando solicitar. Isso torna a alocação rápida e pode permitir que você "trapaceie" e aloque mais memória do que realmente possui. No entanto, quando os processos começam a usar essa memória, o Linux pode perceber que foi muito generoso ao alocar memória que não possui e terá que interromper um processo para liberar algumas. O processo a ser morto é baseado em uma pontuação que leva em consideração o tempo de execução (processos de longa execução são mais seguros), uso de memória (processos gananciosos são menos seguros) e alguns outros fatores, incluindo um valor que você pode ajustar para diminuir a probabilidade de um processo ser morto. Tudo está descrito no artigo com muito mais detalhes.
Edit: E aqui está outro artigo que explica muito bem como um processo é escolhido (anotado com alguns exemplos de código do kernel). O bom disso é que ele inclui alguns comentários sobre o raciocínio por trás das várias
badness()
regras.fonte
Deixe-me explicar primeiro quando e por que o OOMKiller é chamado?
Digamos que você tenha 512 MB de memória RAM + 1 GB de swap. Portanto, em teoria, sua CPU tem acesso a um total de 1,5 GB de memória virtual.
Agora, por algum tempo, tudo está funcionando bem, com 1,5 GB de memória total. Mas de repente (ou gradualmente) seu sistema começou a consumir mais e mais memória e atingiu um ponto em torno de 95% da memória total usada.
Agora diga que qualquer processo solicitou grande quantidade 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 seu processo. Portanto, ele tentará liberar alguma memória chamando / invocando o OOMKiller ( http://linux-mm.org/OOM ).
OOMKiller possui seu próprio algoritmo para classificar a classificação para cada processo. Normalmente, qual processo usa mais memória torna-se a vítima a ser morta.
Onde posso encontrar registros do OOMKiller?
Normalmente no diretório / var / log. /Var/log/kern.log ou / var / log / dmesg
Espero que isso ajude você.
Algumas soluções típicas:
fonte
Este é o gerenciador de memória insuficiente (OOM) do Linux . Seu processo foi selecionado devido a " danos " - uma combinação de recenteidade, tamanho de residente (memória em uso, e não apenas alocada) e outros fatores.
Você verá uma mensagem como:
fonte
Como o dwc e Adam Jaskiewicz declararam, o culpado é provavelmente o OOM Killer. No entanto, a próxima pergunta a seguir é: Como evito isso?
Existem várias maneiras:
Eu achei (2) especialmente fácil de implementar, graças a este artigo .
fonte
O módulo PAM para limitar recursos causou exatamente os resultados que você descreveu: Meu processo morreu misteriosamente com o texto Killed na janela do console. Nenhuma saída de log, nem no syslog nem no kern.log . O programa principal me ajudou a descobrir que, exatamente após um minuto de uso da CPU, meu processo é interrompido.
fonte
Uma ferramenta como systemtap (ou um rastreador) pode monitorar a lógica de transmissão de sinal do kernel e reportar. por exemplo, https://sourceware.org/systemtap/examples/process/sigmon.stp
O
if
bloco de filtragem nesse script pode ser ajustado a seu gosto ou eliminado para rastrear o tráfego de sinal em todo o sistema. As causas podem ser isoladas ainda mais coletando backtraces (adicione umprint_backtrace()
e / ouprint_ubacktrace()
ao probe, para o kernel e o espaço do usuário, respectivamente).fonte
Em um ambiente lsf (interativo ou não), se o aplicativo exceder a utilização de memória além de algum limite predefinido pelos administradores na fila ou a solicitação de recurso ao enviar para a fila, os processos serão eliminados para que outros usuários não sejam vítimas de um potencial fugir. Nem sempre envia um email quando o faz, dependendo de como está configurado.
Uma solução nesse caso é encontrar uma fila com recursos maiores ou definir requisitos de recursos maiores no envio.
Você também pode revisar
man ulimit
Embora eu não me lembro
ulimit
resultando emKilled
sua sido um tempo desde que eu precisava disso.fonte
Tivemos problemas recorrentes no Linux no site de um cliente (Red Hat, eu acho), com o OOMKiller (killer de falta de memória) matando nosso aplicativo principal (ou seja, a razão pela qual o servidor existe) e seus processos de banco de dados.
Em cada caso, o OOMKiller simplesmente decidiu que os processos estavam usando muitos recursos ... a máquina nem estava prestes a falhar por falta de recursos. Nem o aplicativo nem o banco de dados têm problemas com vazamentos de memória (ou qualquer outro vazamento de recurso).
Eu não sou um especialista em Linux, mas preferi reunir seu algoritmo para decidir quando matar algo e o que matar é complexo. Além disso, me disseram (não posso falar sobre a precisão disso) que o OOMKiller está inserido no Kernel e você não pode simplesmente não executá-lo.
fonte
echo "2" > /proc/sys/vm/overcommit_memory
sudo echo "2" > /proc/sys/vm/overcommit_memory
/ proc / sys / vm / overcommit_memory: Permissão negadaecho 2 | sudo tee /proc/sys/vm/overcommit_memory
No meu caso, isso estava acontecendo com um trabalhador de fila do Laravel. Os logs do sistema não mencionaram nenhum assassinato, então eu olhei mais longe e constatou-se que o trabalhador estava basicamente se matando por causa de um trabalho que excedia o limite de memória (que é definido como 128M por padrão).
Executar o trabalhador da fila
--timeout=600
e--memory=1024
corrigiu o problema para mim.fonte
O usuário tem a capacidade de matar seus próprios programas, usando kill ou Control + C, mas tenho a impressão de que não foi isso que aconteceu e que o usuário se queixou de você.
O root tem a capacidade de matar programas, é claro, mas se alguém tiver root na sua máquina e estiver matando coisas, você terá problemas maiores.
Se você não é o administrador de sistemas, o administrador de sistemas pode ter configurado cotas na CPU, RAM, uso de disco ou processos de auto-eliminação que os excedam.
Além dessas suposições, não tenho certeza sem mais informações sobre o programa.
fonte
Encontrei esse problema recentemente. Finalmente, descobri que meus processos foram interrompidos logo após a atualização do opensuse zypper ser chamada automaticamente. Para desativar a atualização do zypper, resolvi o meu problema.
fonte
Resolvido esse problema aumentando o tamanho do swap :
/ubuntu/1075505/how-do-i-increase-swapfile-in-ubuntu-18-04
fonte