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?
make
las instalaciones propias y hágalo export 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 final make -j128
antes de lanzar un núcleo.
alias make="make -j4"
para eliminar la necesidad de agregar-jN
argumentos, pero aún no he pensado en todas las posibles consecuencias ...