Estoy desarrollando un programa en marcha; ocasionalmente termina asignando grandes cantidades de memoria (>> 10G en una máquina con 8G de memoria física), lo que hace que el sistema deje de responder. Quiero limitar la cantidad de memoria que el proceso puede asignar. La forma habitual en que haría esto es:
ulimit -m 4000000 ; ./myprogram
... que debería matar mi programa si intenta usar más de 4 GB de memoria.
En OS X El Capitan esto parece no tener efecto; incluso ulimit -m 1
(¡limitar todos los programas a solo 1kB de memoria!) es ineficaz.
¿Cómo puedo establecer un límite superior en la memoria disponible para un proceso en particular?
macos
el-capitan
command-line
memory
development
cpcallen
fuente
fuente
ulimit -m
ya no funciona en Linux (> 2.4.30), aunqueulimit -v
todavía funciona como se esperaba. (Comoulimit -m
,ulimit -v
también parece no tener efecto en OS X.)Respuestas:
Hay dos enfoques para limitar el uso de la memoria: ex post facto y preventivo. Es decir, puede intentar matar su programa después de que se haya vuelto demasiado grande, o puede programarlo para que no sea demasiado grande en primer lugar.
Si insiste en el enfoque ex post facto, puede usar el siguiente script de Bash. Este script primero encuentra la cantidad de memoria (como se define por "tamaño de conjunto residente") que el proceso con processid pid está usando, filtra todos los datos no numéricos usando grep y guarda la cantidad como variable n. El script luego comprueba si n es mayor que su x especificado. Si es así, el proceso con procesid pid se elimina.
Tenga en cuenta:
<pid>
con la identificación del proceso de su programa.<x>
con rss = "tamaño de conjunto residente" (es decir, tamaño de memoria real) que no desea que exceda el programa.n=$(ps -<pid> -o rss | grep '[0-9]') if [ $n -gt <x> ]; then kill -9 <pid>; fi
Si desea que esto se ejecute cada y segundos, inclúyalo en un bucle y dígale que espere y segundos después de cada iteración. También podría escribir un comando similar usando
top
. Tu punto de partida seríatop -l 1|grep "<pid>"|awk '{print $10}'
.La respuesta de @Kenorb me ayudó con mi guión
Si bien creo que eso responde a la pregunta, a la larga creo que es un mejor diseño de programación adoptar un enfoque preventivo utilizando la asignación manual de memoria.
En primer lugar, ¿estás seguro de que el uso de memoria es realmente un problema? La documentación de Go dice:
Si aún cree que tiene un problema, le recomiendo que administre manualmente su memoria como se hace en el lenguaje de programación C. Como go está escrito en C, sospeché que habría formas de ingresar a la administración / asignaciones de memoria C, y de hecho las hay. Vea este repositorio de github que,
El caso de uso se da como:
Esto parece una mejor solución a largo plazo.
Si desea obtener más información sobre C (incluida la administración de memoria), el lenguaje de programación C es la referencia estándar.
fuente