Por que as pessoas recomendam a opção -j3 para make ao ter uma CPU dual-core?

18

No Gentoo Linux, é possível definir a variável MAKEOPTS em /etc/portage/make.conf para informar make de quantos trabalhos devem ser executados em paralelo ao criar pacotes. Como eu tenho uma CPU dual-core, eu ingenuamente escolhi usar a opção -j2 : uma tarefa por núcleo, então ambos têm algo a fazer. O "problema" é que existem muitas referências que dizem aos usuários que têm uma CPU dual-core para definir a opção -j3 . Alguns deles são:

Por exemplo, o manual do Gentoo diz:

A good choice is the number of CPUs (or CPU cores) in your system plus one, but this guideline isn't always perfect.

Mas qual é a razão para a regra "CPUs + 1"? Por que o trabalho extra?

A página man do make.conf (5) até diz:

Suggested settings are between CPUs+1 and 2*CPUs+1.

Eu também li a seção 5.4 (Execução paralela) na página make info e make man da explicação para a opção -j , mas parece que não há respostas lá.

    
por Francesco Turco 14.10.2012 / 11:58

4 respostas

13

Não existe uma regra simples que funcione sempre. As pessoas podem recomendar uma figura específica porque experimentaram uma compilação específica em uma máquina específica e essa foi a melhor configuração, ou porque seguiram algum raciocínio que pode ou não ter alguma relação com a realidade.

Se você é abençoado com muita RAM, então o fator limitante em uma longa compilação será o tempo de CPU. Então, uma tarefa por CPU, mais uma tarefa pendente para esses blocos ocasionais de E / S, é uma boa configuração. Isso torna -j3 para uma CPU dual-core (ou mais precisamente, para uma máquina com duas CPUs - se cada núcleo é hyperthreaded, isso seria 4 CPUs, então -j5 ).

Se você tem muito pouca memória RAM, então um fator limitante pode ser que você não pode ter muitos trabalhos simultâneos, ou então eles continuarão trocando de posição. Por exemplo, se você não conseguir caber confortavelmente duas instâncias do compilador na memória, make -j2 talvez já seja mais lento que make . Como isso depende de quantos processos do compilador você pode encaixar na RAM de uma só vez, não há como obter uma figura geral.

No meio, pode ser benéfico ter mais empregos. Se cada processo de compilador é pequeno, mas a compilação como um todo toca muitos dados, então a E / S de disco pode ser o fator de bloqueio. Nesse caso, você precisará de vários trabalhos por CPU ao mesmo tempo, para que haja sempre um trabalho usando cada CPU, enquanto outros estão aguardando por E / S. Novamente, isso é muito dependente do trabalho de construção e da RAM disponível, aqui no que está disponível para o cache de dados (existe um ótimo após o qual ter muitos trabalhos polui muito o cache).

    
por 15.10.2012 / 00:14
7

Eu acho que isso é meio heurístico - permitir que make inicie CPUs + 1 processos é ter certeza de que:

  1. não haveria um intervalo entre um processo de trabalho que acabou de terminar e um funcionário ainda a executar - um pouco como a fila de execução de preenchimento prévio.
  2. não haveria muitos processos concorrentes para gerar uma sobrecarga perceptível com o preenchimento antecipado da fila de execução.

Mas, novamente, isso é heurístico e o manual do FreeBSD ainda recomenda make -j4 para uma única CPU.

    
por 14.10.2012 / 18:56
5

Geralmente, há motivos para iniciar mais trabalhos do que o número de núcleos. Para compilar C usando o gcc, se -pipe não estiver definido nas opções do gcc, ele executará suas ações (pré-processamento, primeira execução, otimizações e montagem) em seqüência usando arquivos temporários; -pipe muda isso para usar pipes entre subprocessos. (Adição -pipe é padrão, por exemplo, para o FreeBSD, mas não é tradicional no Linux.) Portanto, se você tiver 2 núcleos e permitir 2 tarefas em paralelo, eles passarão algum tempo na E / S do disco. A recomendação para adicionar 1 trabalho parece estar relacionada com esses detalhes. Mas, para obter a resposta final, você deve encontrar quem e quando adicionou essa recomendação e perguntar a ele :) ou pergunte na lista de discussão do Gentoo devels.

    
por 14.10.2012 / 15:46
2

Basicamente, esse número é o que os autores chamam de senso comum. Na melhor das hipóteses, é um bom palpite. Tanto quanto eu sei o processo de make que é gerado quando você digita make já é contado assim com -j3 você pode acabar com o processo principal esperando, enquanto os outros dois estão compilando.

No entanto, quando usei o Gentoo, a regra geral era <#cpus>*2 + 1 .

Tudo depende do que seus rastros de frango, folhas de chá ou bolas mágicas informam sobre a E / S do disco que precisa ocorrer e o agendamento do seu kernel atual do Linux. [começo no núcleo deste post] Da minha experiência pessoal ( -j não é específico do Gentoo), tudo entre #cpus + 1 e #cpus * 2 + 1 produz bons resultados [termina o núcleo deste post] e em média você dificilmente notará diferenças. Processadores e kernels são muito bons nos dias de hoje.

MAS tudo isso muda quando: a) você realmente usa mais de uma caixa para compilar (du'h) ou b) estão desenvolvendo seu próprio código

É mais provável que um atributo -j maior mostre dependências anteriormente desconhecidas.

E em uma nota lateral: não vá pelo número de núcleos, mas pelo número de fluxos simultâneos que os processadores executam. (Hipertensão!)

    
por 14.10.2012 / 21:51

Tags