In continue to NOHZ_FULL and cpu isolation.
As stated in the "CPU Isolation Introduction" guide, 1 or 2 cores should be left in each CCX for doing "housekeeping" workload.
By default, core 0 will always be reserved, even if I pass boot.kernelParams ["nohz_full=0-11"]
for example.
We probably want to make sure that CPU "bottlenecked" games use only CPU cores ("physical" probably?) that reside on one CCX.
Why? Because we want to avoid latency penalty because of communication between two CCX.
My AMD 5900 CPU has two CCX.
Windows gamers nuking one CCX in order to get more FPS in CS:GO. Here results of one reddit user ( I didn't verify this claims ):
CS Replay Demo FPS Data
CCD | 99% Percentile | Average FPS | 1% Percentile FPS |
---|---|---|---|
CCD1 | 525 | 280 | 183 |
CCD2 | 458 | 246 | 163 |
I don't care about 99% Percentile fps. What matter more, is "framerate stability" and 1% Percentile FPS.
In theory, we can achieve the ~same result without nuking the whole CCX by following these steps:
- Isolate a few CPU cores for only one task (e.g., the game).
- Set these cores in nohz_full mode. I probably can set all CPU cores in
nohz_full mode
, except 1 or 2 on each CCX. Should I leave hyperthreading cores in "normal" mode? - Ensure the CPU cores reside on one CCX.
- Apply proper task affinity to make sure no applications can use/jump on these cores except for the game itself when I need it.
First, let's visualize cpu itself.
lstopo-no-graphics --no-factorize --of txt
My lstop output
┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
│ Machine (63GB total) │
│ │
│ ┌──────────────────────────────────────────────────────────────────────────────────────────────────────┐ ├┤╶─┬─────┼┤╶───────┬───────────────────┐ │
│ │ Package L#0 │ │7.9 7.9 │ PCI 01:00.0 │ │
│ │ │ │ │ │ │
│ │ ┌──────────────────────────────────────────────────────────────────────────────────────────────────┐ │ │ │ ┌───────────────┐ │ │
│ │ │ NUMANode L#0 P#0 (63GB) │ │ │ │ │ Block nvme1n1 │ │ │
│ │ └──────────────────────────────────────────────────────────────────────────────────────────────────┘ │ │ │ │ │ │ │
│ │ │ │ │ │ 1907 GB │ │ │
│ │ ┌──────────────────────────────────────────────────────────────────────────────────────────────────┐ │ │ │ └───────────────┘ │ │
│ │ │ L3 (32MB) │ │ │ └───────────────────┘ │
│ │ └──────────────────────────────────────────────────────────────────────────────────────────────────┘ │ │ │
│ │ │ ├─────┼┤╶───────┼┤╶─┬─────┼┤╶───────┬───────────────────┐ │
│ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ │7.9 7.9 │7.9 7.9 │ PCI 04:00.0 │ │
│ │ │ L2 (512KB) │ │ L2 (512KB) │ │ L2 (512KB) │ │ L2 (512KB) │ │ L2 (512KB) │ │ L2 (512KB) │ │ │ │ │ │ │
│ │ └─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘ │ │ │ │ ┌───────────────┐ │ │
│ │ │ │ │ │ │ Block nvme0n1 │ │ │
│ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ │ │ │ │ │ │ │
│ │ │ L1d (32KB) │ │ L1d (32KB) │ │ L1d (32KB) │ │ L1d (32KB) │ │ L1d (32KB) │ │ L1d (32KB) │ │ │ │ │ │ 1863 GB │ │ │
│ │ └─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘ │ │ │ │ └───────────────┘ │ │
│ │ │ │ │ └───────────────────┘ │
│ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ │ │ │
│ │ │ L1i (32KB) │ │ L1i (32KB) │ │ L1i (32KB) │ │ L1i (32KB) │ │ L1i (32KB) │ │ L1i (32KB) │ │ │ ├─────┼┤╶───────┬────────────────┐ │
│ │ └─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘ │ │ │0.6 0.6 │ PCI 05:00.0 │ │
│ │ │ │ │ │ │ │
│ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ │ │ │ ┌────────────┐ │ │
│ │ │ Core L#0 │ │ Core L#1 │ │ Core L#2 │ │ Core L#3 │ │ Core L#4 │ │ Core L#5 │ │ │ │ │ │ Net enp5s0 │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ └────────────┘ │ │
│ │ │ ┌─────────┐ │ │ ┌─────────┐ │ │ ┌─────────┐ │ │ ┌─────────┐ │ │ ┌─────────┐ │ │ ┌─────────┐ │ │ │ │ └────────────────┘ │
│ │ │ │ PU L#0 │ │ │ │ PU L#2 │ │ │ │ PU L#4 │ │ │ │ PU L#6 │ │ │ │ PU L#8 │ │ │ │ PU L#10 │ │ │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├─────┼┤╶───────┬────────────────┐ │
│ │ │ │ P#0 │ │ │ │ P#1 │ │ │ │ P#2 │ │ │ │ P#3 │ │ │ │ P#4 │ │ │ │ P#5 │ │ │ │ │0.6 0.6 │ PCI 06:00.0 │ │
│ │ │ └─────────┘ │ │ └─────────┘ │ │ └─────────┘ │ │ └─────────┘ │ │ └─────────┘ │ │ └─────────┘ │ │ │ │ │ │ │
│ │ │ ┌─────────┐ │ │ ┌─────────┐ │ │ ┌─────────┐ │ │ ┌─────────┐ │ │ ┌─────────┐ │ │ ┌─────────┐ │ │ │ │ │ ┌────────────┐ │ │
│ │ │ │ PU L#1 │ │ │ │ PU L#3 │ │ │ │ PU L#5 │ │ │ │ PU L#7 │ │ │ │ PU L#9 │ │ │ │ PU L#11 │ │ │ │ │ │ │ Net wlp6s0 │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ └────────────┘ │ │
│ │ │ │ P#12 │ │ │ │ P#13 │ │ │ │ P#14 │ │ │ │ P#15 │ │ │ │ P#16 │ │ │ │ P#17 │ │ │ │ │ └────────────────┘ │
│ │ │ └─────────┘ │ │ └─────────┘ │ │ └─────────┘ │ │ └─────────┘ │ │ └─────────┘ │ │ └─────────┘ │ │ │ │ │
│ │ └─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘ │ │ ├─────┼┤╶───────┬────────────────┐ │
│ │ │ │ │0.2 0.2 │ PCI 07:00.0 │ │
│ │ ┌──────────────────────────────────────────────────────────────────────────────────────────────────┐ │ │ │ │ │ │
│ │ │ L3 (32MB) │ │ │ │ │ ┌────────────┐ │ │
│ │ └──────────────────────────────────────────────────────────────────────────────────────────────────┘ │ │ │ │ │ Net enp7s0 │ │ │
│ │ │ │ │ │ └────────────┘ │ │
│ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ │ │ └────────────────┘ │
│ │ │ L2 (512KB) │ │ L2 (512KB) │ │ L2 (512KB) │ │ L2 (512KB) │ │ L2 (512KB) │ │ L2 (512KB) │ │ │ │ │
│ │ └─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘ │ │ ├─────┼┤╶───────┬─────────────┐ │
│ │ │ │ │32 32 │ PCI 09:00.0 │ │
│ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ │ │ └─────────────┘ │
│ │ │ L1d (32KB) │ │ L1d (32KB) │ │ L1d (32KB) │ │ L1d (32KB) │ │ L1d (32KB) │ │ L1d (32KB) │ │ │ │ │
│ │ └─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘ │ │ └─────┼┤╶───────┬─────────────┐ │
│ │ │ │ 32 32 │ PCI 0a:00.0 │ │
│ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ │ └─────────────┘ │
│ │ │ L1i (32KB) │ │ L1i (32KB) │ │ L1i (32KB) │ │ L1i (32KB) │ │ L1i (32KB) │ │ L1i (32KB) │ │ │ │
│ │ └─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘ │ └─────┼┤╶───────┬─────────────┐ │
│ │ │ 4.0 4.0 │ PCI 0b:00.0 │ │
│ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ └─────────────┘ │
│ │ │ Core L#6 │ │ Core L#7 │ │ Core L#8 │ │ Core L#9 │ │ Core L#10 │ │ Core L#11 │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ ┌─────────┐ │ │ ┌─────────┐ │ │ ┌─────────┐ │ │ ┌─────────┐ │ │ ┌─────────┐ │ │ ┌─────────┐ │ │ │
│ │ │ │ PU L#12 │ │ │ │ PU L#14 │ │ │ │ PU L#16 │ │ │ │ PU L#18 │ │ │ │ PU L#20 │ │ │ │ PU L#22 │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ P#6 │ │ │ │ P#7 │ │ │ │ P#8 │ │ │ │ P#9 │ │ │ │ P#10 │ │ │ │ P#11 │ │ │ │
│ │ │ └─────────┘ │ │ └─────────┘ │ │ └─────────┘ │ │ └─────────┘ │ │ └─────────┘ │ │ └─────────┘ │ │ │
│ │ │ ┌─────────┐ │ │ ┌─────────┐ │ │ ┌─────────┐ │ │ ┌─────────┐ │ │ ┌─────────┐ │ │ ┌─────────┐ │ │ │
│ │ │ │ PU L#13 │ │ │ │ PU L#15 │ │ │ │ PU L#17 │ │ │ │ PU L#19 │ │ │ │ PU L#21 │ │ │ │ PU L#23 │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ P#18 │ │ │ │ P#19 │ │ │ │ P#20 │ │ │ │ P#21 │ │ │ │ P#22 │ │ │ │ P#23 │ │ │ │
│ │ │ └─────────┘ │ │ └─────────┘ │ │ └─────────┘ │ │ └─────────┘ │ │ └─────────┘ │ │ └─────────┘ │ │ │
│ │ └─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘ │ │
│ └──────────────────────────────────────────────────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
│ Host: Nix │
│ │
│ Date: Sun 07 Jul 2024 01:25:26 PM +03 │
└─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
From output, we can see two CCX.
CCX0: P#0, P#1, P#2, P#3, P#4, P#5, P#12, P#13, P#14, P#15, P#16, P#17. P#12 is the hyperthreading core of P#0 and so on
CCX1: P#6, P#7, P#8, P#9, P#10, P#11, P#18, P#19, P#20, P#21, P#22, P#23.
Now, we need to isolate cores and run games on this isolated cores, and test obviosly.
Is it worth it?
I personally don't expect a big improvement, like I would get from "X3D" CPU, but still.
Note
AMD ****X3D CPUs are not affected by that because of big shared L3 cache for all cores. Double digits performance improvement compared to non-X3D CPUs in games (depends on the game). Building from source, for example, doesn't get such compile speed improvement at all.