it-swarm-es.tech

¿Hay alguna forma de limitar la cantidad de memoria que un proceso en particular puede usar en Unix?

Necesito probar un proceso para la administración de memoria.

  • No tengo la fuente, así que necesito hacer todas las pruebas desde el lado del sistema operativo.
  • Quiero poder decir algo como limitmemory 400k -p <pid>

¿Hay alguna manera de hacer esto en Unix? Cualquier utilidad común de Unix sería excelente.

38
Lazer

ulimit -v, es un Shell incorporado, pero debería hacer lo que quieras.

Lo uso en scripts de inicio a veces:

ulimit -v 128k
command
ulimit -v unlimited

Sin embargo, parece que quiere formas de manipular la memoria máxima asignable mientras se ejecuta el programa, ¿es correcto? Probablemente algo como renice para manipular la Prioridad.

Sin embargo, no existe tal herramienta que yo sepa.

27
polemon

Para establecer el límite al iniciar el programa, use ulimit -v 400, como lo indica polemon . Esto establece el límite para el Shell y todos sus descendientes, por lo que en una secuencia de comandos es posible que desee utilizar algo como (ulimit -v 400; myprogram) para limitar el alcance.

Si necesita cambiar el límite para un proceso en ejecución, no hay utilidad para eso. Debe ejecutar el proceso para ejecutar la llamada al sistema setrlimit. Esto a menudo se puede hacer con un depurador, aunque no siempre funciona de manera confiable. Así es como puede hacer esto con gdb (no probado; 9 es el valor de RLIMIT_AS en Linux):

gdb -n -pid $pid -batch -x /dev/stdin <<EOF
call setrlimit(9, {409600, -1})
detach
quit
EOF

No estoy muy seguro de esto, pero también podría usar cgroups para limitar el so de memoria . La ventaja de cgroups es que puede controlar los procesos que ya se están ejecutando. Por cierto systemd usará cgroups para controlar los servicios del sistema.

Desafortunadamente, he experimentado un poco y no parecen funcionar muy bien en mi sistema Fedora 13.

11
Cristian Ciupitu

En sistemas Linux con kernel> = 2.6.36 y util-linux> = 2.21, puede usar el comando prlimit para establecer límites de recursos de proceso:

prlimit --rss=400000 --pid <pid>
9
Luca Gibelli

Si está utilizando systemd, puede configurar algunas opciones adicionales en un .service expediente. La lista completa de las opciones que puede configurar se describe aquí .

A continuación se muestra un breve ejemplo que muestra cómo usar esta función de systemd:

# cat /etc/systemd/system/qbittorrent-nox.service
[Unit]
Description=qbittorrent-nox
Documentation=man:qbittorrent-nox
DefaultDependencies=yes
Requires=media-Kabi.mount
After=media-Kabi.mount network-online.target
Before=multi-user.target
Conflicts=umount.target

[Service]
User=morfik
Group=p2p
Type= simple
RemainAfterExit=no
ExecStart=/usr/bin/qbittorrent-nox
Nice=19
IOSchedulingClass=idle
PrivateNetwork=no
CPUShares=256
MemoryLimit=50M
BlockIOWeight=128
Slice=p2p.slice
StandardError=null
StandardOutput=null

[Install]
WantedBy=multi-user.target

Por supuesto, no necesita todas las opciones que utilicé. Si solo desea limitar el uso de memoria, agregue MemoryLimit=50M, que se limita a 50MiB.

Y este es el resultado:

# systemctl status qbittorrent-nox.service
● qbittorrent-nox.service - qbittorrent-nox
   Loaded: loaded (/etc/systemd/system/qbittorrent-nox.service; enabled; vendor preset: enabled)
   Active: active (running) since Thu 2015-05-07 19:25:20 CEST; 1s ago
     Docs: man:qbittorrent-nox
 Main PID: 21712 (qbittorrent-nox)
   Memory: 9.4M (limit: 50.0M)
   CGroup: /p2p.slice/qbittorrent-nox.service
           └─21712 /usr/bin/qbittorrent-nox

May 07 19:25:20 morfikownia systemd[1]: Started qbittorrent-nox.
May 07 19:25:20 morfikownia systemd[1]: Starting qbittorrent-nox...

Hasta ahora, esto solo funciona para los demonios/servicios del sistema, y ​​no puede limitar, por ejemplo, los procesos de Firefox como usuario normal de esta manera. Pero tal vez esto cambiará algún día .

3
Mikhail Morfikov

Existe la función setrlimit () , que permite configurar los límites de un proceso en C. Escriba un programa en C para llamar a setrlimit y luego ejecutar el comando que desea limitar. setrlimit no puede cambiar los límites de otros procesos.

Afortunadamente, alguien ya escribió algo similar. Se puede descargar desde carne fresca . Eché un vistazo rápido al código fuente y parece estar bien. Use rlimit a su propia discreción. Tenga en cuenta que rlimit tampoco puede cambiar los límites de otros procesos.

Editar: Gilles propuso un buen truco con gdb: Adjuntar al proceso con gdb y luego hacer que el proceso llame a setrlimit. Esto quizás resolvería el problema para limitar un proceso que ya se está ejecutando.

1
nalply

Si solo desea probar y medir el uso de memoria de su programa, consulte tiempo . Puede medir el uso de recursos de su programa en muchos aspectos, incluidos los términos de tiempo de CPU y uso de memoria. El siguiente comando le dará el uso de memoria y el uso de tiempo de CPU de myProgram:

/usr/bin/time myProgram

(Asegúrese de dar la ruta absoluta para distinguirlo del comando de tiempo incorporado bash).

Si solo desea limitar los recursos de su proceso, le recomiendo que cree un usuario de prueba para esta tarea específica. Limite los recursos de este usuario de acuerdo con sus necesidades y ejecute el proceso por el usuario. Parece que, en el mundo * nix, la gestión de recursos basada en usuarios es mucho más avanzada que la gestión de recursos basada en procesos.

Puedes comprobar /etc/security/limits.conf para limitar los recursos de un usuario. O puede usar ulimit después de iniciar sesión con el usuario que se limitará.

0
memin