Mi aplicación se ejecuta como un proceso en segundo plano en Linux. Actualmente se inicia en la línea de comando en una ventana de Terminal.
Recientemente, un usuario estaba ejecutando la aplicación por un tiempo y murió misteriosamente. El texto:
Delicado
Estaba en la terminal. Esto sucedió dos veces. Pregunté si alguien en una Terminal diferente usó el comando kill para matar el proceso. No.
¿En qué condiciones Linux decidiría matar mi proceso? Creo que el caparazón se mostró "asesinado" porque el proceso murió después de recibir la señal de matar (9). Si Linux envió la señal de apagado, ¿debería haber un mensaje en un registro del sistema en algún lugar que explique por qué fue eliminado?
/var/log/messages
(3) El shell bajo el cual se ejecutó el proceso, que es el proceso que imprime laKilled
notificación cuando el estado de salidawaitpid(2)
indica que el proceso secundario murió por la señal 9./var/log/syslog
Respuestas:
Si el usuario o el administrador del sistema no mataron el programa que el kernel puede tener. El kernel solo mataría un proceso en circunstancias excepcionales, como la falta de recursos extrema (piense en mem + agotamiento de intercambio).
fuente
dmesg
para ver el registro del kernel: aquí encuentro mis procesos de python eliminados por el kernel debido al consumo extremo de memoria virtual.Tratar:
Donde
-B100
significa el número de líneas antes de que ocurriera la muerte.Omitir -T en Mac OS.
fuente
info egrep
: "egrep es lo mismo que grep -E ... invocación directa, ya sea como egrep o fgrep está en desuso."'killed process'
que puede usar engrep
lugar deegrep
sin otros cambios. Para un patrón más complejo, cambiaría reemplazar, por ejemplo,egrep -i -B100 'foo|ba[rz]'
congrep -E -i -B100 'foo|ba[rz]'
. Este Q&A da más detalles.dmesg -T
para obtener marcas de tiempo legiblesEsto parece un buen artículo sobre el tema: domar al asesino OOM .
La esencia es que Linux compromete demasiadomemoria. Cuando un proceso solicita más espacio, Linux le dará ese espacio, incluso si es reclamado por otro proceso, bajo el supuesto de que nadie realmente usa toda la memoria que solicita. El proceso obtendrá un uso exclusivo de la memoria que ha asignado cuando realmente lo usa, no cuando lo solicita. Esto hace que la asignación sea rápida y puede permitirle "engañar" y asignar más memoria de la que realmente tiene. Sin embargo, una vez que los procesos comiencen a usar esta memoria, Linux podría darse cuenta de que ha sido demasiado generoso al asignar memoria que no tiene, y tendrá que eliminar un proceso para liberar algo. El proceso que debe eliminarse se basa en una puntuación que tiene en cuenta el tiempo de ejecución (los procesos de ejecución prolongada son más seguros), el uso de memoria (los procesos codiciosos son menos seguros) y algunos otros factores, incluido un valor que puede ajustar para hacer que un proceso sea menos probable que se elimine. Todo se describe en el artículo con mucho más detalle.
Editar: Y aquí hay otro artículo que explica bastante bien cómo se elige un proceso (anotado con algunos ejemplos de código de kernel). Lo bueno de esto es que incluye algunos comentarios sobre el razonamiento detrás de las diversas
badness()
reglas.fuente
Permítanme explicar primero cuándo y por qué se invoca a OOMKiller.
Digamos que tiene 512 RAM + 1GB de memoria de intercambio. Entonces, en teoría, su CPU tiene acceso a un total de 1.5GB de memoria virtual.
Ahora, durante algún tiempo, todo funciona bien dentro de 1,5 GB de memoria total. Pero de repente (o gradualmente) su sistema ha comenzado a consumir más y más memoria y alcanzó un punto en torno al 95% de la memoria total utilizada.
Ahora supongamos que cualquier proceso ha solicitado una gran cantidad de memoria del núcleo. Kernel verifica la memoria disponible y descubre que no hay forma de que pueda asignar más memoria a tu proceso. Por lo tanto, intentará liberar memoria invocando / invocando OOMKiller ( http://linux-mm.org/OOM ).
OOMKiller tiene su propio algoritmo para calificar el rango de cada proceso. Por lo general, qué proceso usa más memoria se convierte en la víctima a matar.
¿Dónde puedo encontrar registros de OOMKiller?
Típicamente en el directorio / var / log. /Var/log/kern.log o / var / log / dmesg
Espero que esto te ayudará.
Algunas soluciones típicas:
fuente
Este es el administrador de Linux sin memoria (OOM) . Su proceso fue seleccionado debido a ' maldad ': una combinación de actualidad, tamaño de residente (memoria en uso, en lugar de solo asignada) y otros factores.
Verás un mensaje como:
fuente
Como dwc y Adam Jaskiewicz han declarado, el culpable es probablemente el Asesino OOM. Sin embargo, la siguiente pregunta que sigue es: ¿Cómo evito esto?
Hay varias formas:
Descubrí que (2) es especialmente fácil de implementar, gracias a este artículo .
fuente
El módulo PAM para limitar los recursos causó exactamente los resultados que describió: mi proceso murió misteriosamente con el texto Asesinado en la ventana de la consola. No hay salida de registro, ni en syslog ni en kern.log . El programa superior me ayudó a descubrir que exactamente después de un minuto de uso de la CPU, mi proceso se anula.
fuente
Una herramienta como systemtap (o un trazador) puede monitorear la lógica de transmisión de señal del núcleo e informar. por ejemplo, https://sourceware.org/systemtap/examples/process/sigmon.stp
El
if
bloque de filtrado en ese script puede ajustarse al gusto o eliminarse para rastrear el tráfico de señal en todo el sistema. Las causas pueden aislarse aún más mediante la recopilación de trazas inversas (agregue ayprint_backtrace()
/ oprint_ubacktrace()
a la sonda, para el núcleo y el espacio de usuario, respectivamente).fuente
En un entorno lsf (interactivo o de otro tipo) si la aplicación excede la utilización de la memoria más allá de un umbral preestablecido por los administradores en la cola o la solicitud de recursos al enviar a la cola, los procesos serán eliminados para que otros usuarios no sean víctimas de un potencial huir. No siempre envía un correo electrónico cuando lo hace, dependiendo de cómo esté configurado.
Una solución en este caso es encontrar una cola con recursos más grandes o definir requisitos de recursos más grandes en el envío.
Es posible que también desee revisar
man ulimit
Aunque no recuerdo haber
ulimit
resultado en queKilled
haya pasado un tiempo desde que lo necesitaba.fuente
Hemos tenido problemas recurrentes bajo Linux en el sitio de un cliente (Red Hat, creo), con OOMKiller (asesino sin memoria) matando tanto nuestra aplicación principal (es decir, la razón por la que existe el servidor) como sus procesos de base de datos.
En cada caso, OOMKiller simplemente decidió que los procesos usaban muchos recursos ... la máquina ni siquiera estaba a punto de fallar por falta de recursos. Ni la aplicación ni su base de datos tienen problemas con pérdidas de memoria (o cualquier otra pérdida de recursos).
No soy un experto en Linux, pero más bien reuní su algoritmo para decidir cuándo matar algo y qué matar es complejo. Además, me dijeron (no puedo hablar de la precisión de esto) que OOMKiller está integrado en el Kernel y que no se puede simplemente no ejecutarlo.
fuente
echo "2" > /proc/sys/vm/overcommit_memory
sudo echo "2" > /proc/sys/vm/overcommit_memory
/ proc / sys / vm / overcommit_memory: Permiso denegadoecho 2 | sudo tee /proc/sys/vm/overcommit_memory
En mi caso, esto estaba sucediendo con un trabajador de cola Laravel. Los registros del sistema no mencionaron ningún asesinato, así que busqué más y resultó que el trabajador básicamente se estaba suicidando debido a un trabajo que excedía el límite de memoria (que está configurado en 128M por defecto).
Ejecutando el trabajador de cola con
--timeout=600
y--memory=1024
solucionó el problema para mí.fuente
El usuario tiene la capacidad de matar sus propios programas, usando kill o Control + C, pero tengo la impresión de que no es lo que sucedió, y que el usuario se quejó a usted.
root tiene la capacidad de matar programas, por supuesto, pero si alguien tiene root en su máquina y está matando cosas, tiene mayores problemas.
Si no es el administrador del sistema, el administrador del sistema puede haber configurado cuotas en la CPU, la RAM, el uso del disco ort y los procesos de eliminación automática que los superan.
Aparte de esas conjeturas, no estoy seguro sin más información sobre el programa.
fuente
Encontré este problema últimamente. Finalmente, descubrí que mis procesos se interrumpieron justo después de que se llamara automáticamente a la actualización de Opensuse zypper. Para deshabilitar la actualización de zypper resolvió mi problema.
fuente
Resolvió este problema aumentando el tamaño del intercambio :
/ubuntu/1075505/how-do-i-increase-swapfile-in-ubuntu-18-04
fuente