Parece haber cierta controversia sobre si se supone que la cantidad de trabajos en GNU make es igual a la cantidad de núcleos, o si puede optimizar el tiempo de compilación agregando un trabajo adicional que se puede poner en cola mientras los otros "funcionan" .
¿Es mejor usar -j4
o -j5
en un sistema de cuatro núcleos?
¿Ha visto (o hecho) alguna evaluación comparativa que apoye a uno u otro?
make `nproc`
para hacer un script independiente de la CPU :)Respuestas:
Yo diría que lo mejor que puede hacer es compararlo usted mismo con su entorno y carga de trabajo particulares. Parece que hay demasiadas variables (tamaño / número de archivos de origen, memoria disponible, almacenamiento en caché del disco, si el directorio de origen y los encabezados del sistema están ubicados en diferentes discos, etc.) para una respuesta única para todos.
Mi experiencia personal (en una MacBook Pro de 2 núcleos) es que -j2 es significativamente más rápido que -j1, pero más allá de eso (-j3, -j4, etc.) no hay una aceleración medible. Entonces, para mi entorno, "trabajos == número de núcleos" parece ser una buena respuesta. (YMMV)
fuente
Ejecuté mi proyecto doméstico en mi computadora portátil de 4 núcleos con hyperthreading y registré los resultados. Este es un proyecto bastante pesado para el compilador, pero incluye una prueba unitaria de 17,7 segundos al final. Las compilaciones no son muy intensivas en IO; hay mucha memoria disponible y, si no, el resto está en un SSD rápido.
Resultados básicos:
Supongo que ahora: si haces otra cosa en tu computadora, usa el recuento de núcleos. Si no es así, utilice el recuento de hilos. Superarlo no muestra ningún beneficio. En algún momento, la memoria se limitará y colapsará debido a eso, lo que hará que la compilación sea mucho más lenta. La línea "inf" se agregó en una fecha mucho más tarde, lo que me dio la sospecha de que hubo un estrangulamiento térmico para los trabajos 8+. Esto muestra que para este tamaño de proyecto no hay ningún límite de memoria o rendimiento en vigor. Sin embargo, es un proyecto pequeño, con 8 GB de memoria para compilar.
fuente
Yo, personalmente, uso
make -j n
donde n es "número de núcleos" + 1.Sin embargo, no puedo dar una explicación científica: he visto a muchas personas que usan la misma configuración y me han dado muy buenos resultados hasta ahora.
De todos modos, debe tener cuidado porque algunas cadenas de fabricación simplemente no son compatibles con la
--jobs
opción y pueden dar lugar a resultados inesperados. Si experimenta errores de dependencia extraños, intentemake
sin ellos--jobs
.fuente
En última instancia, tendrá que hacer algunos puntos de referencia para determinar el mejor número para usar en su compilación, pero recuerde que la CPU no es el único recurso que importa.
Si tiene una compilación que depende en gran medida del disco, por ejemplo, entonces generar muchos trabajos en un sistema multinúcleo podría ser más lento , ya que el disco tendrá que hacer un trabajo adicional moviendo el cabezal del disco hacia adelante y hacia atrás para servir a todos los diferentes trabajos (dependiendo de muchos factores, como qué tan bien el sistema operativo maneja la caché del disco, el soporte de la cola de comandos nativa por el disco, etc.).
Y luego tienes núcleos "reales" frente a hiperprocesos. Puede que se beneficie o no de generar trabajos para cada hiperproceso. Nuevamente, tendrá que comparar para averiguarlo.
No puedo decir que haya probado específicamente #cores + 1 , pero en nuestros sistemas (Intel i7 940, 4 núcleos con hyperthreaded, mucha RAM y unidades VelociRaptor) y nuestra compilación (compilación de C ++ a gran escala que es alternativamente CPU y yo / O límite) hay muy poca diferencia entre -j4 y -j8. (Es quizás un 15% mejor ... pero ni siquiera el doble de bueno).
Si me voy a almorzar, usaré -j8, pero si quiero usar mi sistema para cualquier otra cosa mientras se está construyendo, usaré un número menor. :)
fuente
-j 8
Acabo de recibir un procesador Athlon II X2 Regor con un Foxconn M / B y 4 GB de memoria G-Skill.
Puse mi 'cat / proc / cpuinfo' y 'free' al final de esto para que otros puedan ver mis especificaciones. Es un Athlon II x2 de doble núcleo con 4 GB de RAM.
Descargué la fuente del kernel del siguiente paso (linux-3.2.46) en / archive4;
extraído (
tar -xjvf linux-3.2.46.tar.bz2
);cd en el directorio (
cd linux-3.2.46
);y copió la configuración predeterminada del kernel sobre (
cp /usr/src/linux/.config .
);utilizado
make oldconfig
para preparar la configuración del kernel 3.2.46;luego ejecutó make con varios encantamientos de -jX.
Probé los tiempos de cada ejecución emitiendo make después del comando time, por ejemplo, 'time make -j2'. Entre cada ejecución, 'rm -rf' el árbol linux-3.2.46 y lo extraje de nuevo, copié el /usr/src/linux/.config predeterminado en el directorio, ejecuté make oldconfig y luego hice mi prueba 'make -jX' nuevamente .
simple "hacer":
como arriba pero con make -j2
como arriba pero con make -j3
como arriba pero con make -j4
como arriba pero con make -j8
'cat / proc / cpuinfo' produce:
rendimientos 'libres':
fuente
make -j
en ese sistema? Se supone que Make debe verificar la carga y escalar el número de procesos en función de la carga.make -j
no limita la cantidad de trabajos en absoluto. Esto suele ser desastroso en un proyecto de tamaño mediano o grande, ya que rápidamente se bifurcan más trabajos de los que puede soportar la RAM. La opción que necesita restringir por carga es-l [load]
, junto con-j
Ambos no se equivocan. Para estar en paz consigo mismo y con el autor del software que está compilando (se aplican diferentes restricciones de subprocesos múltiples / subprocesos únicos a nivel de software), le sugiero que utilice:
Notas:
nproc
es un comando de Linux que devolverá el número de núcleos / subprocesos (CPU moderna) disponibles en el sistema. Si lo coloca debajo de ticks `como arriba, el número pasará al comando make.Información adicional: como alguien mencionó, el uso de todos los núcleos / subprocesos para compilar software puede literalmente estrangular su caja hasta casi morir (no responde) e incluso puede llevar más tiempo que usar menos núcleos. Como vi a un usuario de Slackware publicado aquí, tenía CPU de doble núcleo pero aún proporcionó pruebas hasta j 8, que dejó de ser diferente en j 2 (solo 2 núcleos de hardware que la CPU puede utilizar). Entonces, para evitar que el cuadro no responda, le sugiero que lo ejecute así:
Esto pasará la salida de
nproc
amake
y restar 2 núcleos de su resultado.fuente
Solo como un ref:
De la
Spawning Multiple Build Jobs
sección en LKD :fuente
Según mi experiencia, debe haber algunos beneficios de rendimiento al agregar trabajos adicionales. Es simplemente porque la E / S de disco es uno de los cuellos de botella además de la CPU. Sin embargo, no es fácil decidir el número de trabajos adicionales, ya que está muy interconectado con el número de núcleos y tipos de disco que se utilizan.
fuente
Muchos años después, la mayoría de estas respuestas siguen siendo correctas. Sin embargo, ha habido un pequeño cambio: usar más trabajos de los que tiene núcleos físicos ahora da una aceleración realmente significativa. Como apéndice a la tabla de Dascandy, estos son mis momentos para compilar un proyecto en un AMD Ryzen 5 3600X en Linux. (The Powder Toy, comete c6f653ac3cef03acfbc44e8f29f11e1b301f1ca2)
Le recomiendo que se revise usted mismo, pero he descubierto con comentarios de otros que usar su conteo de núcleos lógicos para el conteo de trabajos funciona bien en Zen. Junto a eso, el sistema no parece perder capacidad de respuesta. Me imagino que esto también se aplica a las CPU Intel recientes. Tenga en cuenta que también tengo un SSD, por lo que puede valer la pena probar su CPU usted mismo.
Pruebas realizadas en Ubuntu 19.10 con Ryzen 5 3600X, Samsung 860 Evo SSD (SATA) y 32 GB de RAM
Nota final: otras personas con un 3600X pueden obtener mejores tiempos que yo. Al hacer esta prueba, tenía habilitado el modo Eco, reduciendo un poco la velocidad de la CPU.
fuente
¡SI! En mi 3950x, ejecuto -j32 y me ahorra horas de tiempo de compilación. Todavía puedo ver youtube, navegar por la web, etc. durante la compilación sin ninguna diferencia. El procesador no siempre está vinculado incluso con un nvme 970 PRO de 1TB o un nvme Auros Gen4 de 1TB y 64GB de 3200C14. Incluso cuando lo es, no me doy cuenta de la interfaz de usuario. Planeo probar con -j48 en un futuro cercano en algunos grandes proyectos futuros. Espero, como probablemente lo haga, ver una mejora impresionante. Es posible que aquellos que todavía tengan un quad-core no obtengan las mismas ganancias ...
El propio Linus acaba de actualizar a 3970x y puedes apostar tu último dólar, al menos está ejecutando -j64.
fuente