Saltar al contenido

Limite el uso de memoria para un solo proceso de Linux

Te sugerimos que revises esta resolución en un ambiente controlado antes de pasarlo a producción, saludos.

Solución:

Otra forma de limitar esto es usar los grupos de control de Linux. Esto es especialmente útil si desea limitar la asignación de memoria física de un proceso (o grupo de procesos) de forma distinta a la memoria virtual. Por ejemplo:

cgcreate -g memory:myGroup
echo 500M > /sys/fs/cgroup/memory/myGroup/memory.limit_in_bytes
echo 5G > /sys/fs/cgroup/memory/myGroup/memory.memsw.limit_in_bytes

creará un grupo de control llamado myGroup, limita el conjunto de procesos que se ejecutan bajo myGroup hasta 500 MB de memoria física con memory.limit_in_bytes y hasta 5000 MB de memoria física y de intercambio junto con memory.memsw.limit_in_bytes. Puede encontrar más información sobre estas opciones aquí: https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/6/html/resource_management_guide/sec-memory

Para ejecutar un proceso bajo el grupo de control:

cgexec -g memory:myGroup pdftoppm

Tenga en cuenta que en una distribución moderna de Ubuntu, este ejemplo requiere instalar el cgroup-bin paquete y edición /etc/default/grub cambiar GRUB_CMDLINE_LINUX_DEFAULT a:

GRUB_CMDLINE_LINUX_DEFAULT="cgroup_enable=memory swapaccount=1"

y luego corriendo sudo update-grub y reiniciar para arrancar con los nuevos parámetros de arranque del kernel.

Si su proceso no genera más niños que consumen la mayor cantidad de memoria, puede usar setrlimit función. La interfaz de usuario más común para eso está usando ulimit comando del caparazón:

$ ulimit -Sv 500000     # Set ~500 mb limit
$ pdftoppm ...

Esto solo limitará la memoria “virtual” de su proceso, teniendo en cuenta, y limitando, la memoria que el proceso invocado comparte con otros procesos, y la memoria asignada pero no reservada (por ejemplo, el montón grande de Java). Aún así, la memoria virtual es la aproximación más cercana para los procesos que crecen realmente grandes, lo que hace que dichos errores sean insignificantes.

Si su programa genera niños, y son ellos los que asignan memoria, se vuelve más complejo y debe escribir scripts auxiliares para ejecutar procesos bajo su control. Escribí en mi blog, por qué y cómo.

Hay algunos problemas con ulimit. Aquí hay una lectura útil sobre el tema: Limitar el tiempo y el consumo de memoria de un programa en Linux, lo que conduce a la herramienta de tiempo de espera, que le permite encerrar un proceso (y sus bifurcaciones) por tiempo o consumo de memoria.

La herramienta de tiempo de espera requiere Perl 5+ y el /proc sistema de archivos montado. Después de eso, copia la herramienta a, por ejemplo. /usr/local/bin al igual que:

curl https://raw.githubusercontent.com/pshved/timeout/master/timeout | 
  sudo tee /usr/local/bin/timeout && sudo chmod 755 /usr/local/bin/timeout

Después de eso, puede ‘enjaular’ su proceso por consumo de memoria como en su pregunta así:

timeout -m 500 pdftoppm Sample.pdf

Alternativamente, podrías usar -t y -x para limitar respectivamente el proceso por tiempo o restricciones de CPU.

La forma en que funciona esta herramienta es comprobando varias veces por segundo si el proceso generado no ha superado los límites establecidos. Esto significa que en realidad hay una pequeña ventana donde un proceso podría potencialmente estar suscribiéndose en exceso antes de que se acabe el tiempo de espera y elimine el proceso.

Por lo tanto, un enfoque más correcto probablemente involucraría cgroups, pero eso es mucho más complicado de configurar, incluso si usa Docker o runC, que entre otras cosas, ofrecen una abstracción más fácil de usar en torno a cgroups.

Te mostramos reseñas y calificaciones

Tienes la posibilidad mostrar esta sección si te fue útil.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *