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?
make
as 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 -j128
antes de lançar um kernel.
alias make="make -j4"
para eliminar a necessidade de adicionar-jN
argumentos, mas ainda não pensei em todas as possíveis consequências ...