¿Cómo limitar el uso de recursos para ahorrar CPU + RAM para un determinado proceso?

25

Tengo un servidor de desarrollo en el que a sshdveces deja de funcionar porque la máquina se queda sin RAM. Sí, nos estamos quedando sin memoria y la actualización no es una opción viable en este momento. Lo que quiero hacer es decirle a la máquina: "¡Haz lo que quieras, pero deja 20MB y algo de CPU para sshd!".

¿Cómo se puede hacer eso?

phunehehe
fuente
Sshd no debería explotar así, normalmente es un demonio que se comporta muy bien. Asegúrese de que esté actualizado a la última / mejor. ¿Qué estás haciendo con eso? ¿Está canalizando datos masivos a través de él?
Marcin
2
@ Marcin No creo que esté haciendo nada grande, edición de texto. Incluso si sshdse comporta bien, creo que se atascaría si no hay suficiente CPU / RAM para usar, ¿no?
phunehehe
Cuando Linux se queda sin memoria, comienza a matar procesos para recuperar memoria. Es posible que esté viendo OOM en acción (sin memoria). Sin embargo, no sé por qué decidiría matar tu sshd constantemente. ¿Alguna vez has visto sshd realmente gotear (crecer en tamaño) horriblemente, antes de explotar, o funciona bien en un momento y está muerto al siguiente?
Marcin
@Marcin es probable que si está OOM, el sistema está estancado tanto que sshd simplemente no puede responder, no es un problema sshd sino un problema con su carga. Lamentablemente no sé la respuesta a esto.
xenoterracide
@phunehehe ¿estás seguro de que el problema no es memoria para ssh y que tu carga no está en el techo? ¿sshd da algún error? ¿Cuál es la carga en la caja? y qué está causando que el sistema se quede sin memoria.
xenoterracide

Respuestas:

9

Probablemente pueda lograr algo así utilizando cgroups con el controlador de recursos de memoria .

Supongo que pondría todas sus tareas que consumen recursos en un espacio limitado (CPU y RAM) cgroupy dejaría sshd"afuera" para que no esté restringido.

(Sin embargo, agregar más intercambio, incluso en forma de archivo de intercambio, podría ser una buena opción).

Estera
fuente
Todavía dudo, no parece fácil (estropeado por Ubuntu).
phunehehe
oh, ciertamente no es fácil :-) Agregar intercambio es mucho más fácil.
Mat
@phunehehe bienvenido a ser un administrador del sistema, no es fácil. Pero ahora tienes que aprender a hacer cosas no fáciles.
xenoterracide
6

Ah, pero los cgroups son fáciles :) Instale el paquete libcgroup. Cree un /etc/cgconfig.conf:

mount {
    cpu     = /cgroup/cpu_and_mem;
    cpuacct = /cgroup/cpu_and_mem;
    memory  = /cgroup/cpu_and_mem;
}

group sshd {
        cpu {
                cpu.shares="500";
        }
        cpuacct {
                cpuacct.usage="0";
        }
        memory {
                memory.limit_in_bytes="1G";
        }
}

group nosshd {
        cpu {
                cpu.shares="500";
        }
        cpuacct {
                cpuacct.usage="0";
        }
        memory {
                memory.limit_in_bytes="1G";
        }
}

Inicie el cgconfigproceso que creará la jerarquía, cgroups y establecerá los límites. Si eso tiene éxito, tiene dos grupos c, los cuales tienen el 50% de la CPU asignada y 1G de memoria disponible (no sé cuál es su cantidad real de memoria disponible; suponiendo que sea 2G en este ejemplo). Ahora solo necesita mover todas las tareas (es decir, todos los procesos que se ejecutan en el sistema) desde el grupo raíz al grupo nosshd:

cgroup]# cat tasks >> nosshd/tasks
cgroup]# echo > tasks

Luego solo necesita obtener el PID del sshdproceso y moverlo a la información del archivo de tareas sshd:

cgroup]# echo $PID >> sshd/tasks

Ta-da, ya terminaste. Ahora puede estar seguro de que sshd siempre tendrá el 50% de la CPU y 1G de memoria.

mart1n
fuente
1

Utilícelo renicepara obtener una mayor prioridad sshdo verifique la contabilidad. (acct) -> con esto puedes configurar recursos para los usuarios, así que ejecuta sshd con s

MSpike
fuente
Yo también agregaría ionicea eso, y probablemente comenzaría sshd con agradable no volver a hacerlo más tarde.
xenoterracide
1

Una solución más general al problema del uso de los recursos de la aplicación es ejecutar sus aplicaciones en un contenedor con Docker . Luego puede ejecutar contenedores con CPU y límites de uso de memoria similares a cgroups.

docker run -c=10 -m=1g my-container
Sean Fujiwara
fuente