2010-09-30 18 views
8


Estoy desarrollando una aplicación en Python en Ubuntu y estoy ejecutando binarios externos desde dentro de python usando un subproceso. Dado que estos binarios se generan en tiempo de ejecución y pueden ir deshonestos, necesito mantener una pestaña estricta sobre la cantidad de huella de memoria y el tiempo de ejecución de estos binarios. ¿De alguna manera puedo limitar o controlar el uso de memoria de estos programas binarios en tiempo de ejecución? Realmente odiaría usar algo como "ps" en subproceso para este propósito.Comprobar el uso de memoria del subproceso en Python

Respuesta

4

Con un número PID de su subproceso, puede leer toda la información de proc file-system. Uso:

/proc/[PID]/smaps (desde Linux 2.6.14 ) Este archivo muestra el consumo de memoria para cada una de las asignaciones del proceso. Para cada una de las asignaciones hay una serie de líneas como sigue:

o

/proc/[PID]/statm Proporciona información sobre el uso de memoria, medida en páginas.

Alternativamente, puede limitar los recursos, que se puede adquirir con el subproceso:

subprocess.Popen('ulimit -v 1024; ls', shell=True) 

Cuando se administra límite de memoria virtual se alcanzó proceso falla con sin memoria.

+1

Necesito implementar esto desde dentro de Python. Por lo tanto, necesitaría bifurcar un proceso hijo y, al mismo tiempo, ejecutar un ciclo while que mantiene el archivo de monitoreo/proc/(pid)/smaps. ¿No hay alguna otra forma, por ejemplo: puedo asignar memoria fija para un subproceso secundario? Esperaba usar el administrador de memoria de Python de alguna manera. – Neo

+0

Dang, nunca pensé en esto. Sí, esto debería funcionar bien para mí. – Neo

+2

ulimit está obsoleto. Extracto de la página man: "Advertencia: esta rutina está obsoleta. Use getrlimit (2), setrlimit (2) y sysconf (3)". – omikron

10

Puede usar el módulo resource de Python para establecer los límites antes de generar su subproceso.

Para la supervisión, resource.getrusage() le dará información resumida sobre todos sus subprocesos; si desea ver información por subproceso, puede hacer el truco/proc en ese otro comentario (no portátil pero efectivo), o aplicar un programa Python entre cada subproceso y descubrir alguna comunicación (portátil, feo, levemente efectivo)

+0

gracias Habbie, eso es exactamente lo que necesitaba. – Neo