Como acelerar a compilação de aplicativos Ubuntu (make, cmake, gcc)

11

Estou compilando alguns programas aqui e tenho 4 núcleos. Existe uma maneira de dizer make, cmakeou gcccompilar usando todos os núcleos ou algo para que afetam?

Luis Alvarado
fonte

Respostas:

13

Se um pacote suportar, você pode usar o -jsinalizador para permitir a execução de trabalhos paralelos, por exemplo:

make -j8

Mais detalhes sobre esse sinalizador podem ser encontrados na pergunta Stackoverflow Por que make -j tem um desempenho melhor quando é passado um número maior que o número de núcleos disponíveis? .

Compilação distribuída

Se você tiver várias máquinas, experimente o distcc . Nas máquinas envolvidas sudo apt-get install distcc. Supondo que sua máquina de compilação seja 192.168.1.1:

  • nas máquinas auxiliares, execute:

    sudo distccd --log-file=/tmp/distccd.log --daemon -a 192.168.1.1
    
  • Na máquina de compilação, antes de executar configureou cmakevocê deve especificar os hosts que deseja usar para o processo de compilação. Opcionalmente, especifique o número de trabalhos simultâneos após uma barra (o padrão é 4):

    export DISTCC_HOSTS='localhost/4 192.168.1.2/8 192.168.1.3/8'
    

    Faça o compilador usar distcc:

    export PATH="/usr/lib/distcc:$PATH"
    

    Agora configureou cmakeo aplicativo e construa com:

    make -j$(distcc -j)
    

    Observe que se você colocar /usr/lib/distccduas vezes no seu PATH, ele falhará. Certifique-se de definir /usr/lib/distccapenas uma vez no seu PATH.

Para mais detalhes, consulte as páginas de manual do distcc (1) e distccd (1) .

Lekensteyn
fonte
OMG que J é bom. Eu fui de 15 minutos para menos de 1. obrigado L.
Luis Alvarado
Ele pode ficar mais rápido com distcc, compilação de PHP foi feito em 2 minutos, o kernel foi feito em 3 minutos (três i5 máquinas)
Lekensteyn
Vou tentar com distcc quando eu chegar ao trabalho. Estava fazendo uma pergunta semelhante sobre isso ontem. Talvez você possa ajudar com isso aqui: askubuntu.com/questions/106810/…
Luis Alvarado
Rodar o distccd como root parece um plano ruim. Eu não o usei por alguns motivos, mas quando o fiz não posso ter usado o root porque não tinha permissão nessas máquinas.
24412
@ams Você não precisa executá-lo como root. Se você executá-lo como root e quiser trocar de usuário, use distccd --user nobody. Caso contrário, ele será executado sob o usuário que o executou.
Lekensteyn