Let the fan settle downward on a re-assert

A symmetric deadband catches the fan on the way up and holds it there:
on iz-pve0 under load, 17 of 20 samples ran at 38% while the curve
wanted 34-36%, and nothing would bring it down until the request fell a
full 8 points. Damping was turning into a permanently louder machine.

A re-assert may now settle the speed downward to the current request.
Upward moves still require a full deadband crossing, so the drift this
was built to prevent cannot come back - covered by a test.

Verified under a live migration: settled 38 -> 36 on the first
re-assert, then one change in ten minutes while the request wandered
36-42, CPU stable at 66-69c and disks a degree cooler.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Zeb Hering
2026-08-28 22:33:38 -07:00
parent be440e95a3
commit 4dffbb070c
3 changed files with 39 additions and 5 deletions

View File

@@ -32,6 +32,13 @@ settle — measurably worse than stock. Measured on iz-pve0: stock iDRAC held on
minutes off the same signal. A request for full speed is never held back, and the held
value is re-pushed every `FAN_REASSERT_INTERVAL` in case the BMC forgets it.
A deadband alone makes a machine permanently louder: it catches the fan on the way up and
then nothing brings it down until the request falls a full deadband. Measured on `iz-pve0`
under load, 17 of 20 samples ran at 38% while the curve wanted 34-36%. So a re-assert -
and only a re-assert - is allowed to settle the speed **downward** to what is actually
wanted. Upward moves still need a full deadband crossing, which is what stops this
reintroducing the drift it was built to prevent.
Note that iDRAC's own profile regulates to a target *RPM* (closed loop, rock steady),
while manual control sets a *PWM* percentage (open loop, so measured RPM still wanders a
percent or two at a fixed setpoint). That residual is inherent to manual control, not