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.