Coalescência de interrupções agrupa vários pacotes de entrada em uma única interrupção de hardware, reduzindo a carga da CPU e aumentando o rendimento. Mostro como ajustar temporizações, limiares e funções de NIC, como RSS e RSC, para minimizar a latência, o jitter e a Rendimento em função da carga de trabalho.
Pontos centrais
Visão geralOs seguintes aspectos fundamentais guiá-lo-ão de forma estruturada através da tecnologia, da afinação e da prática.
- Descarregamento da CPUMenos interrupções, maior rendimento.
- Compensação de latênciaMilissegundos contra estabilidade e pps.
- Afinação da placa de redePerfis de energia RSS, RSC, MTU e BIOS.
- Configuração do SOethtool, RSC/RSS, filas de espera de condutores.
- Monitorizaçãopps, interrupções/s, latência p99.
Breve explicação da coalescência de interrupções
Coalescência significa que a placa de rede recolhe os pacotes que chegam e só dispara uma interrupção quando há trabalho suficiente ou quando um temporizador expira. Desta forma, reduzo significativamente o número de interrupções e transfiro partes do processamento de pacotes na NIC, o que reduz a carga na CPU. Nos servidores Windows, o Receive Segment Coalescing (RSC) ajuda combinando vários segmentos em blocos maiores e reduzindo os custos de processamento. No Linux, controlo a agregação através de rx-usecs (tempo) e rx-frames (pacotes), dependendo das caraterísticas do fluxo e da latência pretendida. Esta abordagem reduz as despesas gerais, mantém os núcleos livres e estabiliza o débito com tráfego intenso. O compromisso deliberado continua a ser importante: cada resumo adiciona um pequeno tempo de espera, que eu limito rigorosamente para fluxos críticos de latência.
Mecânica: Temporizações, FIFO e limiares
NICs mantêm os quadros de entrada numa fila FIFO e disparam interrupções de acordo com dois critérios: após x quadros recebidos ou após y microssegundos. Eu defino janelas de tempo pequenas para serviços de baixa latência e aumento-as para fluxos de alto rendimento com grandes rajadas. Uma fila por fila de receção melhora a paralelização, enquanto a moderação de interrupções reduz as mudanças de núcleo e faz melhor uso do cache. No entanto, rx-usecs muito altos aumentam o atraso; valores muito baixos geram tempestades de interrupções e reduzem o cache. Rendimento. Assim, equilibro o timeout e o limite de pacotes de acordo com o MTU, o tamanho do quadro e a proporção de pacotes pequenos.
Moderação adaptativa e deteção de explosões
Coalescência adaptativa adapta dinamicamente as janelas de tempo e de pacotes à carga atual. Eu uso-o quando os perfis de carga flutuam muito: a uma taxa de pps baixa, as janelas permanecem pequenas (baixa latência); à medida que a taxa de pps aumenta, elas aumentam (reduzindo a carga na CPU). O benefício depende do driver: algumas NICs detectam rajadas e aumentam os rx-usecs a curto prazo, outras trabalham com níveis fixos. Eu verifico o Estabilidade da latência do p99 com a adaptação activada; as curvas irregulares indicam saltos demasiado agressivos. Para serviços determinísticos, prefiro definir limiares estáticos, finamente selecionados, enquanto permito modos adaptativos em operação em massa, desde que não haja quedas no anel.
Taxa de transferência versus latência: o compromisso controlável
Latência diminui quando desativo a coalescência, mas a CPU trabalha significativamente mais e se adapta menos bem à carga. Para transferências de ficheiros, streaming ou replicação, aceito algum atraso, uma vez que isso aumenta a estabilidade e o débito líquido. Para VoIP, jogos em tempo real ou HFT, prefiro um atraso mínimo e desativo a moderação. Também verifico o Controlo de congestionamento TCP, porque algoritmos como o CUBIC ou o BBR influenciam fortemente o comportamento em caso de perda de pacotes, RTT e rajadas. Com temporizadores bem ajustados, RSS e parâmetros TCP adequados, o compromisso otimização mensurável.
Coalescência de transmissão, TSO/GSO/GRO e LRO
Para além do RX, o Coalescência TX desempenham um papel importante: tx-usecs e tx-frames agrupam pacotes de saída, o que economiza trocas de contexto e estabiliza a taxa de envio. Eu uso tx-usecs moderados para suavizar envios em massa, mas mantenho-os pequenos se respostas curtas (por exemplo, APIs HTTP) precisam ser enviadas rapidamente. Descargas como TSO/GSO aumentar os segmentos antes da transmissão e reduzir o número de pacotes, enquanto GRO/LRO fundir segmentos no lado RX. Valido se o GRO/LRO se harmoniza com as minhas middleboxes; para determinadas firewalls ou requisitos de captura, reduzo o LRO para manter os limites dos pacotes visíveis. Em suma, combino a coalescência TX e os offloads de forma a reduzir o PPS e o kernel gasta menos tempo de SoftIRQ sem aumentar desnecessariamente os tempos de resposta.
Afinação de NIC para servidores de alojamento
RSS (Receive-Side Scaling) distribui os fluxos de entrada por vários núcleos e evita que um único núcleo se torne um travão. Eu ativo o RSS e configuro filas de receção suficientes para que as CPUs multi-core funcionem eficientemente. O RSC também reduz a carga ao mesclar segmentos menores, o que reduz o número de pacotes na pilha. Para cargas de trabalho de alojamento, combino a coalescência com uma seleção limpa de MTU, priorização DSCP/QoS e perfis de potência da CPU na BIOS, onde os estados C e os modos de sono profundo não aumentam a latência. Testo as combinações em picos de carga e verifico se a afinidade de IRQ e a fixação de filas preservam a localidade da cache. É assim que eu trago nic tuning hosting e interromper a rede de coalescência.
NUMA, MSI-X e direção de fluxo
Em hosts com vários soquetes, presto atenção a NUMA-Membership: eu coloco as filas de receção nos núcleos que estão próximos do slot PCIe e coloco os threads de trabalho associados no mesmo nó NUMA. MSI-X-As interrupções oferecem vários vectores; utilizo o maior número possível para que cada fila RX/TX tenha a sua própria interrupção e a retenção de bloqueios seja reduzida. Além disso, ajuda RPS/RFS/XPS, para direcionar os fluxos para os núcleos „certos“ e controlar a atribuição de envios. Meço as taxas de falha L1/L2 e observo se o tráfego entre núcleos aumenta; se for esse o caso, realoco as filas ou reduzo o número de filas para aumentar a localidade.
Parâmetros e seus efeitos (quadro)
Parâmetros tais como rx-usecs, rx-frames, RSS queues e RSC determinam se eu prefiro minimizar a latência ou estabilizar a taxa de transferência. Começo com valores conservadores, meço a latência do p99 e as interrupções por segundo e depois aumento cuidadosamente as janelas de tempo. Pequenos passos facilitam a atribuição de efeitos e evitam interpretações erróneas. Se as rajadas dominarem, aumento ligeiramente os rx-frames e verifico a distribuição do jitter. Para cargas de trabalho mistas, vario para cada VLAN ou perfil de NIC de modo que Fluxos com objectivos diferentes são optimizados separadamente.
| Parâmetros | Efeito | Risco | Adequado para |
|---|---|---|---|
| rx-usecs (tempo) | CPU-Alívio através da janela de atraso | Maior latência para fluxos curtos | Elevado rendimento, cópias de segurança, replicação |
| rx-frames (pacotes) | Combina pequenas embalagens numa só Interrupção juntos | Preenchimento de pistas para explosões | Muitos pacotes pequenos, tráfego web |
| Filas de espera RSS | Processamento escalonado em vários núcleos | A fixação incorrecta aumenta o tráfego entre núcleos | Anfitriões multi-core com 10-100 Gbit/s |
| RSC/RSS ativo | Menos carga de encomendas no Pilha | Inadequado para latência ultra-baixa | Alojamento, virtualização, armazenamento |
InterpretaçãoSe os fluxos curtos dominarem, transfiro o efeito para o mínimo de rx-usecs; para transferências em massa, defino valores mais elevados e beneficio de uma taxa de interrupção decrescente. Verifico a latência p95/p99 e o PPS após cada passo para evitar configurações incorrectas. À medida que a carga aumenta, monitorizo os tempos de IRQ suaves e as trocas de contexto para garantir que o tempo da CPU flui para onde é realmente benéfico. Um layout de afinidade de IRQ limpo evita interrupções errantes entre núcleos e economiza Cache-hit.
Prática: Windows Server e Linux
WindowsNo Gestor de Dispositivos, abro as propriedades da placa de rede, selecciono „Avançado“ e ajusto a moderação de interrupções, RSS e RSC, se necessário; para baixa latência rígida, defino a moderação como „Desativado“. Defino os perfis de energia para alto desempenho para que os estados C não aumentem o tempo de resposta. LinuxUso o ethtool para ajustar rx-usecs/rx-frames e uso o ethtool -S para verificar os contadores de IRQ e de erros; o irqbalance ou a afinidade explícita atribui filas aos núcleos. Para pacotes muito pequenos, eu experimento com GRO/LRO e verifico se o caminho do utilizador ou o caminho do kernel é o gargalo. Eu aprofundo este tópico no meu guia para Otimizar as interrupções da CPU, que descreve etapas mensuráveis e contra-verificações.
Virtualização e nuvem: SR-IOV, vSwitch e vRSS
Em ambientes virtualizados, o Caminho das embalagens a definição óptima. Com SR-IOV Os VFs contornam a sobrecarga do vSwitch; configuro a coalescência diretamente no PF/VF e certifico-me de que o convidado e o anfitrião têm políticas semelhantes. Em cenários de vSwitch (Hyper-V, Open vSwitch), filas e agendadores adicionais estão envolvidos; vRSS distribui a carga dentro da VM por várias vCPUs. Meço se a coalescência está a ter efeito no anfitrião ou na VM e evito a dupla moderação com janelas demasiado grandes. Para as cargas de trabalho NFV/DPDK, o trabalho é transferido para o espaço do utilizador; ajusto os orçamentos de sondagem nesse espaço e mantenho a coalescência do kernel conservadora para não falsificar as medições.
Medição do desempenho e telemetria
Medição garante todas as optimizações, pelo que acompanho pps, bytes/s, interrupções/s, tempos SoftIRQ, quedas e comprimento da fila. Comparo a latência p50/p95/p99 e presto atenção ao comportamento de rajadas, porque os valores médios ocultam os valores anómalos. Para HTTP/2/3, meço a densidade da ligação, a taxa de pedidos e o tempo de CPU por pedido, a fim de reconhecer os efeitos secundários da coalescência. Os nós de armazenamento beneficiam quando analiso o iowait, a carga de IRQ e a latência da rede em conjunto, porque os estrangulamentos tendem a migrar entre as camadas da pilha. Painéis de controlo com eventos e tempos de implementação ajudam a atribuir claramente passos de afinação e a parar imediatamente as regressões.
Protocolos críticos em termos de tempo e carimbos de data/hora de hardware
Para protocolos com medição exacta do tempo (por exemplo, PTP), verifico se a coalescência influencia a precisão dos carimbos de data/hora. Alguns NICs oferecem carimbos de data/hora de hardware que são definidos antes da coalescência - ideal para a precisão da medição. Nesses casos, desativo o LRO/GRO e reduzo os rx-usecs ao mínimo para que as variantes de latência não interfiram na sincronização do tempo. Para as redes determinísticas (TSN), mantenho os modos de poupança de energia inalterados, defino rigorosamente a QoS e confirmo que nenhuma fila de espera gera transbordos que ponham em causa a estabilidade do relógio.
Perfis de carga de trabalho: Quando ativar, quando não ativar?
Elevado rendimentoAs cópias de segurança, a origem CDN, o armazenamento de objectos e a replicação de VM beneficiam muito da coalescência porque a CPU é menos perturbada. Alojamento Web com muitos pedidos pequenos precisa de valores moderados, combinados com RSS e boa localização da cache. Os ambientes virtuais ganham quando defino predefinições inteligentes por vNIC e isolo os vizinhos ruidosos. Para VoIP, jogos ou telemetria em tempo real, desativo a moderação ou defino temporizadores muito apertados. As medições de acordo com o perfil de tráfego são obrigatórias, porque o tráfego em massa de 10 Gbit/s tem um comportamento diferente do tráfego API de 1 Gbit/s.
Tamanhos de anel, buffers e comportamento de queda
Para além dos temporizadores Tamanhos de anéis (descritores RX/TX) para garantir a fiabilidade durante as rajadas. Aumento moderadamente os descritores RX quando picos curtos causam quedas, prestando atenção ao espaço ocupado na memória e à adequação da cache. Anéis demasiado grandes escondem problemas, mas prolongam os tempos de espera no pipeline. Monitorizo „rx_no_buffer“, „dropped“ e „overruns“ nos contadores de estatísticas e comparo os limiares com as durações típicas das rajadas. Uma combinação bem equilibrada de rx-frames, rx-usecs e tamanho do anel evita Explosões conduzem a perdas ou a picos de instabilidade.
Jitter, perda de pacotes e tratamento de rajadas
Jitter ocorre quando as janelas de coalescência e os padrões de explosão interagem desfavoravelmente; posso reconhecer isso por distribuições de latência amplas. Pequenos saltos no temporizador geralmente suavizam a curva do p99 sem reduzir visivelmente a taxa de transferência. Se a placa de rede cair sob carga, defino valores menos agressivos e verifico a profundidade da fila e os estados dos controladores. No caso dos sítios Web, é útil analisar Jitter de rede, para tornar planeáveis os pedidos de bloqueio de renderização e os handshakes TLS. Por fim, verifico se as políticas de QoS separam de forma clara as classes de prioridade e, assim, evitam que os Fluxos preferir.
Lista de verificação prática de afinação
Início com a linha de base: Registo a latência, os pps, as interrupções/s e o perfil da CPU antes de cada alteração. Em seguida, ativo o RSS/RSC, defino valores moderados de coalescência e meço novamente p50/p95/p99. Em seguida, aumento os rx-usecs em pequenos passos até que o jitter ou a latência p99 aumentem e volto ao último ponto positivo. Atribuo filas a núcleos fixos e monitorizo as perdas de cache; se o tráfego entre núcleos aumentar, ajusto a afinidade. Eu documento brevemente cada mudança e comparo os picos de carga para que o Estabilidade não sofre em segredo.
Exemplo de valores de arranque de acordo com a velocidade da ligação
- 1 Gbit/s: rx-usecs 25-50, rx-frames 8-16, tx-usecs 25-50; poucas filas RSS (2-4), foco na latência.
- 10 Gbit/s: rx-usecs 50-100, rx-frames 16-32, tx-usecs 50-100; 4-8 filas RSS, GRO ligado, LRO seletivo.
- 25/40 Gbit/s: rx-usecs 75-150, rx-frames 32-64, tx-usecs 75-150; 8-16 pistas, NUMA pinning strict, RSC/RSS ativo.
- 100 Gbit/s: rx-usecs 100-200, rx-frames 64-128, tx-usecs 100-200; 16-32 pistas, utilizar plenamente o MSI-X, aumentar moderadamente o tamanho dos anéis.
NotaEstes são pontos de entrada conservadores. Optimizo ao longo da latência e das quedas do p99 e considero os tamanhos dos pacotes (MTU 1500 vs. Jumbo), a mistura de fluxos e a topologia da CPU.
Custos, energia e sustentabilidade
Energia diminui quando pressiono a taxa de interrupção porque a CPU executa menos comutações de contexto e despertares. Nos centros de dados, este facto é importante para muitos anfitriões e reduz significativamente os custos de energia e de refrigeração. Uma atualização para as modernas placas de rede 10/25/40/100G com boa moderação custa normalmente algumas centenas de euros, mas muitas vezes paga-se rapidamente graças ao menor tempo de CPU por byte. Tenho em conta se as licenças, a manutenção dos controladores e a monitorização já estão em vigor, de modo a manter os custos de funcionamento baixos. Para serviços críticos de SLA, vale a pena uma janela conservadora, que Jitter limita e protege a experiência do utilizador.
Resolução de problemas e antipadrões
Mostrar métricas Tempestades de interrupções, Reduzo as filas RSS ou aumento ligeiramente os rx-usecs. Para curvas de latência „instáveis“, desativo a moderação adaptativa como um teste. Se ocorrerem quedas apesar das reservas elevadas da CPU, verifico os tamanhos dos anéis, a versão do firmware e a gestão de energia do estado da ligação PCIe. Um clássico: coalescência muito elevada + GRO/LRO ativo mascara as perdas de pacotes em p50, enquanto p99 sofre - então reequilibro os rx-frames e encurto os rx-usecs. Com hosts multi-tenant, „vizinhos barulhentos“ causam uma carga de IRQ distribuída de forma desigual; uso máscaras de afinidade rígidas e classes QoS para evitar IRQs críticos. Fluxos para os proteger. Importante: Implemente sempre as alterações individualmente e teste-as com perfis de carga idênticos, de modo a separar claramente a causa e o efeito.
Resumo: Mais rápido, mais suave, mais previsível
Ideia centralA fusão de interrupções reduz a interferência, distribui o trabalho de forma mais inteligente e aumenta o rendimento líquido, desde que eu defina temporizadores e limites de pacotes de forma direcionada. Para serviços de elevado débito, escolho janelas mais generosas, para serviços em tempo real, minimizo ou desativo a moderação. Utilizo totalmente CPUs multi-core com RSS, RSC, disciplina MTU e afinidade IRQ limpa. As medições com p95/p99, interrupções/s e tempos de SoftIRQ garantem cada alteração e evitam interpretações erróneas. Assim, os meus Rede silencioso sob carga, responde rapidamente e fornece latências previsíveis para alojamento e aplicações.


