Necesito probar un proceso para la administración de memoria.
limitmemory 400k -p <pid>
¿Hay alguna manera de hacer esto en Unix? Cualquier utilidad común de Unix sería excelente.
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.
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.
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>
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 .
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.
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á.