max / everycycle
1 file changed,
+132 insertions,
-21 deletions
| @@ -8,9 +8,17 @@ | |||
| 8 | 8 | ||
| 9 | 9 | ## What this machine is for, in priority order | |
| 10 | 10 | ||
| 11 | - | 1. **Always-on build host.** Alloy images and ISOs, the MNW build gate, Sando. The ecosystem | |
| 12 | - | has no always-on x86_64 machine: astra is always-on and aarch64, fw13 is x86_64 and sleeps, | |
| 13 | - | and production never builds binaries. | |
| 11 | + | 1. **Always-on build host, fire-and-forget.** Alloy images and ISOs, the MNW build gate, | |
| 12 | + | scheduled rebuilds. The ecosystem has no always-on x86_64 machine: astra is always-on and | |
| 13 | + | aarch64, fw13 is x86_64 and sleeps, and production never builds binaries. Nobody waits on | |
| 14 | + | this machine interactively — the edit/compile loop stays in Helix on fw13 — so it is sized | |
| 15 | + | for **throughput, not latency**. | |
| 16 | + | ||
| 17 | + | **Sando does not live here.** The original BOM assigned this box the Sando host role back | |
| 18 | + | when it was going to be one big always-on machine. That does not survive the box becoming | |
| 19 | + | a card-swapping bench: a production deploy controller should not share a chassis with | |
| 20 | + | unproven hardware, and a single non-redundant root NVMe makes it worse. Sando moves to | |
| 21 | + | **astra** — always-on, never opened, and arch-agnostic for a controller. | |
| 14 | 22 | 2. **The known-good control for testing used parts one at a time.** Every part here is new. | |
| 15 | 23 | That is the point: when a used Collection card misbehaves on the bench, the host is not a | |
| 16 | 24 | suspect. One variable at a time, against a reference that does not move. | |
| @@ -27,32 +35,70 @@ | |||
| 27 | 35 | ||
| 28 | 36 | | Component | Choice | Approx | Notes | | |
| 29 | 37 | |---|---|---|---| | |
| 30 | - | | CPU | **AMD EPYC 4565P** (16c/32t "Zen 5", AM5) | ~$700–800 | Up to 5.7 GHz. Chosen for single-thread: incremental `cargo` builds are latency-bound, and this beats a 32-core Milan at the thing done fifty times a day. 2× DDR5-5600, 28 PCIe Gen 5 lanes, 170 W class | | |
| 38 | + | | CPU | **AMD EPYC 4565P** (16c/32t "Zen 5", AM5) | ~$700–800 | 16 Zen 5 cores at high all-core clocks is competitive throughput-per-dollar for clean builds, container builds and the ISO's zstd pass. 2× DDR5-5600, 28 PCIe Gen 5 lanes, 170 W class. **Note the ceiling: EPYC 4005 stops at 16 cores**, so if build throughput ever binds, the answer is a new machine, not a new CPU. Acceptable for a declared stepping stone. Also live: a Ryzen 9950X is ~$150 cheaper with the same core count and higher clocks — the EPYC premium buys official ECC UDIMM validation and server firmware support, which is worth confirming against this board's Ryzen ECC story before paying it | | |
| 31 | 39 | | Board | **ASRock Rack B650D4U** (base variant) | ~$400–450 | mATX server board. **AST2600 BMC** with IPMI 2.0, iKVM, vMedia, dedicated management LAN. Base variant chosen over -2L2T/-2L2T/BCM specifically because **it is the only one with two M.2 slots** | | |
| 32 | 40 | | RAM | 2× 48 GB DDR5 ECC UDIMM (96 GB) | ~$450 | 1 DPC runs 5600; 2 DPC drops to 3600. Two slots stay empty on purpose | | |
| 33 | 41 | | Storage 1 | 2 TB NVMe on M2_1 (PCIe 5.0 x4) | ~$180 | **xfs** root. Not ZFS — see the note in `mm-v1-bom.md` | | |
| 34 | 42 | | Storage 2 | 4 TB NVMe on M2_2 (PCIe 4.0 x4) | ~$280 | Raw XFS scratch: kv-cache overflow later, container build scratch from day one | | |
| 35 | - | | PSU | 850 W Platinum ATX | ~$150 | One 250–300 W card plus a 170 W CPU. Sized for the machine that exists, not a 4-GPU machine that does not | | |
| 36 | - | | Chassis | 4U rackmount, ≥2 dual-slot bays (Sliger CX4712 or Rosewill RSV-L4500U) | $120–400 | Undecided. 4U for airflow, not for form-factor prototyping — see below | | |
| 37 | - | | CPU cooler | AM5 tower, ≤160 mm | ~$100 | Air. Height limit is the 4U lid | | |
| 38 | - | | Case fans | 4–6× 120/140 mm, high static pressure | ~$120 | Load-bearing for the bench role, see below | | |
| 43 | + | | PSU | **1200 W Platinum, ATX 3.1 with native 12V-2x6** | ~$220 | Was 850 W, which contradicted this document's own claim that two cards are reachable: 2× 250 W passive + a 170 W CPU is ~750 W, or 88% load. 1200 W also covers one modern ~450 W card. **ATX 3.1 is deliberate**: it handles the transient spikes modern cards produce and provides 12V-2x6 natively, so no adapters when the current-gen vertical gets tested. The 500–600 W-class vertical triggers a PSU review | | |
| 44 | + | | Enclosure | **Open frame** — see the enclosure section | ~$150–250 | Optimized for access. Airflow is solved at the card, not by the case | | |
| 45 | + | | CPU cooler | AM5 tower, any height | ~$100 | Air. No lid to clear on an open frame | | |
| 46 | + | | Card airflow | Per-card **test sled**: server blower + shroud, per vertical | ~$150 setup | The actual thermal instrument. See the enclosure section | | |
| 39 | 47 | | Boot GPU | **none** | $0 | The AST2600 has its own VGA and iKVM. `mm-v1-bom.md` carried a GT 1030 only because it was unsure the BMC would suffice; the manual settles it | | |
| 40 | 48 | | **Total** | | **~$2,500–2,900** | vs ~$10,280 for the `mm-v1` host platform | | |
| 41 | 49 | ||
| 42 | 50 | Vendor manuals for the decided parts are in `_private/docs/hardware/bench-v1/`. | |
| 43 | 51 | ||
| 44 | - | ## Why 4U, when a tower would be nicer to work in | |
| 52 | + | ## Enclosure: open frame, and airflow solved at the card | |
| 45 | 53 | ||
| 46 | - | A tower with a side panel is plainly better for swapping cards, and swapping cards is what | |
| 47 | - | this machine does. It still loses. | |
| 54 | + | The earlier draft of this file argued for a 4U rackmount because a passive card "only cools | |
| 55 | + | in a chassis with a front-to-back static-pressure path." **That argument does not survive | |
| 56 | + | scrutiny.** `mm-v1-bom.md` itself budgets a fan shroud for the P40 *inside* the 4U, and it is | |
| 57 | + | right to: passive datacenter cards are engineered for 1U/2U server fans producing static | |
| 58 | + | pressure that no 140 mm case fan approaches. The shroud is needed either way, so the 4U was | |
| 59 | + | buying repeatability, not cooling — a weaker claim than the one it was sold on. | |
| 48 | 60 | ||
| 49 | - | Collection cards are datacenter pulls, and a Tesla P40 is **passively cooled** — no fan at | |
| 50 | - | all. It cools only in a chassis with a front-to-back static-pressure path. A tower needs a | |
| 51 | - | strapped-on blower per card, which is exactly the sort of ad-hoc rig that makes two bench | |
| 52 | - | results incomparable. A fixed 4U airflow path means every card is tested in the same thermal | |
| 53 | - | environment, which is the only thing that makes a Care Tag's thermal trace worth printing. | |
| 61 | + | Once noise is not a constraint, there is a better answer available, and it inverts the | |
| 62 | + | problem. | |
| 54 | 63 | ||
| 55 | - | The case fans are therefore a test instrument, not cooling. Do not substitute quiet fans. | |
| 64 | + | **Airflow is solved at the card, with real server blowers.** 40–80 mm server blowers at | |
| 65 | + | 10k+ RPM produce the static pressure these cards were designed around. That is a thing a | |
| 66 | + | quiet build physically cannot do, and it is the single biggest quality difference in a bench | |
| 67 | + | test of a passive card. With sound deprioritized, use them. | |
| 68 | + | ||
| 69 | + | **Once airflow lives at the card, the enclosure only has to be good to work in.** So: | |
| 70 | + | ||
| 71 | + | - **Open aluminium frame** (mining-rig style, or an open bench-frame such as a Core P3 / | |
| 72 | + | BC1-class fixture). Nothing to unscrew, nothing to unrack, no lid, no cable gymnastics. | |
| 73 | + | Cards go in and out in seconds, which is the operation performed most. | |
| 74 | + | - **Unlimited card clearance.** Modern 3–3.5 slot, 350 mm cards fit trivially. A 4U would | |
| 75 | + | have constrained exactly the vertical most likely to need bench time later. | |
| 76 | + | - **Everything visible.** You can see fan spin, LEDs, and scorch marks on an unknown card | |
| 77 | + | before they become a smell. | |
| 78 | + | ||
| 79 | + | ### The test sled is the instrument | |
| 80 | + | ||
| 81 | + | Repeatability comes from a fixture, not a case. Build one **test sled** per card class: a | |
| 82 | + | rigid bracket that holds the card, its shroud, and its blower at a **fixed** geometry, with | |
| 83 | + | the blower on a controller at a **fixed, recorded RPM**. Every card in that class is then | |
| 84 | + | tested in an identical thermal environment regardless of what is around it — better | |
| 85 | + | repeatability than a shared case gives, because a case's airflow changes with every other | |
| 86 | + | card and cable in it. | |
| 87 | + | ||
| 88 | + | Consequences to hold: | |
| 89 | + | ||
| 90 | + | - **One sled per vertical.** A passive P40, a 2-fan consumer card and a 3.5-slot current-gen | |
| 91 | + | card have nothing thermally in common. Sleds get built as verticals open, not up front. | |
| 92 | + | - **Log RPM and ambient with every test.** A thermal trace without them is not comparable. | |
| 93 | + | Until `bmc-agent` exists (and it may not — task `59335767`), blower RPM is set on a manual | |
| 94 | + | fan controller and written down, and BIOS-set chassis fan curves are recorded. | |
| 95 | + | - **Dust is the accepted cost.** An open frame running 24/7 in a living space collects dust | |
| 96 | + | in the CPU cooler and PSU intake. Mitigated by the blowers only running during tests, and | |
| 97 | + | by putting periodic cleaning in the standing ops list. This is a real trade and the reason | |
| 98 | + | a closed case would otherwise win. | |
| 99 | + | - **It is not shippable as-is.** When this machine is sold, it either gets rehoused in a case | |
| 100 | + | or sold as a parts bundle. Budget that, and do not let the frame make the machine | |
| 101 | + | unsellable by surprise. | |
| 56 | 102 | ||
| 57 | 103 | ## The GPU ceiling, stated exactly | |
| 58 | 104 | ||
| @@ -70,8 +116,9 @@ | |||
| 70 | 116 | **Two GPUs are reachable via bifurcation.** BIOS exposes "Configure PCIE6 Link Width" with | |
| 71 | 117 | `[x16]`, `[x8x8]`, `[x8x4x4]`. Gen5 x8 is roughly twice the bandwidth a Gen3 x16 card such | |
| 72 | 118 | as a P40 can consume, so splitting costs those cards nothing. What it costs is a bifurcation | |
| 73 | - | riser and a physical mounting problem: two dual-slot cards hanging off risers above an mATX | |
| 74 | - | board in a 4U is a rig to solve, not a slot to populate. **Unproven until someone builds it.** | |
| 119 | + | riser and a physical mounting problem: two dual-slot cards on risers off an mATX board is a | |
| 120 | + | rig to solve, not a slot to populate. The open frame helps here — a frame is a mounting | |
| 121 | + | surface, where a case would have been a constraint. **Unproven until someone builds it.** | |
| 75 | 122 | ||
| 76 | 123 | So against the EveryCycle roadmap: | |
| 77 | 124 | ||
| @@ -85,6 +132,47 @@ | |||
| 85 | 132 | - **B6** (frontier-size with CPU offload) — **does not fit.** Two DDR5 channels is ~80–90 GB/s | |
| 86 | 133 | against ~358 GB/s for 8-channel DDR5-5600. CPU-offload work belongs to the replacement. | |
| 87 | 134 | ||
| 135 | + | ## The bench is not a control until it is characterized | |
| 136 | + | ||
| 137 | + | "All-new means known-good" is the right instinct with the wrong mechanism. New parts have | |
| 138 | + | infant mortality and firmware bugs; a used part with hours on it can be *more* reliable than | |
| 139 | + | a fresh one. What new actually buys is an **RMA path** — when a host part does fail, it gets | |
| 140 | + | replaced rather than debugged, and it never becomes a suspect in a card's test result. That | |
| 141 | + | holds up. The "known-good" part does not, until it is measured. | |
| 142 | + | ||
| 143 | + | **Before the first used card goes in**, record a baseline and keep it in the runbook: | |
| 144 | + | ||
| 145 | + | - memtest86+ clean pass over all installed DIMMs. | |
| 146 | + | - Sustained all-core `stress-ng` run: clocks held, package temp, no throttle. | |
| 147 | + | - `fio` on both NVMes: throughput and latency, so a future slow build has a reference. | |
| 148 | + | - Idle and full-load wall power, and the ambient temperature both were taken at. | |
| 149 | + | - ECC corrected-error count at zero, **and proof you can read it** — see below. | |
| 150 | + | ||
| 151 | + | **Designate a reference card per vertical.** To tell "this card is bad" from "the slot, riser, | |
| 152 | + | PSU, sled or BIOS is bad" you need a known-good card to swap in. Buying a new one in each | |
| 153 | + | class is not worth it. Instead: **the first used card that passes cleanly in a vertical | |
| 154 | + | becomes that vertical's reference** — its numbers are recorded, and it is not sold. Cheap, | |
| 155 | + | and it makes every later test in that class a comparison rather than an absolute. | |
| 156 | + | ||
| 157 | + | **ECC you cannot read is not ECC.** Rising correctable-error counts are the early warning the | |
| 158 | + | memory is paid for, and Alloy ships no `rasdaemon`, `edac-utils`, `smartmontools` or | |
| 159 | + | `ipmitool`. Those belong in the server profile (GoingsOn alloy task `d1fed0d7`) and the | |
| 160 | + | baseline above cannot be taken without them. | |
| 161 | + | ||
| 162 | + | ## Card verticals, opened one at a time | |
| 163 | + | ||
| 164 | + | The Collection wants at least one cut in several verticals, and cannot fund testing all of | |
| 165 | + | them at once. So verticals open in sequence, and each one opens a small equipment bill: | |
| 166 | + | ||
| 167 | + | | Vertical | Bench implications | | |
| 168 | + | |---|---| | |
| 169 | + | | **Passive datacenter pulls** (P40, P100, MI50) | Shroud + server blower sled. Some use CPU-style EPS 8-pin, not PCIe. Large BARs need Above 4G + ReBAR. First, because the roadmap names it and the cards are cheapest | | |
| 170 | + | | **Used consumer / gaming** | Self-cooling, standard PCIe power, trivial sled. Needs a monitor on the card under test, since display output is part of what is being sold | | |
| 171 | + | | **B-stock / open-box current-gen** | Standard cooling, may retain manufacturer warranty. Bench time still required to prove it | | |
| 172 | + | | **Modern high-TDP** (500–600 W class) | 12V-2x6 native (the ATX 3.1 PSU covers this), real transient spikes, 3.5 slots, 350 mm. **Triggers a PSU review past 1200 W** and its own sled | | |
| 173 | + | ||
| 174 | + | Sequence the verticals; do not buy sleds or PSU headroom for a vertical that is not open yet. | |
| 175 | + | ||
| 88 | 176 | ## What was deliberately not bought, and why | |
| 89 | 177 | ||
| 90 | 178 | - **8-channel memory bandwidth.** The single real loss. It costs a $3,900 CPU tier plus | |
| @@ -114,8 +202,31 @@ | |||
| 114 | 202 | IPMI/Redfish or wants a dedicated dev board. **This question is not specific to this | |
| 115 | 203 | board — it applies to the WRX90 spec identically**, and answering it on a $400 board is | |
| 116 | 204 | cheaper. | |
| 117 | - | - **Chassis choice**, and with it whether an mATX board plus a bifurcation riser can actually | |
| 118 | - | mount two dual-slot cards. | |
| 205 | + | - **48 GB ECC UDIMM availability and price.** The manual lists 48 GB as the maximum module | |
| 206 | + | size so the spec permits it, but ECC UDIMMs are commonly 16/32 GB. If 48 GB is scarce or | |
| 207 | + | badly priced, 2× 32 GB (64 GB at 5600) is honestly enough for 16 cores, and 4× 32 GB pays | |
| 208 | + | the 3600 penalty for capacity that a fire-and-forget CI host does not need. | |
| 209 | + | - **Where the frame physically sits.** There is no rack, and an open frame in a living space | |
| 210 | + | has different constraints than a case: dust, curiosity, and anything that can be knocked | |
| 211 | + | into it. Pick the spot before buying the frame. | |
| 212 | + | - **The x8x8 riser rig**, which an open frame makes easier than any case would: two dual-slot | |
| 213 | + | cards on risers need mounting, and a frame is a mounting surface. | |
| 214 | + | ||
| 215 | + | ## Sequence the bring-up | |
| 216 | + | ||
| 217 | + | Too many unknowns arrive at once otherwise: a new hardware platform, Alloy in a role it has | |
| 218 | + | never held, no settled sshd story, bench duty, and CI. Add one at a time — the same | |
| 219 | + | discipline the bench itself exists to enforce. | |
| 220 | + | ||
| 221 | + | 1. Bare bring-up on the frame. BIOS, BMC, iKVM, management LAN. | |
| 222 | + | 2. OS install, and find out what `alloy install` does on non-laptop hardware. | |
| 223 | + | 3. Characterization baseline (above). This is the gate that makes it a control. | |
| 224 | + | 4. Build load: images, ISOs, the MNW gate. | |
| 225 | + | 5. First used card, in a sled, with the reference procedure. | |
| 226 | + | ||
| 227 | + | `/var/lib/containers` mounts on the 4 TB scratch, not on root. On a bootc host `/var` is | |
| 228 | + | stateroot, so this is a deliberate step; get it wrong and every container build lands on the | |
| 229 | + | 2 TB root. | |
| 119 | 230 | ||
| 120 | 231 | ## BIOS at first boot | |
| 121 | 232 |