Packets reach the server but get dropped, because the NIC’s ring buffer (which briefly holds arriving packets) overflows or the kernel cores that handle receive processing are saturated.
Why A surge of players, interrupts piled on one core, CPU steal on a virtual machine, or an overloaded virtual switch → Effect Drops at the ring buffer (rx_missed_errors and similar; the name varies by driver) or at the kernel receive queue (softnet dropped) → On screen When crowds gather, input registers late and hitches hit the whole server at once
Add drop counters such as rx_missed_errors in ethtool -S and dropped in /proc/net/softnet_stat to monitoring, enlarge ring buffers (ethtool -G), spread RSS and interrupts across multiple cores, keep the game thread and receive-processing cores separate, keep CPU headroom, and on virtual machines check CPU steal and virtual switch load.
Ballpark numbers
Packets the server drops on receive are resent by the client. So they barely show up in the server’s retransmission metrics and appear first in drop counters such as rx_missed_errors in ethtool -S (the name varies by driver) and in dropped in /proc/net/softnet_stat.
On the graph
Hits a ceiling · softirq utilization per core, NIC drop counters
Where to look
Drop counters in ethtool -S (rx_missed_errors and similar; on mlx5, rx_out_of_buffer and rx_discards_phy), missed in ip -s -s link, and the 2nd column (dropped) and 3rd column (time_squeeze) of /proc/net/softnet_stat, plus %soft (softirq processing) per core from mpstat -P ALL. On virtual machines, %steal too
Confirmed if
Drop counters or softnet dropped rise when crowds gather, and %soft on the receive-processing cores sits near 100% and can’t go higher. Input slows on every connection to that server at the same time
Ruled out if
Server drop counters flat while retransmissions concentrate on connections from a specific region or ISP: loss on the path. When the path loses packets the server sent, the server’s nstat TcpRetransSegs rises while these counters stay flat
Check with
Infra tools (no game code needed)
Sources
Interface statisticsLinux kernel rx_missed_errors counts packets the host missed because no buffer was available (counted into drop in /proc/net/dev); check with ip -s -s link
Ethtool countersLinux kernel The mlx5 driver’s rx_out_of_buffer (no buffer in the receive queue) and rx_discards_phy (dropped for lack of port buffer)
net/core/net-procfs.cLinux kernel /proc/net/softnet_stat has one line per CPU, in hex; the 2nd column is dropped and the 3rd is time_squeeze
Documentation for /proc/sys/net/Linux kernel netdev_max_backlog: limit of the receive queue that holds packets arriving faster than the kernel can process them
proc_stat(5) — Linux manual pageLinux man-pages steal in /proc/stat: time spent in other operating systems when running in a virtualized environment
mpstat(1) — Linux manual pagesysstat mpstat -P ALL shows per-core utilization; %soft is time spent servicing softirqs, and %steal is time spent waiting while the hypervisor serviced another virtual CPU
net/ipv4/proc.cLinux kernel TcpRetransSegs as shown by nstat (RetransSegs under Tcp)