Deixe-me descrever nossa exigência em detalhes. Estamos fazendo algum tipo de atribuição que requer a captura de dados IP através do cartão NIC e, em seguida, o processamento dos dados capturados em tempo real. O processamento dos dados capturados pode ser feito parcial ou totalmente, dependendo da disponibilidade da CPU. Mas tudo o que pode ser feito será feito em tempo real.
Nossa arquitetura é algo como o seguinte. Nós usamos um thread para capturar dados IP do cartão NIC. E números de threads são criados para processar os dados capturados em tempo real e esse número pode subir para qualquer coisa (digamos 500) que são threads intrínsecos da CPU.
Aqui estão as nossas observações: Por favor, note que temos um thread para captura de dados IP. Quando criamos menos threads de processamento (digamos 10) e consumimos CPU em torno de 95% no total, não há absolutamente nenhum problema nos encadeamentos de captura de dados IP. Mas quando criamos um grande número de threads de processamento (digamos 250) e consumimos CPU em torno de 80% no total, o segmento de captura não consegue capturar os dados IP corretamente. Posteriormente, a disponibilidade da CPU é maior, mas o problema acontece.
Então nós pensamos que o problema poderia ser devido ao número de threads e seu agendamento (também comutação de contexto). Nós pensamos no seguinte tipo de distribuição de CPU entre os threads. Usando afinidade, vamos definir 25% de núcleos para capturar threads e 75% de núcleos para outros threads de processamento.
Para começar, escrevemos um programa simples em uma máquina quad core i7 com HT ON. Suponha que os núcleos lógicos sejam A1 A2 B1 B2 C1 C2 D1 D2 (A B C D sendo os núcleos reais). Nosso segmento de amostra é tal que consome todos os recursos em um único núcleo HT. Portanto, se eu executar 8 desses threads no total de 8 núcleos lógicos, o consumo de CPU mostrará 100%. Agora tentamos atribuir afinidade. Se criarmos dois núcleos e definirmos afinidade para A1 e B1 (não é um encadeamento para A1 e outro encadeamento para B1, é uma afinidade combinada para dois encadeamentos), ele funciona bem e o uso da CPU mostra 25%. Mas se definirmos afinidade combinada para A1 e A2 para dois encadeamentos, somente 12,5% serão consumidos (o gerenciador de tarefas mostra que apenas um núcleo é usado). Mas se definirmos a afinidade de 4 threads para A1, A2, B1, B2, o uso da CPU mostrará 50%. Então a questão é por que o segundo caso (12,5%) não está funcionando?