Hoje cedo, ao construir algo, decidi correr make
como
$ make -j
talvez por hábito em outros programas, como cabal
onde o -j
padrão é um limite razoável.
Cerca de 20 segundos depois, toda a minha área de trabalho é interrompida . Eu procuro vários sinais de atividade. Nenhum fã gira. A luz do disco rígido está verde constante, mas não ouço atividade de disco. Hmmmmm. Após 10 minutos de silêncio, finalmente vejo uma resposta ao primeiro pressionamento de tecla que fiz há séculos, e também começo a ouvir o som familiar demais do disco batendo. 20 minutos depois, tentando lentamente entrar em um terminal nesta máquina que não responde, eu cedi e usei o REISUB.
No começo, achei que um aplicativo de área de trabalho não relacionado devia ser o culpado, porque há muito tempo coloco limites de memória em sessões interativas para impedir que eu me coloque exatamente nesse tipo de situação! Mas /var/log/syslog
conta uma história diferente; o assassino OOM deixou para trás algumas ps
lixeiras que são suspeitamente embalados com c++
e cc1plus
processos!
Aqui está uma análise de frequência de um desses despejos:
Command Number of appearances
'sh' 322
'c++' 321
'cc1plus' 321
'chrome' 27
'make' 27
'bash' 3
all else combined 120
Por isso, verifiquei a página de manual do GNU make: (ênfase adicionada)
-j [trabalhos], --jobs [= trabalhos] Especifica o número de trabalhos (comandos) a serem executados simultaneamente. Se houver mais de uma opção -j, a última será efetiva. Se a opção -j for fornecida sem argumento, o make não limitará o número de tarefas que podem ser executadas simultaneamente.
Estou relutante em ver se consigo reproduzir o problema (doutor, dói quando faço isso ...) , mas os resultados da investigação até agora parecem ser um incômodo: claramente, make -j
e as centenas de processos resultantes devem ter ocorrido. foi a causa do travamento e do disco debulhar. Dito isto, pesquisando na internet, não consigo encontrar muitos avisos contra isso. Estou tirando conclusões precipitadas?
É make -j
tão perigoso quanto me parece? Se sim, por que diabos está lá e o que pode ser feito para a prova de idiotas?
fonte
alias make="make -j4"
para eliminar a necessidade de adicionar-jN
argumentos, mas ainda não pensei em todas as possíveis consequências ...make
as próprias instalações e façaexport MAKEFLAGS="-j 4"
. Para investigações adicionais , aconselho a leitura antes de digitar . PS: <número de núcleos> + 2 me serviu bem por quase duas décadas. Na época, Linus fez uma finalmake -j128
antes de lançar um kernel.Respostas:
Existem ferramentas que permitem dar um tiro no próprio pé de muitas formas imaginativas. Isso é para que você possa usar sua imaginação para resolver problemas sem ser restringido pelo que outra pessoa pensa que é "sã".
Rodar
make -j
em um projeto pequeno é perfeitamente razoável. Em outros projetos, o uso-j
sem argumento prejudicará seriamente a capacidade de resposta do sistema. Em alguns projetos, o uso de compilações paralelas, mesmo com-j2
, interromperá a compilação completamente (os arquivos criados por um processo de fabricação paralelo não estão disponíveis a tempo para outro etc.).Eu pessoalmente evitar aliasing
make
paramake -j4
(como você diz que está considerando, nos comentários). Acho que é melhor dizer explicitamente à máquina o que fazer, para que eu saiba o que ela fará. Em alguns dias, esquecerei esse apelido e me pergunto por que os quatro projetos que estou construindo em terminais separados estão deixando meu sistema sem resposta.Quanto a "perigoso" ... A palavra significa coisas diferentes em diferentes contextos. Sim, é "perigoso" porque pode deixar o sistema sem resposta. Sim, é "perigoso" porque pode travar o processo de compilação no meio da compilação. Mas não, não é "perigoso" no sentido de reformatar o disco rígido ou começar a excluir arquivos aleatórios.
Então, como à prova de idiotas?
Aqui está um guia passo a passo do surefire:
Note, também, que a
-j
bandeira para BSDmake
não requerem um argumento, e que esta bandeira é não-padrão (o padrão Unix POSIX não mencioná-lo).fonte
Você também pode limitar o make usando
-l
:Mas nota que não parecem ajuda para executá-lo como este:
make -j -l4
.Muitos trabalhos são iniciados antes que a média de carga ultrapasse o limite (com base na minha experiência). Assim, uma combinação pode funcionar, por exemplo
make -j8 -l4
.fonte