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

Game Lag White Paper › Root causes of TCP retransmission

RTO settings that don’t fit the environment RTO min too low or too high

Cause ID rt-rto-setting · Primary owner Infra team (Server infrastructure) · Also Game team (Server development)

Open the interactive card with figures and simulations →

Set the RTO minimum too low and even small delays cause spurious retransmissions; leave the default (200 ms) and it’s too long for games, so every loss means a long freeze.

Why RTO minimum lowered sharply for data center use, or the default left as is on internet paths → Effect Too low: retransmission storms on momentary delays. Too high: a long wait on every loss → On screen At the default, each loss means a freeze of hundreds of ms then fast-forward; set too low, freezes get shorter, but spurious retransmissions surge and waste bandwidth

Symptoms
Freeze, Fast-forward, Input lag
Factors
Latency
Who’s affected
Whole server
When
Always
Owner
Primary owner Infra team (Server infrastructure) · Also Game team (Server development)
Game team action items
On Linux 6.15 and later, consider lowering the RTO cap for game connections with TCP_RTO_MAX_MS (this also shortens the time until the connection gives up, so set the disconnect detection time with TCP_USER_TIMEOUT alongside it), lower the RTO minimum only on internal server-to-server connections with the TCP_RTO_MIN_US socket option (6.15 and later), consider the TCP_THIN_LINEAR_TIMEOUTS socket option so that consecutive RTOs don’t double on game connections.
Infra team action items
Lower rto_min per route only for internal server-to-server connections, keep the default on internet paths and compensate with RACK-TLP and the thin stream setting (tcp_thin_linear_timeouts).
Ballpark numbers
Linux RTO = round-trip time + max(200 ms, RTT deviation × 4). It doubles on every failure, up to 120 seconds. On Linux 6.15 and later, TCP_RTO_MAX_MS can lower this cap to as little as 1 second.
On the graph
Always high · Per-connection RTO, spurious RTOs
Where to look
The server’s RTO minimum setting (rto_min in ip route show; on Linux 6.11 and later, sysctl net.ipv4.tcp_rto_min_us), rto and rtt in ss -ti, and deltas of nstat TcpExtTCPSpuriousRTOs
Confirmed if
On a server with a lowered minimum, rto on internet connections hugs rtt and TcpExtTCPSpuriousRTOs climbs sharply. At the default, rto on game connections sits 200 ms or more above rtt, and every loss freezes the game for that long
Ruled out if
rto follows the default calculation (about rtt + 200 ms) and spurious RTOs are few, yet freezes are unusually long: points to consecutive losses or the recovery method (“Slow recovery on thin streams,” “Middlebox strips TCP options”)
Check with
Infra tools (no game code needed)

Sources

  1. RFC 6298: Computing TCP's Retransmission Timer IETF
    RTO = SRTT + max(G, 4·RTTVAR), recommended minimum of 1 second, doubles on every failure, any maximum must be at least 60 seconds
  2. include/net/tcp.h Linux kernel
    Linux TCP_RTO_MIN 200 ms, TCP_RTO_MAX 120 seconds
  3. net/ipv4/tcp_input.c Linux kernel
    Linux RTO is SRTT + rttvar, and rttvar never goes below the RTO minimum (default 200 ms)
  4. tcp: add the ability to control max RTO Linux kernel
    Adds the TCP_RTO_MAX_MS socket option (1–120 seconds), from Linux 6.15
  5. tcp: add sysctl_tcp_rto_min_us Linux kernel
    Adds tcp_rto_min_us, the server-wide default RTO minimum, from Linux 6.11
  6. tcp: support TCP_RTO_MIN_US for set/getsockopt use Linux kernel
    Adds the TCP_RTO_MIN_US socket option to set the RTO minimum per socket, from Linux 6.15
  7. IP Sysctl Linux kernel
    tcp_rto_min_us defaults to 200000 (the route option rto_min and the socket option TCP_RTO_MIN_US take precedence), tcp_rto_max_ms 1,000–120,000 (default 120,000), tcp_thin_linear_timeouts
  8. ip-route(8) — Linux manual page iproute2
    Per-route rto_min option: the RTO minimum used when communicating with that destination
  9. Thin-streams and TCP Linux kernel
    TCP_THIN_LINEAR_TIMEOUTS can turn off exponential backoff for thin stream connections only
  10. tcp(7) — Linux manual page Linux man-pages
    TCP_USER_TIMEOUT: how long to wait for unacknowledged data before closing the connection
  11. ss(8) — Linux manual page iproute2
    rto (ms) and rtt in ss -i
  12. SNMP counter Linux kernel
    TcpExtTCPSpuriousRTOs: spurious RTOs detected by F-RTO

See also

Same layer: Root causes of TCP retransmission

Same symptom (Freeze), other layers

View the interactive card with figures and simulations