...

Server IRQ-balancering en netwerkprestaties voor hoogbelaste hosting

Hoge netwerkbelasting wordt bepaald door de efficiënte verwerking van IRQ server signalen: Als je interrupts verstandig verdeelt over CPU cores, verminder je latency en voorkom je drops. In deze handleiding laat ik je zien hoe je IRQ balancering, RSS/RPS en CPU affiniteit op een praktische manier kunt combineren om hoogbelaste hosting duurzaam te maken. performant te bedienen.

Centrale punten

  • IRQ-verdeling voorkomt hotspots op afzonderlijke CPU-kernen.
  • Multi-queue plus RSS/RPS paralleliseert pakketverwerking.
  • NUMA Aandacht vermindert toegang tussen knooppunten en latentie.
  • CPU-gouverneur en thread pinning verbeteren de reactietijden.
  • Controle Controleert pps, latencies, drops en coregebruik.

IRQ's kort uitgelegd: waarom ze de netwerkbelasting regelen

Voor elk inkomend pakket rapporteert de netwerkkaart via IRQ, dat er werk aan de gang is, anders zou de kernel actief moeten enquêteren. Als de opdracht op één core blijft staan, neemt het gebruik ervan toe, terwijl andere cores ongebruikt blijven. Dit is precies wanneer latenties groeien, de RX ring buffers vol raken en stuurprogramma's pakketten beginnen weg te gooien. Ik verdeel interrupts over geschikte kernen om pakketverwerking gelijkmatig en voorspelbaar te houden. Dit verlicht knelpunten, vlakt reactietijden af en beperkt pakketverliezen tot een minimum.

IRQ-balancering en CPU-affiniteit onder Linux

De service irqbalans verdeelt interrupts dynamisch, analyseert de belasting en verschuift de affiniteiten automatisch in de loop van de tijd. Voor extreme belastingsprofielen definieer ik affiniteiten handmatig via /proc/irq//smp_affiniteit en binden signalen specifiek aan kernen van dezelfde NUMA-knooppunten. Deze combinatie van automatische en fijnafstelling helpt me om zowel basisbelastingen als pieken netjes te verwerken. Een diepgaande inleiding tot Interruptverwerking en CPU-optimalisatie Ik gebruik ze om me te helpen bij mijn planning. Het blijft belangrijk: Ik koppel hardware topologie, IRQ distributie en applicatie threads consequent aan elkaar.

Praktisch gebruik van multi-queue NIC's, RSS en RPS

Moderne NIC's bieden verschillende RX/TX-wachtrijen, waarbij elke wachtrij zijn eigen IRQ's, en Receive Side Scaling (RSS) verdeelt stromen over kernen. Als er niet genoeg hardware wachtrijen zijn, voeg ik Receive Packet Steering (RPS) en Transmit Packet Steering (XPS) toe aan de kernel voor extra Parallellisme. Met ethtool -L ethX gecombineerd N Ik pas het wachtrijnummer aan aan het core-nummer van het bijbehorende NUMA-knooppunt. Ik controleer met ethtool -S en nstat, of er drops, bezette polls of hoge pps-pieken optreden. Voor een fijnere afvlakking van de belasting gebruik ik ook Interrupt samenvoegen in de planning zodat de NIC niet teveel individuele IRQ's genereert.

De volgende tabel toont centrale componenten en typische commando's die ik gebruik voor een coherente opstelling:

Bouwsteen Doel Voorbeeld Tip
irqbalans Automatische distributie systemctl enable --now irqbalance Uitgangspunt voor gemengde werklasten
Affiniteit Fixes Pinning echo mask > /proc/irq/XX/smp_affinity NUMA-toewijzing observeren
Cues Meer parallellisme ethtool -L ethX gecombineerd N Overeenstemming met knooppuntkernen
RSS/RPS Stromingsverdeling sysfs: rps_cpus/rps_flow_cnt Nuttig voor een klein aantal NIC-wachtrijen
XPS Geordende TX pad-kernen sysfs: xps_cpus Vermijdt cache thrash

Verstandig gebruik maken van automatische IRQ-balancering

Voor gemengde hostingservers is het vaak voldoende om het volgende te activeren irqbalans, omdat de daemon voortdurend belastingsverschuivingen herkent. Ik controleer de status via systemctl status irqbalans en kijk eens naar /proc/onderbrekingen, om de verdeling per wachtrij en kern te zien. Als latenties in pieken toenemen, definieer ik test cores die voornamelijk interrupts verwerken en vergelijk de gemeten waarden voor en na de verandering. Ik behoud de configuratie eenvoudig, zodat latere audits en rollbacks snel kunnen worden uitgevoerd. Pas als de patronen duidelijk zijn, ga ik dieper in op pinnen.

