¿Es `make -j` (sin argumento) peligroso? [cerrado]


13

Hoy temprano, cuando construía algo, decidí correr makecomo

$ make -j

tal vez por costumbre con otros programas, como cabaldonde el valor -jpredeterminado 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/syslogcuenta una historia diferente; el asesino OOM dejado atrás algunos psvertederos que son sospechosamente embalan con c++y cc1plusprocesos!

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 -jy 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 -jtan peligroso como me parece? Si es así, ¿por qué demonios está allí y qué se puede hacer para que sea a prueba de idiotas?


Nota: En la última pregunta, estoy considerando agregar un alias make="make -j4"para eliminar la necesidad de agregar -jNargumentos, pero aún no he pensado en todas las posibles consecuencias ...
Exp HP

1
Para límites globales, utilice makelas 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 -j128antes de lanzar un núcleo.
Bananguin

Respuestas:


6

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 -jen un proyecto pequeño es perfectamente razonable. En otros proyectos, el uso -jsin 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 makea make -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:

  1. Aprende a usar tus herramientas.

Nota, también, que la -jbandera de BSD make no requieren una discusión, y que esta bandera no es estándar (el estándar de Unix POSIX no lo menciona).


4

También puede limitar make usando -l:

-l [carga], --load-average [= load] Especifica que no se deben iniciar nuevos trabajos (comandos) si hay otros trabajos en ejecución y el promedio de carga es al menos carga (un número de punto flotante). Sin argumento, elimina un límite de carga anterior.

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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.