When data is scattered all over memory, the CPU has to go all the way out to slow RAM and wait every time.
Why Objects scattered behind pointers and accessed in no particular order → Effect Data isn’t in the CPU cache, so every read goes to RAM (roughly 100 times slower) → On screen The same work costs several times more tick time; in bad cases, slow motion
Lay out data that is used together contiguously (data-oriented design).
On the graph
Always high · Tick time, CPU utilization
Where to look
Attach perf stat -d -p PID to the game server process to measure instructions per cycle (insn per cycle) and L1/LLC cache misses, and view them alongside tick time and CPU utilization
Confirmed if
CPU stays busy, but insn per cycle is low and LLC misses are high. Confirmed if a build with a changed data layout cuts tick time sharply at the same player count
Ruled out if
Low CPU utilization but slow ticks: a cause that waits outside the CPU, such as locks or I/O waits