Hoy temprano, cuando construía algo, decidí correr make
como
$ make -j
tal vez por costumbre con otros programas, como cabal
donde el valor -j
predeterminado es un límite razonable.
Unos 20 segundos después, todo mi escritorio se detiene . Busco varios signos de actividad. No hay fans girando. La luz del HDD es de color verde sólido, pero no escucho actividad en el disco. Hmmmmm Después de 10 minutos de silencio, finalmente veo una respuesta a la primera pulsación de tecla que hice hace años, y también empiezo a escuchar el sonido demasiado familiar del golpeteo del disco. 20 minutos después de tratar de entrar lentamente en una terminal en esta máquina que no respondía, cedí y usé REISUB.
Al principio, pensé que una aplicación de escritorio no relacionada debía haber sido la culpable, porque hacía mucho tiempo que tenía límites de memoria colocados en sesiones de bash interactivas para evitar que me pusiera exactamente en este tipo de situación. Pero /var/log/syslog
cuenta una historia diferente; el asesino OOM dejado atrás algunos ps
vertederos que son sospechosamente embalan con c++
y cc1plus
procesos!
Aquí hay un análisis de frecuencia de uno de esos vertederos:
Command Number of appearances
'sh' 322
'c++' 321
'cc1plus' 321
'chrome' 27
'make' 27
'bash' 3
all else combined 120
Así que verifico la página de manual de GNU make: (énfasis agregado)
-j [trabajos], --jobs [= trabajos] Especifica el número de trabajos (comandos) para ejecutar simultáneamente. Si hay más de una opción -j, la última es efectiva. Si la opción -j se proporciona sin un argumento, make no limitará el número de trabajos que pueden ejecutarse simultáneamente.
Soy reacio a ver si puedo reproducir el problema (Doctor, me duele cuando hago esto ...) , pero los resultados de la investigación hasta ahora parecen ser un jonrón: Claramente, make -j
y los cientos de procesos resultantes deben tener ha sido la causa de la caída y el golpeteo del disco. Dicho esto, buscando en Internet, no puedo encontrar muchas advertencias en su contra. ¿Estoy llegando a conclusiones?
¿Es make -j
tan peligroso como me parece? Si es así, ¿por qué demonios está allí y qué se puede hacer para que sea a prueba de idiotas?
fuente
alias make="make -j4"
para eliminar la necesidad de agregar-jN
argumentos, pero aún no he pensado en todas las posibles consecuencias ...make
las instalaciones propias y hágaloexport MAKEFLAGS="-j 4"
. Para futuras investigaciones , aconsejo leer antes de escribir . PD: <número de núcleos> + 2 me ha servido bien durante casi dos décadas. En el pasado, Linus hizo una finalmake -j128
antes de lanzar un núcleo.Respuestas:
Existen herramientas que le permiten dispararse en el pie de muchas maneras imaginativas. Esto es para que pueda usar su imaginación para resolver problemas sin estar restringido por lo que alguien más piensa que es "cuerdo".
Ejecutar
make -j
en un proyecto pequeño es perfectamente razonable. En otros proyectos, el uso-j
sin argumento perjudicará gravemente la capacidad de respuesta del sistema. En algunos proyectos, el uso de compilaciones paralelas, incluso con-j2
, romperá la compilación por completo (los archivos creados por un proceso de creación paralela no están a tiempo para otro, etc.).Me volvería a evitar el aliasing personalmente
make
amake -j4
(como usted dice que está considerando, en comentarios). Encuentro que es mejor decirle explícitamente a la máquina qué hacer, para saber qué hará. En unos días, me habré olvidado de ese alias y me pregunto por qué los cuatro proyectos que estoy construyendo en terminales separadas están haciendo que mi sistema no responda.En cuanto a "peligroso" ... La palabra significa cosas diferentes en diferentes contextos. Sí, es "peligroso" porque puede hacer que el sistema no responda. Sí, es "peligroso" porque puede bloquear el proceso de construcción a la mitad de la construcción. Pero no, no es "peligroso" en el sentido de que formateará su disco duro o comenzará a eliminar archivos aleatorios.
Entonces, ¿cómo hacerlo a prueba de idiotas?
Aquí hay una guía paso a paso segura:
Nota, también, que la
-j
bandera de BSDmake
no requieren una discusión, y que esta bandera no es estándar (el estándar de Unix POSIX no lo menciona).fuente
También puede limitar make usando
-l
:Pero tenga en cuenta que no parece que ayuda a funcionar de esta manera:
make -j -l4
.Se inician demasiados trabajos antes de que el promedio de carga aumente por encima del límite (según mi experiencia). Por lo tanto, una combinación puede funcionar, por ejemplo
make -j8 -l4
.fuente