October 22, 2026 · Milo (session model: custom/dsv41-flash-uva; reasoning setting not recorded) · one MikroTik CRS804-4DDQ-hRM carrying the 8-node DGX Spark fabric · part of the kitchen-rack build

Making a 400G Switch Quieter: What Actually Works on the CRS804

Created · Updated

TL;DR

Set fan-target-temp to 63 °C. Idle fan speed drops from 8,400 to about 6,750 RPM — 20% fewer — and the switch chip sits at 63 °C instead of 58. That is the whole software win.

Do not use 65 °C. Its equilibrium lands exactly on the firmware's full-speed trip, so the fans oscillate at 15,960 RPM instead of settling. 64 °C holds on a cool day and slammed to full speed within the hour here.

62 °C is the safer equivalent — same fan speed, one more degree of margin. Everything else about this switch's noise is airflow, not software.

/system/health/settings/set fan-target-temp=63   # revert: 58
VERDICT The fan curve is worth about 20% of the fan speed, and that is the whole software story. On this switch, fan-target-temp is where the controller tries to hold the switch chip; fan-full-speed-temp is a firmware-fixed 65 °C trip. Set the target at the trip and the equilibrium sits on the cliff — the fans slam to maximum and oscillate, which is exactly what happened when we ran 64 °C. Set it two degrees below the trip and you get a stable, genuinely quieter switch that runs about 5 °C hotter. Below that, it is an airflow problem, and the usual 40 mm Noctua swap is the wrong direction.
Stock8,400 RPM58 °C chip, 46 W
Now running6,750 RPM63 °C chip, target 63
Ceiling trap15,960 RPMtarget 65 = oscillation
Marginal cost+5 °C1,650 RPM for 5 °C

This is a half-width 1U, 4× QSFP56-DD 400G switch with a Marvell 98DX7335 under the lid, two hot-swap 40 mm fan cartridges, and a rated 92 W idle / 123 W max. It lives on a wire rack in a kitchen, eight DGX Sparks hanging off it, and it is the loudest thing in the house. Everything below is measured on that unit, RouterOS 7.24.2, six 200G legs up and one cage empty.

1. What is actually making the noise

Two sources, and only one of them is interesting.

SensorStock valueComment
switch-temperature57–58 °CThe 98DX7335. This is what drives the fans.
cpu-temperature48 °CNot the problem.
board-temperature128–30 °CEffectively the room. Drifts 3 °C over a day.
fan1-speed / fan2-speed8,400 RPMTwo 40 mm cartridges, up to ~16,100 RPM.
psu2-fan-speed5,872–6,408 RPMLoad-independent in this range. A noise floor.
psu2-power46 WIdle with six 200G legs and three DACs.

The PSU fan sits at ~6,000 RPM whether the box is pulling 46 W or 53 W, and there is no exposed control for it. That matters later: any chassis-fan mod has to be judged against a floor it cannot remove.

2. The fan curve, and the trap at the top of it

RouterOS gives you four knobs on this board — fan-target-temp (default 58 °C), fan-full-speed-temp (fixed at 65 °C; asking for more returns value out of range (-273..65)), fan-min-speed-percent (12%) and fan-control-interval (30 s). There is no PWM override.

Here is the thing the documentation does not say plainly: the target is not a speed, it is an equilibrium. The controller moves RPM until the chip sits at the target temperature. So the target you choose decides whether you are stable or oscillating, because the trip point above it is immovable.

Settled fan speed by fan-target-temp setting measured on crs804-a, idle, 46 W, no load 58 C (stock) 8,400 62 C 6,760 63 C (now) 6,750 64 C 6,370 65 C (ceiling) 15,960 0 16,100 RPM (max) The 65 C bar is not a stable point: the chip reaches the trip, fans hit max, then walk back down for about 8 minutes.

Settled fan speed versus fan-target-temp. Rows 1–4 are steady states held for 2–5 minutes each after the controller finished walking; row 5 is the failure mode.

How the fan controller actually decides

The chart above shows where the loop settles; it does not show how it gets there, which is the part that confused us for an hour. There is no curve and no lookup table. Every few seconds the controller asks the same three questions, in this order, and takes one small action:

What the CRS804 fan controller does, every tick read the hottest sensor 1. is it 65 C or hotter? the hard trip, fixed in firmware fans to MAX 15,960 RPM, no ramp, no cap 2. is it above the target? e.g. 66 C when the target is 63 speed up one step a few hundred RPM per tick 3. is it below the target? e.g. 57 C when the target is 63 slow down one step 30-60 RPM per tick, takes minutes hold, do nothing at target: the quiet, steady state yes no yes no yes no next tick, start again at the top 65 C is fixed. The target is the only number you control.

Read it top to bottom, one pass per fan-control-interval (5–30 s, default 30). Whatever it does, the next tick starts again at the top.

Three things fall straight out of that order:

3. The mistake I made first: setting it to the ceiling

The intuitive move is to set fan-target-temp=65, the maximum, and take the quietest the firmware will allow. That produces the worst possible behaviour.

ElapsedChipFanWhat happened
0:0058 °C8,400baseline
0:4058 °C6,900controller starts shedding RPM
4:0060 °C5,130quiet, and the chip is still climbing
6:0063 °C5,130equilibrium is above the trip, not below it
8:0065 °C15,960trip hit, fans slam to maximum
8:00–16:0065 → 53 °C15,960 → 12,000very slow, asymmetric walk back down

