Making a 400G Switch Quieter: What Actually Works on the CRS804
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
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.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.
| Sensor | Stock value | Comment |
|---|---|---|
| switch-temperature | 57–58 °C | The 98DX7335. This is what drives the fans. |
| cpu-temperature | 48 °C | Not the problem. |
| board-temperature1 | 28–30 °C | Effectively the room. Drifts 3 °C over a day. |
| fan1-speed / fan2-speed | 8,400 RPM | Two 40 mm cartridges, up to ~16,100 RPM. |
| psu2-fan-speed | 5,872–6,408 RPM | Load-independent in this range. A noise floor. |
| psu2-power | 46 W | Idle 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 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:
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:
- Question 1 is checked first, so 65 °C always wins. At a 65 °C target the quiet equilibrium sits exactly on that boundary — the loop reaches question 1 every cycle and re-trips. At 63 °C it settles into "hold" and stays there.
- Which is why 5 s helps. It is not a quieter speed, it is question 1 being asked six times as often, so a spike is caught and answered before it becomes a full-speed minute.
- "Fans loud while the chip is cool" is just question 3 working. After a trip the chip is at 54 °C with the fans still high: it takes minutes of "slow down one step" to get back. That is the forum's inverse-temperature bug, and the plateau that fooled me — the step-down visibly stalls while the temperature catches up.
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.
| Elapsed | Chip | Fan | What happened |
|---|---|---|---|
| 0:00 | 58 °C | 8,400 | baseline |
| 0:40 | 58 °C | 6,900 | controller starts shedding RPM |
| 4:00 | 60 °C | 5,130 | quiet, and the chip is still climbing |
| 6:00 | 63 °C | 5,130 | equilibrium is above the trip, not below it |
| 8:00 | 65 °C | 15,960 | trip hit, fans slam to maximum |
| 8:00–16:00 | 65 → 53 °C | 15,960 → 12,000 | very 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.
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:
- The airflow does not add up. An NF-A4x20 PWM is 5.53 CFM and 2.26 mm H₂O at its 5,000 RPM maximum. The stock cartridge fans top out around 16,100 RPM. The Noctua's maximum is less air than the stock fan moving at roughly half speed.
- Half speed is already too hot. The measured curve says 5,100 RPM-equivalent puts this chip at 65 °C at idle 46 W. A replacement with less airflow than that does not have a passing operating point at 200G on eight legs.
- Different chassis, different module. CRS518/CCR2216 have four fans and more depth. The CRS804's cartridges are a different part (MT-HotSwapFan-V2), and no owner-documented conversion of the V2 exists. The older module's pinout is a hypothesis here, not a fact.
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".
| Option | Cost | Effort | Expected | Risk |
|---|---|---|---|---|
| Rack airflow and vibration isolation: clear the intake, drop room ambient, isolate the wire deck | under $20 | 15 min | 2–5 °C off the chip, maybe 10–15% RPM | none |
| Fan curve (done) | $0 | one line | 20% 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–40 | design, two prints, bench test | 3–4× the airflow of stock at ~1,200 RPM | tach mismatch may raise a fan fault; must validate at load |
| 40 mm Noctua in the stock cartridges | ~$50 | 1 h | a few dB if it cools — probably does not | thermal |
| Move the switch to a closet or garage on active optical breakouts | $400–1,200 | recable | silence at the source | cost; passive DAC will not reach |
| Swapping the PSU fan | — | — | removes the ~6,000 RPM floor | do 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
- Measured: every temperature, RPM and watt figure above, read from
/system/healthon the live switch on October 22, 2026, sampled at 10 s over runs of 3–5 minutes per setting. Scripted on-device auto-reverts (a RouterOS scheduler) bounded the experiments; the final state was verified against stock settings. - Estimated, not measured: the dB(A) figures. There is no calibrated meter here, so 3–4 dB(A) comes from RPM scaling for axial fans, not from a microphone. Treat it as "clearly quieter", not as a spec.
- Not measured: full-load temperatures. All of this is idle at 46 W against a 92 W typical / 123 W max rating. Any fan change has to be validated with an eight-leg NCCL run, not with an idle box.
- Not claimed: that a Noctua swap fails — that is a prediction from the measured curve, and the spare cartridge exists precisely to test it.
Credits
- MikroTik: the CRS804-4DDQ-hRM manual (98DX7335, 92/123 W, two MT-HotSwapFan-V2 cartridges) and the RouterOS health and fan-control documentation, including the list of boards that do get manual fan control.
- The MikroTik forum thread "MikroTik CRS804 - FANS LOUD!", where owners of this switch (and the CRS812, same chip) reported the same 15,800 RPM-at-cold-silicon behaviour and the 65 °C cap. Their reports framed the experiment; the numbers here are from this unit.
- ServeTheHome forums, the CRS518 / CCR2216 Noctua conversion thread: the ribbon pinout, the M3×25 detail, and the 57 → 53.8 dB(A) result.
- Noctua, NF-A4x20 PWM (5.53 CFM, 2.26 mm H₂O, 5,000 RPM) and NF-A9 PWM (41 CFM at 2,000 RPM) specifications.
- Alex Ellis, switched-alternatives notes on the CRS line: the
fan-target-templever and the Noctua-swap tradition.