Handmatige CPU-affiniteit voor maximale controle

Bij zeer hoge pps-snelheden zet ik RX-wachtrijen vast op geselecteerde cores van dezelfde NUMA-nodes en applicatie-threads er bewust van scheiden. Ik isoleer individuele cores voor interrupts, laat workers draaien op naburige cores en besteed veel aandacht aan cache localiteit. Op deze manier verminder ik cross-node toegang en minimaliseer ik dure contextwisselingen in het hot path. Voor reproduceerbare resultaten documenteer ik duidelijk de IRQ maskers, de wachtrijtoewijzing en de thread affiniteit van de services. Deze duidelijkheid houdt de pakketruntijden constant en vermindert uitschieters.

Schone coördinatie van CPU-optimalisatie en toepassingen

Ik heb de CPU-gouverneur vaak ingesteld op „performance“ omdat klokveranderingen de latency sprongen verhogen. Ik bind kritieke processen zoals Nginx, HAProxy of databases aan cores die dicht bij de IRQ cores liggen, of ik scheid ze bewust als het cacheprofiel dat vereist. Het blijft belangrijk om contextveranderingen te beperken en de kernel up-to-date te houden zodat optimalisaties in de net stack effect hebben. Ik meet de effecten van elke verandering in plaats van aannames te doen en pas ze stap voor stap aan. Dit resulteert in een setup die werkt onder belasting voorspelbaar reageert.

Bewaking en meting correct instellen

Zonder gemeten waarden blijft tuning een gokspelletje, dus ik begin met sar, mpstat, vmstat, nstat, ss en ethtool -S. Voor gestructureerde belastingstests gebruik ik iperf3 en kijk naar doorvoer, pps, latency, retransmits en coregebruik. Ik leg langetermijntrends vast met standaard monitoringsystemen om patronen te herkennen zoals avondpieken, back-upvensters of campagnes. Als je het datapad holistisch wilt begrijpen, heb je baat bij een overzicht van de Pakketverwerkingspijplijn van de IRQ van de NIC naar de gebruikersruimte. Alleen de combinatie van deze signalen laat zien of IRQ balancering en affiniteit het gewenste effect hebben bereikt. Effect brengen.

NAPI, Softirqs en ksoftirqd begrijpen

Om latentiepieken met hoge pps-belastingen te beheren, houd ik rekening met de NAPI-mechanica en de interactie tussen harde IRQ's en zachte IRQ's. Na de eerste hardware IRQ haalt NAPI verschillende pakketten op uit de RX wachtrij in poll mode om IRQ stormen te vermijden. Als zachte IRQ's niet onmiddellijk verwerkt worden, worden ze verplaatst naar ksoftirqd/N Threads die alleen met normale prioriteit draaien - een klassieke reden voor toenemende tail latencies. Ik observeer /proc/softirqs en /proc/net/softnet_stat; een hoge „tijdsverschil“waarde of dalingen geven aan dat het budget te krap is. Met sysctl -w net.core.netdev_budget_usecs=8000 en sysctl -w net.core.netdev_budget=600 Ik verhoog de verwerkingstijd per NIC poll en het pakketbudget als test. Belangrijk: ik verhoog de waarden geleidelijk, meet en controleer of CPU jitter of interferentie met applicatie-threads optreedt.

RSS hash- en indirigatietabel fijn afstellen

RSS verdeelt stromen naar wachtrijen via de indirigatietabel (RETA). Ik controleer de hashsleutel en tabel met ethtool -n ethX rx-flow-hash tcp4 en stel de verdeling indien nodig symmetrisch in. Met ethtool -X ethX gelijk N of specifiek per vermelding (ethtool -X ethX hkey ... hfunc toeplitz indir 0:1 1:3 ...), koppel ik toewijzingen aan de voorkeurskernen van een NUMA-knooppunt. Het doel is Kleverigheid van de stroomEen stroom blijft op dezelfde core zodat cache localiteit en lock retentie in de stack minimaal blijven. Voor omgevingen met veel korte UDP-stromen verhoog ik rps_stroom_cnt per RX-wachtrij zodat de softwaredistributie genoeg buckets heeft en geen hotspots creëert. Ik houd in gedachten dat symmetrische hashes helpen bij ECMP-topologieën, maar in de servercontext is core-balans het belangrijkst.

Kies uitladingen, GRO/LRO en ringmaten op een verstandige manier

