O `make -j` (sem argumento) é perigoso? [fechadas]


13

Hoje cedo, ao construir algo, decidi correr makecomo

$ make -j

talvez por hábito em outros programas, como cabalonde o -jpadrã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/syslogconta uma história diferente; o assassino OOM deixou para trás algumas pslixeiras que são suspeitamente embalados com c++e cc1plusprocessos!

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 -je 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 -jtão perigoso quanto me parece? Se sim, por que diabos está lá e o que pode ser feito para a prova de idiotas?


Nota: Na última pergunta, estou pensando em adicionar um alias make="make -j4"para eliminar a necessidade de adicionar -jNargumentos, mas ainda não pensei em todas as possíveis consequências ...
Exp HP

1
Para limites globais, use makeas próprias instalações e faça export 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 final make -j128antes de lançar um kernel.
Bananguin 19/09/17

Respostas:


6

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 -jem um projeto pequeno é perfeitamente razoável. Em outros projetos, o uso -jsem 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 makepara make -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:

  1. Aprenda a usar suas ferramentas.

Note, também, que a -jbandeira para BSD make não requerem um argumento, e que esta bandeira é não-padrão (o padrão Unix POSIX não mencioná-lo).


4

Você também pode limitar o make usando -l:

-l [carga], --load-average [= carga] Especifica que nenhum novo trabalho (comando) deve ser iniciado se houver outros trabalhos em execução e a média de carga for pelo menos carga (um número de ponto flutuante). Sem argumento, remove um limite de carga anterior.

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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.