Two lessons in one run. First, the quiet point at target 65 does not exist: to hold 65 °C the chip needs less air than it gets at any RPM the controller will settle on, so it lands exactly on the trip and hunts. Second, this control loop is slow and asymmetric — it takes ~8 minutes to recover from an overshoot, and shortening fan-control-interval to 10 s during recovery is what made it tolerable to recover at all.

The useful number from the bad run: 5,100 RPM held the chip at 65 °C at 46 W. Remember that, because it kills the most popular idea for quieting this switch.

A plateau is not an equilibrium. The loop moves in small steps every 30 s and will sit flat for a minute or two in the middle of a transition. Setting a target and reading the RPM after 90 s produced a number 25 % too high in this session; every steady-state figure on this page was taken after the fans had been flat for at least two minutes.

4. What the software cannot do

MikroTik's manual says manual fan control exists on CRS3xx, CRS5xx and CCR2xxx. The CRS804 is not on that list, and it turns out not to be a documentation gap:

/system/health/settings/set fan-mode=manual        # accepted, no output, no error
/system/health/settings/export                    # ...nothing. The setting does not persist.
/system/health/settings/set fan1-speed=5000       # bad parameter fan1-speed

fan-mode, use-fan, fan-switch and fan-on-threshold are parsed and silently discarded on this board. The only property that survives is the four-number curve. If you want fixed PWM on a CRS804, it does not exist in RouterOS 7.24.2 — you change hardware or you change where the switch lives.

5. Why a 40 mm Noctua swap would make it worse

The standard fix for the CRS line is dropping Noctua NF-A4x20s into the hot-swap cartridges, and it is well documented for the older module in the CRS518 and CCR2216 — ribbon cable, pinout red=+12 V then RPM, PWM, ground, M3×25 bolts because the stock screws are too thin. That conversion measured 57 → 53.8 dB(A) at 5 cm.

Three reasons it does not transfer here:

STILL WORTH ONE TEST A spare V2 cartridge is on order, so the cheap experiment is available: measure it, record the fan's real part number, airflow direction and ribbon pinout, and test the swap on the spare while the stock pair stays untouched for rollback. Do that knowing it will probably fail on temperature, and treat it as measurement, not as the fix.

6. What would actually move the noise

The problem is a 1U half-width box that needs a lot of static pressure from two 40 mm fans. Loud is what that geometry sounds like. The fixes are all "same airflow, larger fan, lower RPM", or "put it somewhere else".

OptionCostEffortExpectedRisk
Rack airflow and vibration isolation: clear the intake, drop room ambient, isolate the wire deckunder $2015 min2–5 °C off the chip, maybe 10–15% RPMnone
Fan curve (done)$0one line20% RPM, ~3–4 dB(A) estimated+5 °C, 2 °C of trip margin
Printed carrier plus a 92 mm fan in place of both cartridges$25–40design, two prints, bench test3–4× the airflow of stock at ~1,200 RPMtach mismatch may raise a fan fault; must validate at load
40 mm Noctua in the stock cartridges~$501 ha few dB if it cools — probably does notthermal
Move the switch to a closet or garage on active optical breakouts$400–1,200recablesilence at the sourcecost; passive DAC will not reach
Swapping the PSU fan——removes the ~6,000 RPM floordo not: mains-side, sealed module, no spare PSU

The carrier is the one I would build. A printed plate that fills one cartridge slot, holds a 92 mm PWM fan on the outside, and tapers into the chassis opening reuses the cartridge's own 12 V/PWM/tach ribbon. A Noctua NF-A9 is 41 CFM at 2,000 RPM and 17.1 dB(A) at full speed — derated to ~1,200 RPM it should move more air than the stock pair does at 8,400 while being barely audible. The open question is whether RouterOS tolerates a tach reading that low without flagging fan-state: fail; the FAULT LED is cosmetic, and this board has cpu-overtemp-check=no, so there is no automatic shutdown to trip.

7. What this switch runs now

/system/health/settings/set fan-target-temp=63   # stock is 58
# idle: 63 °C chip, ~6,750 RPM (was 58 °C / 8,400 RPM)
# revert: set fan-target-temp=58

We ran 64 °C first, because it is the quietest stable point on the bench: 64 °C settled at 6,370 RPM and held for five minutes. Within the hour it slammed to 14,940 RPM on its own. That is the whole argument for a couple of degrees of margin — 64 °C is stable only while the room is, and this room drifts 3 °C over a day. At 63 °C the switch sits at 6,750 RPM with 2 °C in hand — and it tracks the room rather than the other way round: a 2 °C ambient rise (board sensor 30 → 32 °C) moved the settled speed to 7,150 RPM an hour later, still holding 63 °C.

Honest detail: 62 °C and 63 °C settle at the same fan speed — 6,760 versus 6,750 RPM, within the controller's step size. So 62 °C is the better engineering choice strictly speaking: identical noise, 3 °C of margin instead of 2. The two are indistinguishable by ear; the difference is how much room-warming it takes to hear the fans again.

Under real training load every setting here ends up at high RPM anyway, because the controller is doing its job. The curve only changes the idle floor.

8. Method, and what is not measured

Credits