Hardware offloads verminderen de belasting op de CPU, maar kunnen latentieprofielen veranderen. Ik controleer met ethtool -k ethX, of TSO/GSO/UDP_SEG op TX en GRO/LRO actief zijn op RX. GRO bundelt pakketten in de kernel en is bijna altijd nuttig voor doorvoer; LRO kan problematisch zijn in routerings- of filteropstellingen en kan daar beter uitgeschakeld worden. Voor latency-kritische API's test ik kleinere GRO aggregatie (of tijdelijk uit) als p99 latencies domineren. Ik pas ook ringgroottes aan via ethtool -G ethX rx 1024 tx 1024Grotere ringen onderscheppen uitbarstingen, maar verhogen de latentie bij congestie; te kleine ringen leiden tot rx_gemiste_fouten. Ik vertrouw op gemeten waarden van ethtool -S (bijv. rx_no_buffer_count, rx_verloren) en dit afspreken met BQL (byte queue-limieten, automatisch aan de kernelzijde) zodat TX-wachtrijen niet overvoerd worden.

Virtualisatie: IRQ's in VM's en op de hypervisor

In gevirtualiseerde opstellingen beheer ik de fysieke NIC-verdeling op de host en stel ik IRQ-balancering duidelijk. VM's krijgen genoeg vCPU's, maar ik vermijd blinde overcommitment zodat planningsvertragingen de latency niet verhogen. Moderne paravirtualised drivers zoals virtio-net of vmxnet3 bieden me de betere paden voor hoge pps-snelheden. Binnen de VM controleer ik opnieuw affiniteit en wachtrijtelling zodat de gast geen bottleneck wordt. Het is cruciaal om een consistent beeld te hebben van de host en de gast zodat het volledige gegevenspad Echt.

Diepere virtualisatie: SR-IOV, vhost en OVS

Voor zeer hoge pps-snelheden gebruik ik de hypervisor SR-IOVIk bind virtuele functies (VF's) van de fysieke NIC direct aan VM's en pin ze vast aan kernen van de juiste NUMA-knooppunten. Dit omzeilt delen van de host stack en vermindert latency. Waar SR-IOV niet past, besteed ik aandacht aan vhost-net en pin de vhost threads zoals applicatiewerkers en IRQ cores zodat er geen cross-NUMA jumps optreden. In overlay of switching opstellingen evalueer ik de extra kosten van Linux bridge of OVS; voor extreme profielen gebruik ik alleen OVS-DPDK als de operationele inspanning het meetbare voordeel rechtvaardigt. Hetzelfde geldt hier: ik meet pps, latency en CPU-verdeling voordat ik beslissingen neem, niet achteraf.

Drukke polling en gebruikersruimte tuning

Voor latentiekritieke diensten Bezig met polling de jitter verminderen. Ik activeer het volgende als test sysctl -w net.core.busy_read=50 en net.core.busy_poll=50 (microseconden) en stel de socketoptie SO_BUSY_POLL selectief voor betrokken sockets. De gebruikersruimte peilt dan kort voor het blokkeren en vangt pakketten op voordat ze dieper in de wachtrijen terecht komen. Dit kost CPU-tijd, maar levert vaak stabielere p99 latencies op. Ik houd de waarden laag, monitor het core gebruik en combineer busy polling alleen met duidelijke thread affiniteit en een vaste CPU gouverneur, anders heffen de effecten elkaar op.

Kosten voor pakketfilter, Conntrack en eBPF in één oogopslag

Firewalling en NAT maken deel uit van het gegevenspad. Daarom controleer ik de nftables/iptables-regels en ruim ik dode regels of diepe ketens op. In drukke opstellingen pas ik de Conntrack tabelgrootte aan (nf_conntrack_max, hash bucket nummer) of deactiveer Conntrack specifiek voor stateless flows. Als eBPF-programma's (XDP, tc-BPF) worden gebruikt, meet ik hun runtimekosten per hook en geef ik prioriteit aan „early drop/redirect“ om dure paden te ontlasten. Een duidelijke verantwoordelijkheid is belangrijk: of de optimalisatie vindt plaats in de NIC offload, in het eBPF programma of in de klassieke stack - duplicatie verhoogt alleen de latentie.

CPU-isolatie en huishoudelijke cores

Voor absoluut deterministische latentie sla ik achtergrondwerk op Huishoudelijke CPU's uit. Kernelparameters zoals nohz_full=, rcu_nocbs= en irqaffiniteit= helpen om specifieke cores grotendeels vrij te houden van tick handling, RCU callbacks en externe IRQ's. Ik isoleer een set kernen voor applicatiewerkers en een andere voor IRQ's en softirq's; systeemservices en timers draaien op aparte kernen. Dit zorgt voor schone cacheprofielen en vermindert pre-emption effecten. Hyper-threading kan jitter verhogen in individuele gevallen; ik test of het uitschakelen ervan per core-paar de p99 latencies afvlakt voordat ik een globale beslissing neem.

Diagnostisch draaiboek en typische antipatronen

Wanneer er druppels of latentiepieken optreden, hanteer ik een gestructureerde aanpak: 1) /proc/onderbrekingen Controleer op ongelijkmatige verdeling. 2) ethtool -S bij RX/TX-dalingen, FIFO-fouten, rx_no_buffer_count controle. 3) /proc/net/softnet_stat naar „tijdsverschil" of "druppels“. 4) mpstat -P ALL en top voor ksoftirqd activiteit. 5) Toepassingsgegevens (aantal actieve verbindingen, heruitzendingen met ss -ti). Antipatronen die ik vermijd: enorme RX-ringen (verborgen congestie), het in het wilde weg in- en uitschakelen van offloads zonder meting, het mengen van vaste affiniteiten met agressieve irqbalance, of RPS en RSS tegelijkertijd zonder duidelijke doelarchitectuur. Elke verandering krijgt een meting voor/na vergelijking en een kort protocol.

