In a design where a thread can’t do anything else while it waits on one socket, everything slows down as the player count grows.
Why Each connection waits on its own reads and writes → Effect A delay on one connection spreads to the other connections on the same thread → On screen As concurrent users grow, everyone gets slow motion and input lag
Move to asynchronous I/O based on epoll, IOCP, or io_uring.
On the graph
Rises with load · Response time, thread count
Where to look
Game server thread count and per-thread voluntary context switches (cswch/s, times a thread stopped to wait for a resource) from pidstat -w -t, compared with response time as concurrent users grow
Confirmed if
Response time climbs steeply as concurrent users grow, and most of the threads (one per connection) show many voluntary switches while barely using CPU (waiting on sockets)
Ruled out if
Threads use CPU continuously without waiting: compute overload (“Tick overrun”)
I/O Completion PortsMicrosoft The Windows approach of handling many asynchronous I/Os with a pre-created thread pool
pidstat(1) — Linux manual pagesysstat cswch/s in -w: voluntary context switches where the task stopped on its own to wait for a resource; -t shows them per thread