Back in late 2022 when I built my current desktop computer, I opted for a mini-ITX case rather than the typical huge ATX case. I’d been interested in liquid cooling for a long time, and for such a small case, it seemed like the best fit. Liquid cooling promises superior cooling performance, quieter operation, and is better suited for compact builds which lack space for high air flow rate.
Things didn’t work out that well: my PC has been quite noisy, and I had suspicions of thermal throttling, but never made the time to properly gather data and study the situation. Until today.
While I built this setup, I carried over a lot of my knowledge in building air-cooled systems. The water block’s radiator sat at the front of the case, the fans immediately behind it pushing air forward, with the intent of pushing out hot air through the front (and pulling air in through the back) and ensuring good air flow through the radiator.
Gathering data
I collected data using watch sensors to follow the current CPU temperature,
and watch liquidctl -m NZXT status for the current coolant temperature and
pump duty.
The CPU quickly spikes to nearly 100°, and the coolant temperature also increases consistently. After a couple of minutes, the coolant was at 45°, and then 55°.
It wasn’t obvious to me, but it turns out that this indicates two things: (1) the dissipation block is well attached to the CPU and there’s good thermal conductivity, and (2) the radiator block can’t cool coolant fast enough. I.e.: don’t even bother checking thermal paste, it’s fine and it’s not the issue.
I also discovered that, while fan speed is auto-regulated, the coolant pump
always runs at a fixed speed unless told otherwise. I set the pump to run at
100% with liquidctl -m NZXT set pump speed 100, but that yielded no change
whatsoever.
I used turbostat --show PkgWatt,PkgTmp --interval 5 to monitor power
consumption. Within minutes, power usage drops to under 50% as temperature goes
up, indicating massive thermal throttling.
Cooling a radiator
Without finding any useful insight online and lacking a clear direction, I threw all the data I had to an LLM and requested suggestions. The first suggestions was to flip fan direction: pull fresh air from outside through the radiator and into the case. This didn’t sound right to me; the air would be warmed by the radiator and then flow into the case.
I discussed the topic with my dad for about an hour, and I gradually became convinced of the suggestion, despite him not being aligned: The CPU dissipates into the coolant block, so hotter air doesn’t affect it as much as warm coolant. The priority is cooling the radiator, not the air inside. Pushing air inside the case also increases pressure, forcing continuous air flow. And the air from the radiator won’t be any hotter than the coolant (e.g.: 30–40°), so still much cooler than the CPU itself.
I dismantled the case and changed the direction of the fans.
The results were extremely impressive.
As I ran the initial tests, it was immediately obvious that the fans weren’t as
loud during a stress test. This might have simply been due to airflow direction,
but checking the PkgWatt,PkgTmp parameters as before indicates insignificant
thermal throttling, although the CPU temperature was still near 100°.
I maxed the pump speed with liquidctl -m NZXT set pump speed 100, and this
time there was a very obvious effect. CPU and coolant temperature both remained
much lower (the CPU not even reaching 90° any more). The limiting factor was no
longer the radiator, and increasing pump duty now does have an effect.
I dislike the idea of running the pump at 100% permanently, so did some extra stress tests with various values, and found a set of values that keep pump duty low while avoiding ever going near 90°:
liquidctl -m NZXT set pump speed 20 30 28 60 33 100
These are pairs of values:
- When the coolant is 20° run at 30%.
- When it’s at 28° run at 60%.
- When it reaches 33° run at 100%.
These values are converted into a linear series, so 30° is some value between 60% and 100%.
liquidctl doesn’t run in the background: it configures the pump to react to
these values and quits. Ideally, the pump would be adjusted based on CPU
temperature too, but that would require implementing some (not very complicated)
code. I might do this eventually. Honestly, these values might need review. A
hot summer day when it’s 33° might affect force the pump to run higher than
necessary, but that’s only twice or thrice a year here in the Netherlands
anyway.
The values sent to the pump by liquidctl are lost when the system is power
cycled, the pump returning to its default 30% afterwards. I configured a system
service that runs that command again at start-up.
Conclusion
I’m delighted with the dramatically reduced noise level. Even some games that used to pin the fans at max speed now don’t even trigger them!
Don’t assume that experience in air cooling translates clearly to liquid cooling. Don’t procrastinate gathering data and analysing it. Use the tools mentioned above as a great starting point!
And, most important of all, remember that a radiator only cares about the temperature of the air flowing through it.