¿Cómo establecer ajustes asesinos OOM para demonios de forma permanente?

12

Ejecutando algunos servidores Linux con solo o algunos demonios vitales de servicio del sistema, me gustaría ajustar el asesino OOM para esos procesos demonizados en caso de que ocurra algo extraño. Por ejemplo, hoy en día algún servidor Ubuntu ejecutar MySQL tiene un demonio de MySQL muerto a causa de toneladas de apt-checkerprocesos fueron consumiendo toda la memoria y el núcleo pensó que era una buena idea para matar MySQL.

Sé que puedo ajustar el puntaje usando el /proc/$(pidof mysqld)/oom_score_adjarchivo para darle al núcleo alguna pista. No prefiero que se elimine MySQL, pero eso no sobrevive al reinicio del servicio. ¿Debo editar las secuencias de comandos init / upstart del paquete para incluir estos ajustes? No creo que sea una solución muy elegante, ya que haría ajustes a los archivos que pertenecen a un paquete. ¿Sería posible enganchar en scripts de arranque / inicio en general y ajustarlo condicionalmente? ¿O sugeriría ejecutar un script indefinido como while true{ adjust_oom(); sleep 60;}?

gertvdijk
fuente
Interesante que existe la posibilidad de ajustar eso. Supongo que no hay nada mejor que tu ciclo infinito para realizar el trabajo. El OOM-killer está enterrado en el interior del núcleo y tiene un algoritmo muy oscuro.
Nils

Respuestas:

8

Varios sistemas modernos de supervisión de dæmon tienen un medio para hacerlo. (De hecho, dado que existe una herramienta de carga en cadena para el trabajo, podría decirse que todos tienen un medio para hacerlo).

  • Upstart: uso oom scoreen el archivo de trabajo.
    oom score -500
  • systemd: use la OOMScoreAdjust=configuración en la unidad de servicio. Puede usar archivos de parche de unidades de servicio para afectar las unidades de servicio preempaquetadas.
    [Servicio] 
    OOMScoreAdjust = -500
  • Familia daemontools : use laoom-kill-protectherramienta del conjunto de herramientas nosh en elrunprograma para el servicio.

    Si está convirtiendo una unidad de servicio del sistema, la convert-systemd-unitsherramienta de hecho convertirá la OOMScoreAdjust=configuración en dicha invocación de oom-kill-protect.

    #! / bin / nosh 
    ...
    oom-kill-protect - -500
    ... argumentos del
    programa
    Como beneficio adicional, puede hacerlo parametrizable:
    oom-kill-protect - fromenv
    y establezca el valor del parámetro en el entorno del servicio (se supone que se lee desde un entorno asociado con el servicio, aquí manipulado con la rcctlcuña del conjunto de herramientas nosh ):
    rcctl set servicename oomprotect -500

Otras lecturas

  • Jonathan de Boyne Pollard (2016). oom-kill-protect. conjunto de herramientas nosh. Softwares
  • James Hunt y Clint Byrum (2014). " oom score". Upstart Cookbook .
  • Lennart Poettering (07/10/2013). " OOMScoreAdjust". systemd.exec. páginas de manual de systemd. freedesktop.org.
  • Jonathan de Boyne Pollard. rcctl. conjunto de herramientas nosh. Softwares
  • /unix//a/409454/5132
JdeBP
fuente
9

Esto es posible en Ubuntu usando Upstart y la oom scoreopción de configuración.

oom score

Linux tiene una instalación asesina "sin memoria". [...]

Normalmente, el asesino OOM considera todos los procesos por igual, esta estrofa aconseja al núcleo que trate este trabajo de manera diferente.

El valor de "ajuste" proporcionado a esta estrofa puede ser un valor entero desde -999 (muy poco probable que sea asesinado por el asesino OOM) hasta 1000 (muy probablemente sea asesinado por el asesino OOM). [...]

Ejemplo:

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

expect daemon
respawn
exec /usr/bin/leaky-app
gertvdijk
fuente
Para los lectores que usan Ubuntu 16.04+, esto se ha vuelto obsoleto ahora que Upstart ha sido reemplazado por systemd.
gertvdijk
4

Podría hackearlo en MySQL (por ejemplo, OpenSSH lo sshdhace), pero eso es demasiado duro y muy sucio (problemas con las actualizaciones, etc.)

Puede hacer esto en un contenedor o en el script de inicio: la puntuación debe heredarse (y en un contenedor que probablemente quiera hacer de exec mysqld "$@"todos modos).

Uso cgroups: le dará un poco más de flexibilidad y puede hacerse permanente en el sentido de que las configuraciones apropiadas se pueden aplicar automáticamente al reiniciar el servicio. Consulte, por ejemplo, la prioridad de control de las aplicaciones que utilizan cgroups para obtener más información. Para lograr el automatismo que está buscando, es probable que desee echar un vistazo a libcgroup , que contiene un demonio que puede manejar el cambio de cgroups de un proceso en ejecución sobre la marcha de acuerdo con un conjunto de reglas, o simplemente usar el cgexeccontenedor ( del mismo paquete).

Peterph
fuente