make -j (n+1)

Un pastor amigo meu escribiu sobre o valor axeitado para o parámetro de configuración CONCURRENCY_LEVEL de make-kpkg. Chega á conclusión de que para o seu Intel Core Duo, polo tanto 2 CPUs, o valor óptimo é 2, despois de comprobar que con 3 daban uns valores lixeiramente superiores.

Este resultado deixoume un tanto confundido. Nesta entrada intentarei explicar de onde veñen eses dous valores, 2 e 3, e porque o último se suxería como óptimo.

n ou n+1?

make-kpkg emprega CONCURRENCY_LEVEL para pasarllo a make como valor para o parámetro -j. Este parámetro indica o número de traballos que se executan ó mesmo tempo ou, en caso de non indicar un valor, arrincar tódolos posibles. Para que se poidan lanzar varios traballos ó mesmo tempo deben existir regras independentes, é dicir, regras con ficheiros fonte distintos.

Dende sempre oira que para alcanzar un maior rendimento á hora de compilar debíase empregar: make -j (n+1), sendo n o número de CPUs. Nunca pensara no motivo ata agora.

As CPUs modernas poden facer varias cousas ó mesmo tempo: executar instruccións e facer operacións de entrada/saída. Cando un proceso ten que facer unha operación de entrada/saída bloquéase ata que esa operación se realizou, momento no que volve a estar preparado para seguir executándose. Mentres que este proceso esta bloqueado, a CPU segue a execución doutro.

Así, o n+1 pretende aproveitar ciclos de CPU nos que algún dos procesos lanzados por make esté facendo unha operación de entrada/saída.

É un mito o de make -j (n+1)?

Hai varias razóns polas que o valor óptimo sexa n en vez de n+1:

  1. Memoria RAM limitada: os procesos poden consumir moita memoria chegando a consumir toda a RAM e facendo que a máquina empece a swapear.
  2. Ficheiros cacheados: o sistema operativo garda en memoria os últimos ficheiros accedidos para que en caso dun novo acceso non haxa que ir a disco duro, eliminando as operacións de entrada/saída.
  3. Sistema de escritorio: Nun sistema con moitos procesos non se producen ciclos de CPU sen se aproveitar. Isto poderíase solucionar dándolle a make unha prioriedade alta con nice.

Ligazóns:

  1. How does -j switch in make work
  2. Timing the Linux -j(cpu+1) Myth
  3. Use of -j investigated

1 Response to “make -j (n+1)”

  1. 1 NÉSTOR gARCÍA

    Unha explicación que aclaroume o dilema, pero ainda así seguirei investigando no tema. Grazas polos enlaces, seranme de axuda.


Categories

Calendario

Agosto 2006
M T W T F S S
« Xul   Set »
 123456
78910111213
14151617181920
21222324252627
28293031  
3K2 theme by Hakan Aydin