Tenho lido sobre o ajuste de desempenho do Linux para obter tempos de processamento de pacotes mais rápidos ao receber dados do mercado financeiro. Vejo que quando a NIC recebe um pacote, ela o coloca na memória via DMA e, em seguida, gera um HardIRQ - que por sua vez define algumas configurações de NAPI e gera um SoftIRQ. O SoftIRQ então usa drivers NAPI/de dispositivo para ler dados dos buffers RX por meio de polling, mas isso só é executado por um tempo limitado (net.core.netdev_budget, padrão para 300 pacotes). Estas são uma referência a um servidor real rodando Ubuntu, com uma NIC solarflare. Minhas perguntas estão abaixo:
Se cada HardIRQ levanta um SoftIRQ, e o driver de dispositivo lê vários pacotes de uma só vez (netdev_budget), o que acontece com os SoftIRQs levantados por cada um dos pacotes que foram drenados do buffer RX de uma só vez (cada pacote recebido levantará um disco rígido). e então irq suave)? Eles estão na fila?
Por que o NAPI usa polling para drenar o RX_buffer? O sistema acabou de gerar um SoftIRQ e está lendo o buffer RX, então por que a votação?
Presumivelmente, a drenagem do RX_Buffer por meio do softirq só acontecerá a partir de 1 RX_Buffer específico e não em vários RX_Buffers? Em caso afirmativo, aumentar o netdev_budget pode atrasar o processamento/drenagem de outros RX_buffers? Ou isso pode ser mitigado atribuindo diferentes RX_buffers a diferentes núcleos?
Existem configurações para garantir que HardIRQs sejam gerados e manipulados imediatamente. No entanto, os SoftIRQs podem ser processados posteriormente. Existem configurações/configurações para garantir que os SoftIRQs relacionados ao RX da rede também sejam tratados com prioridade máxima e sem atrasos?
Responder1
Em relação à resposta à 4ª pergunta,
Sim, as placas NIC de rede são os periféricos associados ao softirq. Como o softirq é a prioridade mais alta em todos os mecanismos da metade inferior.
Portanto, para proibir o atraso que pode levar à queda do pacote posteriormente, são usados softirqs.
Basicamente, o mecanismo NAPI também se destina a manipular os pacotes que chegam com uma velocidade que o kernel não consegue manipular com o mecanismo de interrupção por alguns motivos.
Eu sugeriria apenas ir para o capítulo de drivers de rede no LDD3.Aquié o link que pode ser útil para o mesmo.