2012-07-24 14 views
9

¿Hay alguna manera de forzar make -j para que no consuma más mi RAM? Trabajo en un equipo de desarrollo, y tenemos diferentes conjuntos de hardware, por lo que -j8 puede no ser óptimo para todos. Sin embargo, make -j usa demasiada memoria RAM para mí y se desborda en el intercambio, lo que puede hacer que todo mi sistema se caiga. ¿Cómo puedo evitar esto?Hacer -j Límites de RAM

Idealmente, me gustaría hacer ver el sistema cargar y dejar de engendrar nuevos hilos, esperar a que algunos completen y continuar.

+0

GNU make en Linux/Unix? – Chimera

+0

informes 'make -version' GNU Make 3.81 – Drise

Respuesta

4

La solución algo simple sería que cada estación de trabajo tuviera una variable de entorno adecuada para lo que ese hardware puede manejar. Haga que el archivo MAKE lea esta variable de entorno y páselo a la opción -j. How to get gnu make to read env variables.

Además, si el proceso de compilación tiene muchos pasos y lleva mucho tiempo, vuelva a leer make la variable de entorno para que durante la construcción pueda reducir/aumentar el uso de recursos.

Además, tal vez tienen un servicio/aplicación que se ejecuta en la estación de trabajo que hace el seguimiento de la utilización de recursos y modificar la variable de entorno en lugar de tratar de tener make hacerlo ...

+1

Lo que el hardware puede manejar depende de lo que se está compilando y no se puede controlar de manera óptima con -j porque la opción -j no sabe nada sobre el uso de RAM requerido al compilar varios tipos de fuente. Por ejemplo, -O0 vs -O2 o C contra C++ o GCC frente a los compiladores de Intel. –

3

Hay otra manera de hacer esto :

(de http://www.gnu.org/software/make/manual/html_node/Parallel.html#Parallel)

cuando el sistema está muy cargado, es probable que desee ejecutar un menor número de puestos de trabajo que cuando se carga ligera. Puede usar la opción '-l' para marcar marcar para limitar la cantidad de trabajos que se ejecutarán a la vez, según el promedio de carga de . La opción '-l' o '--max-load' va seguida de un número de coma flotante . Por ejemplo,

-l 2.5 no permitirá iniciar más de un trabajo si el promedio de carga es superior a 2.5. La opción '-l' sin número siguiente elimina el límite de carga , si se proporcionó uno con una opción '-l' anterior.

Si le preocupa que toda su memoria RAM quede trabada, esto puede ayudar. 'Cargar' en este caso es en el sentido de que el tiempo de actividad o los mejores informes. Si está intercambiando, o peor, golpeando, la carga se disparará. Puede experimentar con los valores de esta opción. Debería observar los niveles de carga durante una compilación no paralela, y observar a medida que aumenta el número de procesos paralelos de make. Esto debería darle una línea base razonable para su máquina.

+0

El único problema con esto es que * tenemos diferentes conjuntos de hardware *. Pero esto puede funcionar. – Drise

+1

No debería importar, un límite de carga razonable debería hacer exactamente lo que usted desea, en su mayoría independiente del hardware. * Puedo escribir en cursiva también *. –

+0

@ keith.layne Sí, buen punto. Asumiendo que en este caso la carga se correlaciona con el uso de RAM. – Chimera

-1

¿Es posible que haya algo de confusión en lo que hace -j? (al menos lo tuve mal durante mucho tiempo ...). Supuse que -j sin opciones se adaptaría al número de CPU, pero no es así- simplemente no aplica ningún límite. Esto significa que para grandes proyectos creará una gran cantidad de procesos (simplemente ejecute "top" para ver ...), y posiblemente agote toda la memoria RAM. Me tropecé con esto cuando el "make -j" de mi proyecto utilizó todos mis 16Gb de RAM y falló, mientras que "make -j 8" culminó con 2.5 Gb de RAM de uso (en 8 núcleos, la carga es cercana al 100% en ambos casos).

En términos de eficiencia, creo que usar un límite igual o mayor que la cantidad máxima de CPU que espera es más eficiente que ningún límite, ya que la programación de miles de procesos tiene cierta sobrecarga. El número total de procesos creados debe ser constante, pero como "-j" crea muchos de ellos a la vez, la asignación de memoria puede convertirse en un problema. Incluso establecer el límite en dos veces el número de CPU aún debería ser más conservador que no establecer un límite en absoluto.

PD: Después de un poco más de excavación que se le ocurrió una solución clara y simple - sólo leer el número de procesadores y usar eso como la opción -j:

make -j `nproc`