Eliminating Choke on Your Server (sv_maxupdaterate Math)

May 21, 2025 Daemon666 8 min read 1 Aufrufe

Choke is the single most misdiagnosed netcode symptom in CS 1.6. When players see the yellow choke counter climb on net_graph 3, it does not mean their connection is bad — it means your server could not send updates as fast as their client asked for them. Choke is a server-side back-pressure signal, and it is governed by a small set of cvars whose math is worth getting exactly right.

1. Understand the update contract

Each client requests a snapshot rate with cl_updaterate (how many world updates per second it wants) and cl_cmdrate (how many command packets it sends up). The server answers with at most sv_maxupdaterate updates per second, and each update is capped in size by sv_maxrate bytes/sec. Choke appears when the client asks for more updates than the server is configured — or able — to emit. If a client sets cl_updaterate 101 but you run sv_maxupdaterate 60, the client is silently capped at 60 and the difference registers as choke on its net_graph.

2. Set the server ceiling correctly

The core fix is raising the server's update ceiling and its rate ceiling together. On a modern ReHLDS box:

sv_maxupdaterate 100
sv_minupdaterate 20
sv_maxrate 25000
sv_minrate 5000

Raising sv_maxupdaterate to 100 or 101 lets clients that request high update rates actually receive them. sv_maxrate 25000 gives each client enough bytes/sec headroom that a full snapshot fits without being truncated. Setting sv_minrate 5000 floors low-rate clients so they stop starving. See recommended maxrate/maxupdaterate values for the full table.

3. The math that actually matters

Choke is not just a cvar mismatch — it is also a physics limit. The server can only send an update on a frame boundary. If your server runs at 100 fps, it produces at most 100 frames per second, so it can emit at most 100 updates per second no matter what sv_maxupdaterate says. This is the link people miss: sv_maxupdaterate is a ceiling, server fps is the engine. To deliver 100 updates/sec you must run a stable ~1000 fps server (or at minimum a rock-solid 100), because a server dipping to 40 fps under load can only send 40 updates/sec and every high-rate client chokes. Confirm your real fps with the console and the guide at measuring server fps:

stats

The fps column must comfortably exceed your sv_maxupdaterate. If it does not, fix fps first — see stable 1000 fps and the sys_ticrate truth.

4. Size sv_maxrate against player count

Each update carries entity deltas; the more players and entities, the larger each snapshot. With sv_maxrate too low, the update does not fit the byte budget, gets split, and the client chokes waiting for the rest. As a rough guide, 25000 comfortably covers a full 20–24 player server; a busy 32-slot server benefits from 30000 or higher, or 0 (unlimited) on a well-provisioned ReHLDS box where you trust bandwidth. Do not set unlimited on a bandwidth-constrained VPS — you will trade choke for loss.

5. Push clients toward matching rates

You can floor client behaviour but not force it. Advise your players to run:

cl_updaterate 100
cl_cmdrate 100
rate 25000

and point them at the best client rates guide. On ReHLDS, the ReHLDS performance cvars add tuning that reduces jitter further.

Common errors

  • Yellow choke climbs even on a LAN — server fps is below sv_maxupdaterate. The engine cannot emit updates it never rendered. Fix fps.
  • Choke only on full serversv_maxrate too low for the snapshot size at high player counts. Raise it.
  • Client sets cl_updaterate 101 but net_graph shows ~60 updatessv_maxupdaterate is capping them at 60. Raise the server ceiling.
  • Choke swaps to loss when you raise sv_maxrate — you exceeded real bandwidth; the packets now drop instead of queue. Balance the two.
  • Config looks right but choke persists — an AMXX config or game.cfg re-sets the cvars after server.cfg. Trace execution order and read the values back.

Verification

Join your own server and open net_graph 3. The choke counter should read 0 under normal play with a client running cl_updaterate 100. Read the ceilings back in the console:

sv_maxupdaterate
sv_maxrate
stats

Confirm sv_maxupdaterate is 100/101, sv_maxrate is at least 25000, and the fps from stats is above your updaterate with a full server. If choke only appears at peak population, walk the choke and loss on the scoreboard guide, which covers the same signals as they show up mid-match.

Mitwirkende: Daemon666 ✦
Teilen: