É 'make -j' (sem argumento) perigoso? [fechadas]

6

Hoje cedo, quando construímos algo, decidi executar make as

$ make -j

talvez por hábito com outros programas, como cabal , em que -j é padronizado para um limite razoável.

Cerca de 20 segundos depois, toda a minha área de trabalho fica paralisada . Eu procuro vários sinais de atividade. Nenhum fã vai aparecer. A luz do disco rígido é um verde sólido, mas não ouço atividade do disco. Hmmmmm. Depois de 10 minutos de silêncio, finalmente vejo uma resposta ao primeiro pressionamento de tecla que fiz há muito tempo, e também começo a ouvir o som tão familiar da discusão. 20 minutos depois, lentamente, tentando entrar em um terminal nesta máquina sem resposta, eu cedi e usei REISUB.

A princípio, imaginei que um aplicativo de desktop não relacionado deveria ter sido o culpado, porque há muito tempo eu tinha limites de memória colocados em sessões de bash interativas para evitar que eu me coloque exatamente nesse tipo de situação! Mas /var/log/syslog conta uma história diferente; o assassino da OOM deixou para trás alguns ps dumps , que são suspeitosamente embalados com c++ e cc1plus processa!

Aqui está uma análise de frequência de um desses dumps:

Command          Number of appearances
'sh'                    322
'c++'                   321
'cc1plus'               321
'chrome'                 27
'make'                   27
'bash'                    3
all else combined       120

Então eu verifico a página man do GNU make: (ênfase adicionada)

-j [jobs], --jobs[=jobs] Specifies the number of jobs (commands) to run simultaneously. If there is more than one -j option, the last one is effective. If the -j option is given without an argument, make will not limit the number of jobs that can run simultaneously.

Estou relutante em ver se consigo reproduzir o problema (Doutor, dói quando faço isso ...) , mas os resultados da investigação até agora Parece ser um home run: Claramente, make -j e as centenas de processos resultantes devem ter sido a causa do travamento e da movimentação do disco. Dito isso, pesquisando na internet, não consigo encontrar muito aviso contra isso. Estou tirando conclusões precipitadas?

O make -j é tão perigoso como parece para mim? Em caso afirmativo, por que diabos está lá, e o que pode ser feito para provar a idiotice? ?

    
por Exp HP 15.10.2016 / 22:53

2 respostas

4

Existem ferramentas que lhe permitem atirar no pé de muitas formas imaginativas. Isto é para que você possa usar sua imaginação para resolver problemas sem ser restringido pelo que alguém pensa ser "são".

A execução de make -j em um projeto pequeno é perfeitamente razoável. Em outros projetos, usar -j sem um argumento prejudicará seriamente a capacidade de resposta do sistema. Em alguns projetos, o uso de construções paralelas, mesmo com -j2 , interromperá completamente a compilação (arquivos criados por um processo de criação paralelo não estão lá a tempo para outro, etc.).

Eu pessoalmente evitaria aliasing make to make -j4 (como você diz que está considerando, em comentários). Eu acho que é melhor explicitamente dizer à máquina o que fazer, de modo que eu saiba o que ela fará. Daqui a alguns dias, esqueci o nome falso e fico imaginando por que os quatro projetos que estou construindo em terminais separados estão tornando meu sistema irresponsivo.

Quanto a "perigoso" ... A palavra significa coisas diferentes em contextos diferentes. Sim, é "perigoso" porque pode deixar o sistema sem resposta. Sim, é "perigoso" porque pode falhar o processo de construção na metade da construção. Mas não, não é "perigoso", no sentido de que irá reformatar o seu disco rígido ou começar a apagar arquivos aleatórios.

Então, como provar a idiotice?

Veja um guia passo a passo infalível:

  1. Aprenda a usar suas ferramentas.

Note, também, que o sinal -j to BSD make requer um argumento, e que este sinalizador não é padrão (o padrão Unix POSIX não o menciona).

    
por 31.12.2016 / 11:27
3

Você também pode limitar o uso de -l :

-l [load], --load-average[=load] Specifies that no new jobs (commands) should be started if there are others jobs running and the load average is at least load (a floating-point number). With no argument, removes a previous load limit.

Mas note que não parece ajudar a executá-lo assim: 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, e. make -j8 -l4 .

    
por 19.09.2017 / 20:04