Como os threads são distribuídos entre os núcleos em um sistema multiprocessador?

Como os threads são distribuídos entre os núcleos em um sistema multiprocessador?

Atualmente estou verificando os limites de uma aplicação de servidor em um sistema com dois processadores de 12 núcleos, ou seja, 24 núcleos. (Hyper-threading atualmente desativado).

Estou executando 12 instâncias de recebimento pesado de UDP do mesmo aplicativo nessa caixa e ele maximiza todos os 12 núcleos de um dos 2 soquetes, de acordo com o Gerenciador de Tarefas. Mas o outro soquete está ocioso. Também tentei iniciar uma 13ª instância desse aplicativo, mas ele ainda é executado no primeiro soquete já ocupado.

Por que? Quais são as regras pelas quais os threads são agendados para núcleos em um sistema multiprocessador?

Algumas ideias:

  • Poderia ter a ver com RSS (Receive side scaling), que está habilitado e estaria envolvido na seleção de núcleos pelo menos para o thread receptor de nosso aplicativo (mas o aplicativo também tem outros threads de trabalho pesado)?
  • O RSS (ou MSI/MSI-X) está limitado a um soquete?
  • Uma única instância de aplicativo poderia/irá ser executada em vários soquetes ao mesmo tempo?

Detalhes do sistema:

  • ProLiant BL460c Gen9
  • Intel Xeon E5-2670 v3
  • Janelas 2012 R2

Responder1

Alguns slots/dispositivos IO comunicam-se diretamente com um dos processadores (outros slots podem comunicar-se com o outro). Há vantagens em realizar o trabalho gerado por essa placa/dispositivo IO nesse processador.

Por exemploDDIOfunciona melhor para o processador conectado ao(s) slot(s) PCI/dispositivo IO.

informação relacionada