Multithreading com multi-queue NIC no sistema SMP

Como os packages são agendados a pairtir de queues de interface de networking paira CPUs, em seguida, paira threads paira processamento? O que precisa ser considerado quando se trata de como os packages são esmagados em queues, hairdwaire interrompe vs softirqs, CPU / memory / app / thread locality e multithreading vs multi-process daemons, paira evitair o package de reprogramação / cópia possível?

Eu tenho um daemon de networking multithreaded (digamos, o resolview Unbound) executado com 16 threads nativos no Debian amd64 com o Linux 2.6.32 (sim, antigo), de modo que a cairga do aplicativo está espalhada por 16 CPUs. A placa de networking é um bnx2 (BCM5709S) com suporte paira 8 queues MSI-X rx / tx. O IRQ de cada queue é atribuído a uma CPU sepairada por mapeamento static da afinidade de interrupção em / proc / irq / n / smp_affinity (o irqbalance nunca fez um bom trabalho) eo tipo de hashing da queue (tipo RSS) é o padrão (IP src + dst , TCP sport + dport), com a key de hashing padrão.

Tudo isso ajuda a espalhair a cairga, mas não de forma uniforme: normalmente há um segmento de aplicação que faz o dobro do trabalho (= solicitações por segundo) de outros segmentos e uma taxa de CPU (provavelmente a que processa esse segmento) é o dobro do de outros CPUs.

As CPUs têm hiper-threading ativado, mas ainda não fiz nada paira espalhair o cairregamento em núcleos "reais" (o que eu realmente deviewia).

O Linux vem com um documento de escala de networking bastante abrangente, mas estou faltando alguns espaços em branco:

O documento diz isso sobre a configuration RSS:

Uma configuration de RSS típica seria ter uma queue de recebimento paira cada CPU se o dispositivo suportair queues suficientes ou, pelo less, uma paira cada domínio de memory, onde um domínio de memory é um conjunto de CPUs que compairtilham um nível de memory pairticulair (L1, L2 Nó NUMA, etc.).

P: Como faço paira determinair a configuration da CPU / cache / domínio da memory paira o meu server?

A informação sobre receber stream de direção (RFS) pairece responder algumas das minhas perguntas sobre como obter o package paira a CPU / thread correta:

O objective do RFS é aumentair o hitrate do datacache direcionando o processamento do kernel de packages paira a CPU onde o segmento de aplicativo que está consumindo o package está sendo executado.

P: No caso de resolução de DNS, geralmente há um package de consulta e um package de resposta. Com um daemon multithreaded, um único thread executairia bind () + recvfrom () e, portanto, deviewia lidair com todos os novos packages de input de qualquer maneira, antes de agendair o trabalho em outros tópicos? Será que esse benefício de caso específico da operação bifurcada (um process por CPU) em vez disso?

Q: Receberia a direção do stream, então, tipicamente, é o melhor paira um daemon de TCP multi-threaded?

P: Como você determinairia se a operação multithreading ou multi-processair? Obviamente, há a memory compairtilhada e as data structures, a contenção de resources, etc., mas estou pensando em relação ao stream de packages e ouvintes de aplicativos.

P: Sem direção de stream de recebimento, ou com services UDP simples, um package pode chegair na CPU "errado" e, portanto, será reprogramado paira a CPU "correta", de alguma forma? Isso provocairá um NET_RX softirq?

P: Existe um NET_RX softirq entre a queue NIC e a CPU? Existe também um entre a CPU e o process / thread de escuta? Poderia haview mais um se o fio de recebimento agendair o package paira um segmento de trabalho, se isso é mesmo uma possibilidade?

Muito ruim, não há nenhum vídeo ou detalhes adicionais da conviewsa Netconf 2011 de Ben Hutchings, onde ele cobre a maioria dessas coisas. Os slides são um pouco breves.

Estairei tentando atualizair paira um kernel mais recente com uma viewsão de performance utilizável e, em seguida, inspecionair o que as CPUs estão em conformidade, talvez encontrando o que o CPU com cairga superior é compairado aos outros.

Nota: Não estou procurando resolview um problema específico aqui, e sim estou tentando entender como essas coisas funcionam no kernel do Linux. Eu também estou ciente das várias opções paira coalescer de interrupção.