Como evito que eu acidentalmente especifique muitos segmentos ao compilar?

2

Quando eu compilo coisas eu geralmente quero fazer isso rápido, então na minha estação de trabalho eu emito

make -j16

E (gnu) make começa a compilar com 16 núcleos. No entanto, quando estou de volta ao meu laptop, não tenho 16 núcleos lá. Então quando eu emito o mesmo comando, minha máquina congela até a morte. Não consigo alternar para terminais alternativos via CTRL + ALT + F1 etc., nem o login remoto será bem-sucedido. CTRL + C, CTRL + 4 nenhum deles será considerado. (BTW: nenhuma morte automática será bem sucedida, por exemplo, falta de memória automática) Eu tenho que desligar minha máquina então. (Eu uso o Ubuntu 11.10 com um kernel 3.0.x)

Uma solução é antecipar o número de núcleos disponíveis na máquina atual com um pequeno alvo onde qualquer outro alvo "paralelo" depende e não usar "make -j $ NUMCORES" diretamente. (Eu já fiz isso e percebi com um pequeno programa c ++ usando threads de reforço). Mas isso não vai me proteger de acidentalmente especificar "make -j16" novamente.

Além disso, os núcleos "muitos" não devem ter o mesmo número de núcleos (incluindo núcleos de encadeamento) do que os disponíveis, pois os encadeamentos +1 ou +2 ainda não matariam a máquina.

Posso empregar ulimits para moderar o problema? Eu pensei em especificar para definir o espaço de troca para 0. Então eu deveria ter uma mudança em abortar adivinhar .

    
por math 21.03.2012 / 12:49

1 resposta

5

Você não precisa escrever nenhum Makefiles especial para determinar o número de núcleos; os flags padrão podem ser especificados no ambiente e o Linux coreutils vem com uma ferramenta chamada nproc :

export MAKEFLAGS="-j$(nproc)"

Se nproc não existe em seu sistema, uma alternativa (também apenas para Linux) é getconf :

export MAKEFLAGS="-j$(getconf _NPROCESSORS_ONLN)"

A proteção parcial contra congelamentos completos pode ser feita executando make (juntamente com todo o processo de compilação) com baixa prioridade de CPU e IO:

alias make="nice ionice make"

Note, no entanto, que isso irá desacelerar a compilação se outros processos estiverem usando o disco IO ou a CPU strongmente ao mesmo tempo.

Você também pode escrever um script de wrapper (ou uma função de shell) que verifique todos os argumentos dados a ele:

make() {
    local arg
    for arg; do
        [[ $arg == -j* ]] && {
            echo "Rejecting '$arg' in make args. Use 'command make ...' to bypass."
            return 1
        }
    done
    command make "$@"
}
    
por 21.03.2012 / 13:07