Voorbeeldconcepten voor webhosting en API's

Klassieke webhostingserver

Voor veel kleine websites activeer ik irqbalans, Ik stel verschillende wachtrijen in en selecteer de prestatiegouverneur. Ik meet L7 latencies tijdens pieken en let op pps-pieken, die vooral optreden bij TLS en HTTP/2. Als hardwarewachtrijen niet voldoende zijn, voeg ik RPS toe voor extra distributie op softwareniveau. Deze aanpassing houdt de responstijden constant, zelfs als de algehele bezettingsgraad matig lijkt. Regelmatige controles van /proc/onderbrekingen Laat me zien of individuele kernen kantelen.

Hoog belaste reverse proxy of API-gateway

Voor frontends met een groot aantal verbindingen pin ik RX-wachtrijen fijnmazig vast op gedefinieerde kernen en plaats ik proxy-werkers op nabijgelegen kernen. Ik maak een bewuste keuze of irqbalance actief blijft of dat vaste pinning duidelijkere resultaten oplevert. Als er niet genoeg wachtrijen zijn, selecteer ik specifiek RPS/XPS en kalibreer ik Coalescing, om IRQ stormen te voorkomen. Op deze manier bereik ik een lage latency bij een zeer hoge pps-snelheid en houd ik de tail latencies onder controle. Documentatie van elke wijziging vergemakkelijkt latere audits en houdt het gedrag voorspelbaar.

Keuze van leverancier en hardwarecriteria

Ik let op NIC's met Multi-queue, betrouwbare latency in de backbone en up-to-date kernelversies van het platform. Een gebalanceerde CPU-topologie en een duidelijke NUMA-scheiding voorkomen dat netwerkinterrupts in afgelegen geheugenzones terechtkomen. Voor projecten met hoge pps-percentages honoreert de keuze van de infrastructuur elk uur tuning omdat de hardware reserves levert. In praktische vergelijkingen heb ik goed gewerkt met providers die prestatieprofielen openbaar maken en IRQ-vriendelijke standaardinstellingen bieden, zoals providers als webhoster.de. Met dergelijke opstellingen kan ik IRQ-balancing, RSS en affiniteit effectief gebruiken en de responstijden minimaliseren. eng om vast te houden.

Stap-voor-stap procedure voor je eigen afstemming

Stap 1: Ik bepaal de huidige status met iperf3, sar, mpstat, nstat en ethtool -S, zodat ik duidelijke beginwaarden heb. Stap 2: Als irqbalance niet draait, activeer ik de service, wacht onder belasting en vergelijk latency, pps en drops. Stap 3: Ik pas het wachtrijnummer en de RSS-configuratie aan de kernen van het bijbehorende NUMA-knooppunt aan. Stap 4: Ik stel de CPU-governor in op „performance“ en wijs centrale services toe aan de juiste cores. Stap 5: Pas daarna pas ik handmatige affiniteit en NUMA pinning aan als de gemeten waarden nog steeds bottlenecks laten zien. Stap 6: Ik controleer trends in de loop van dagen om pieken in evenementen, back-ups of marketingpieken betrouwbaar te kunnen categoriseren.

Kort samengevat

Effectief IRQ-balancering verdeelt netwerkwerk over geschikte cores, vermindert latencies en voorkomt drops bij hoge pps-snelheden. In combinatie met multi-queue NIC's, RSS/RPS, een geschikte CPU-governor en schone thread affiniteit, maak ik op een betrouwbare manier gebruik van de net stack. Gemeten waarden van ethtool -S, nstat, sar en iperf3 me stap voor stap naar mijn doel leiden in plaats van in het duister te tasten. Als je nadenkt over NUMA topologie, IRQ pinning en plaatsing van applicaties samen, dan kun je reactietijden tot een minimum beperken. laag - zelfs tijdens piekbelastingen. Dit betekent dat hosting met hoge belasting merkbaar responsief blijft zonder onnodige CPU-reserves te verbranden.

Huidige artikelen