한국어English日本語简体中文繁體中文DeutschไทยTiếng ViệtРусскийPortuguês (Brasil)EspañolBahasa Indonesia

Game Lag White Paper › L6 Server network card

NIC interrupts concentrated on one core Single-queue NIC / no RSS

Cause ID nic-irq · Primary owner Infra team (Server infrastructure)

Open the interactive card with figures and simulations →

If the NIC sends every packet-arrival interrupt to a single CPU core, that core becomes the bottleneck.

Why A single receive queue, or RSS (which spreads packets across cores) turned off → Effect One core hits 100% and can’t pull packets off in time → On screen Packet loss and latency across the whole server when players crowd in (teleporting, input lag)

Symptoms
Teleporting, Rubber-banding, Input lag
Factors
Packet loss, Latency
Who’s affected
Whole server
When
When crowds gather
Owner
Primary owner Infra team (Server infrastructure)
Infra team action items
Configure RSS (spreading by the NIC) and RPS (spreading by the kernel), spread interrupts across several cores, make UDP queue selection include ports (rx-flow-hash udp4 sdfn in ethtool -N), keep interrupt-handling cores separate from the game tick thread’s cores, watch %soft per core.
Ballpark numbers
One core can push roughly hundreds of thousands of packets per second through the kernel, depending on packet size and settings. If per-core utilization shows receive processing (%soft in mpstat) piled onto a single core, this is what’s happening.
On the graph
Hits a ceiling · %soft per core, packets received per second
Where to look
Check %soft (share of time spent on software interrupts) per core with mpstat -P ALL 1, which core each NIC queue’s interrupts go to in /proc/interrupts, the number of queues with ethtool -l, and packets per queue with ethtool -S (names vary by driver)
Confirmed if
One core’s %soft sits near 100% while the rest are idle, and interrupts and packets pile into one queue. From then on, packets received per second can’t climb any higher
Ruled out if
%soft spread evenly across cores: not this cause. CPU idle but loss present: “Cloud PPS limit exceeded” or “Ring buffer too small”
Check with
Infra tools (no game code needed)
Learn more
Even with multiple queues, if most traffic comes from a handful of addresses, such as gateways or proxies, it all lands in one queue. For UDP, some NICs pick the queue from addresses only by default, and traffic spreads evenly only after you change that to include ports.

Sources

  1. Scaling in the Linux Networking Stack Linux kernel
    RSS (the NIC spreads packets across multiple receive queues) and RPS (the kernel spreads them), giving each queue its own interrupt and spreading those across cores; RSS is recommended when receive interrupt handling is the bottleneck
  2. How to receive a million packets per second Cloudflare
    Measurements where a receive queue served by a single core topped out at about 350,000–430,000 packets per second; a case where the NIC hashed UDP by IP address only and everything piled into one queue
  3. ethtool(8) — Linux manual page ethtool
    The ethtool -N rx-flow-hash udp4 option that adds ports (f and n) to the UDP hash
  4. mpstat(1) — Linux manual page sysstat
    %soft: share of CPU time spent handling software interrupts; per core with -P ALL

See also

Same layer: L6 Server network card

Same symptom (Teleporting), other layers

View the interactive card with figures and simulations