La lucha por los recursos, parte 3: hay poca memoria

Continuamos estudiando los Grupos de Control (Cgroups) en Red Hat Enterprise Linux 7. Cuidemos la memoria. Recuerde que hay dos ajustes en la asignación del tiempo del procesador: CPUS comparte para establecer recursos compartidos relativos y CPUQuota para limitar el usuario, el servicio o la máquina virtual (VM) en valores absolutos (porcentaje) del tiempo del procesador. Además, ambos ajustes pueden usarse simultáneamente. Por ejemplo, si un usuario tiene una cuota de CPU del 50%, entonces su bola de CPU también se tendrá en cuenta hasta que seleccione completamente su cuota al 50% del tiempo del procesador.



En cuanto a la RAM, systemd ofrece solo una forma de ajuste, a saber ...

La cantidad de memoria que se puede asignar a un usuario o servicio. Supongamos que queremos limitar el usuario mrichter a 200 MB de RAM. Si recuerdas, su UID es 1000, entonces ingresamos el siguiente comando:

  systemctl set-property user-1000.slice MemoryLimit = 200M

Ahora mrichter quiere comprobar sus límites y lanza la utilidad de prueba de estrés, que comienza a consumir mucha memoria. Y el estrés produce muy rápidamente un error:


De acuerdo con el registro del sistema, el estrés fue simplemente interrumpido por OOM (Out Of Memory) Killer.


Aquí es importante prestar atención a esto: de manera predeterminada, el límite de RAM se aplica solo a la memoria residente. Es decir, si el proceso puede ir al archivo de intercambio ("intercambio"), pasará por alto el límite establecido. En nuestro ejemplo, el estrés se bloqueó porque excedió el límite de la memoria residente.

¿Y si no queremos que el programa se fusione en un intercambio?

Esto, en general, es fácil de prohibir. Bueno, o relativamente fácil ... En general, tienes que subir a algún lado.

Hay configuraciones de cgroup a las que no se puede acceder mediante el comando systemctl o mediante archivos de unidad. Sin embargo, esta configuración se puede cambiar sobre la marcha a través de los archivos en la carpeta / sys / fs / cgroup /. Esto es lo que, por ejemplo, se ve en la memoria de crich del usuario mrichter:


El archivo responsable de la cantidad de memoria que puede ingresar al intercambio obviamente se llama memory.swappiness. Veamos que hay dentro:


Si juegas con la configuración del kernel y el subsistema de intercambio, verás inmediatamente el valor predeterminado estándar para el parámetro de intercambio aquí. Si lo cambia a cero, el controlador de RAM para el usuario mrichter generalmente le prohíbe usar un intercambio.


Por cierto, aquí puede ver las estadísticas de memoria para el usuario mrichter:


El valor del parámetro hierarchical_memory_limit es el mismo MemoryLimit que especificamos con el comando systemctl. El parámetro hierarchical_memsw_limit representa el límite total (memoria residente y memoria en el archivo del archivo). Evitamos que el usuario mrichter use el archivo de página, por lo que el valor de este parámetro es muy extraño.

Ahora sobre los problemas del enfoque que acabamos de describir:

  • Solo puede realizar cambios en estos archivos cuando el usuario mrichter inició sesión en el sistema. Hasta que inicie sesión, su cgroup estará inactivo.
  • Estas configuraciones no se guardan después de un reinicio. Además, se perderán si el mrichter se mueve.

El script pam_exec ayudará a hacer frente a estos problemas (consulte access.redhat.com/solutions/46199 para obtener más detalles ).

Aquí está el script que crearemos en la carpeta / usr / local / bin:


Y luego agregue su llamada a la última línea de /etc/pam.d/sshd. Como resultado, este script se ejecutará cada vez que un usuario inicie sesión a través de ssh. Es por eso que verificamos en el script que este es el usuario mrichter, antes de cambiar la configuración.


Entonces, cortamos al usuario mrichter del archivo de página.


Por supuesto, puede ir aún más lejos y cambiar los archivos de configuración del cgroup activo sobre la marcha, pero por ahora pospondremos este negocio arriesgado. Sin embargo, el método general para cambiar la configuración del usuario es algo que ha captado.

Y con los servicios aún es más fácil. En el archivo de la unidad de servicio, puede usar la directiva ExecStartPost = para ejecutar un script que cambie la configuración. Por ejemplo, a continuación se explica cómo cambiar el archivo de la unidad de servicio foo para desactivar el intercambio:


Ejecute foo - y no intercambie:


Bueno, por hoy, quizás, este chamanismo es suficiente para nosotros.

Pero antes de terminar, analicemos la documentación de cgroup, donde puede encontrar información sobre todas estas configuraciones ocultas del regulador. Puede instalar el paquete kernel-doc en su computadora, como lo hice descargándolo del repositorio rhel-7-server-rpms.


Después de la instalación, abra la carpeta / usr / share / docs que corresponde a su núcleo y vaya a la carpeta cgroups, que contiene la información más reciente sobre todos los reguladores.


La próxima vez hablaremos de E / S. Y, por cierto, casi hemos llegado a descubrir cómo cgroups condujo a la aparición de contenedores (de hecho, cgroups es un componente clave de los contenedores en Red Hat Enterprise Linux y Red Hat OpenShift Container Platform).

Source: https://habr.com/ru/post/es425803/


All Articles