Faço muitas análises estatísticas com R e utilizo intensamente grandes instâncias multicore na AWS. Principalmente para pesquisas de hiperparâmetros, validação cruzada e inicialização.
Digamos que eu tenha uma instância com c
núcleos e um trabalho com r >= c
réplicas, que são distribuídas em c
núcleos por vez. Agora, por causa do processo do sistema (como meu cliente ssh em execução htop
), há trabalhos além das minhas c
réplicas em execução.
Isso significa, até onde eu entendo o funcionamento do sistema operacional, que existe algum processo que está desligando meus trabalhos para que htop
(e tudo mais) possa acessar os processadores. Depois de dar algum tempo ao sol para esses vários processos, meus trabalhos são retomados.
Quando olho htop
, vejo muito vermelho misturado com verde. É correto dizer que o verde é o meu trabalho e o vermelho é o plano de fundo feito para permitir o meu trabalho?
Intuitivamente, parece que este tipo de embaralhamento seria abaixo do ideal. Então aqui está minha pergunta direta: se eu tiver acesso aos c
núcleos, devo alocar meus trabalhos de replicação para todos c
eles, ou talvez c-1
algo assim?
Também imagino que haja muitos detalhes sobre como os recursos de computação são atribuídos a trabalhos que não entendo e estou ignorando. O que estaria envolvido em fazer com que todos os meus trabalhos fossem para c-1
os núcleos e todos os processos do sistema fossem para o cth
núcleo? Isso deixaria todo o meu htop verde, exceto uma barra? E isso faria algum sentido?
Suponho que eu poderia fazer experimentos de benchmarking, mas isso seria difícil com instâncias e conjuntos de dados enormes, e não tenho certeza do que aprenderia, considerando quantas coisas serão específicas do aplicativo. Então quero entender melhor como as coisas funcionam.
Responder1
É difícil saber o efeito exato em um aplicativo específico sem experimentação, MAS a regra geral é que exceder o número de núcleos em uma pequena quantidade é benéfico (por exemplo, a maioria dos guias de compilação sugere chamar make com número de núcleos/threads + 1), mas excedê-lo em grande quantidade é provavelmente contraproducente devido à sobrecarga extra. A razão para isso é que se uma (ou algumas) das tarefas estiver suspensa aguardando E/S ou temporizadores ou qualquer outra coisa, os outros threads ainda poderão prosseguir.
A confusão de trabalho (agendamento do sistema operacional) acontece em todos os sistemas operacionais modernos e é algo com o qual devemos trabalhar, em vez de combatê-la. Se parece haver algo não relacionado competindo, você pode diminuir o nível agradável do seu processo, mas em uma instância AWS dedicada... É difícil imaginar que isso seja necessário.