Balanceamento automático de carga da CPU para programa ou grupo de programas no Linux?

2

considere a seguinte configuração: system (Ubuntu 14.04 LTS) com 40 núcleos, muita memória RAM. Além disso, um programa que é apenas parcialmente multithreaded. Ou seja, ele alterna constantemente entre vários núcleos por horas e, em seguida, apenas um núcleo (também por horas).

Eu quero maximizar a utilização da CPU dessa máquina executando esse programa em paralelo, digamos, 10 vezes, mas eu realmente gostaria de evitar situações em que

  1. todas as 10 instâncias querem ser executadas em todos os 40 núcleos em paralelo (terrível cache trashing)
  2. Eu digo a cada instância para usar, digamos, um máximo de 4 núcleos, mas então tenho situações em que 9 deles estão em uso único e o décimo pode usar todos os núcleos momentaneamente, mas não pode usar apenas 4.

A pergunta é: existem extensões de utilitários / SO que permitem isso? O uso de "renice" não é totalmente o que seria necessário, embora se houvesse um supervisor automático autorizado a renunciar dinamicamente os processos para cima ou para baixo, o que poderia chegar bem perto. Idealmente, funcionaria algo assim: desde que um conjunto de programas não maximize os recursos da CPU, eles podem obter o máximo que quiserem. Mas se eles usarem mais, então o (s) programa (s) com o tempo de execução mais longo (ou o que quer que seja) obtém a maior prioridade para a CPU, eventualmente privando as outras instâncias.

O mais próximo que eu encontrei são Grupos de Controle (cgexec e amigos), mas pelo que eu posso dizer, só podemos definir grupos de programas com taxas fixas de CPU, por exemplo, programas em grupo podem usar no máximo 60% da CPU ( mesmo que os outros 40% não sejam usados) e não há como impedir que todos os processos obtenham algo (novamente, destruindo os caches da CPU).

    
por BaCh 13.04.2016 / 21:49

1 resposta

0

Dê uma olhada no tarefet que permite definir quais núcleos (CPUs) nos quais um processo pode ser executado.

    
por 14.04.2016 / 00:39