memslammer

memory stress test for DDR overclock validation
GitHub

One job: make an unstable memory overclock throw an error as fast as possible. We reverse-engineered how the fast-failing testers stress RAM, rebuilt each ingredient clean-room, and kept only what measurably shortened time-to-first-error on real unstable settings.

WindowsCLI + lite window · .zip · ~150 KB Windows, full appmemslammer-gui · .zip LinuxCLI + lite window · .tar.xz · ~50 KB Linux, full appmemslammer-gui · .tar.xz

No installer, driver, admin rights or network access. Single-file binaries; checksums in SHA256SUMS.txt. Needs an x86-64 CPU with AVX2 (Haswell, Zen or newer). MIT licensed.

218 smedian time to first error from cold, vs 368 s Karhu and 418 s TM5 Absolut
3 / 3rounds won in the cold-start race (odds ~1 in 125 if all were equal)
57 GB/ssustained read+write on a 5900X with dual-channel DDR4-3600
84 KBstatic Linux CLI; the Windows CLI + native GUI zip is ~150 KB
memslammer full app after a failed run, showing the error list
The full app on Windows after a real failure: DDR4-3600 with tCL/tRCD 14 on a Ryzen 9 5900X.

Using it

Three frontends, one engine

The test engine is a small C library (core/). Each frontend links it statically and only polls its status, so all three run byte-for-byte the same test loops.

whatWindowsLinuxdeps
memslammercommand line, scriptable, works over SSH and from live USBs99 KB84 KBnone (static, musl on Linux)
memslammer-litesmall native window: plain Win32 controls, or GTK 3 on Linux152 KB60 KBnone on Windows, GTK 3 on Linux
memslammer-guiGPU-rendered app (GPUI + gpui-kit): live charts, per-thread progress, error list, failing-bit map, run history, copyable report14 MB32 MBVulkan or GL on Linux

The CLI and lite window ship together in one tiny archive. The full app is a separate download, so if you don't want a big GPU-rendered binary on your test box, you never get one.

memslammer-lite on Windows
memslammer-lite on Windows: plain Win32, about 150 KB, DPI-aware, taskbar progress, keeps the PC awake while it runs. A real failure, 4 s into a run on a hot box.
memslammer-lite on Linux
memslammer-lite on Linux: GTK 3, follows your desktop theme, inhibits suspend while it runs.
failing bit map
Bit map: which bit positions of a 64-bit word flipped. On our test box every error from tCL/tRCD set too low hit the same line, byte 1 bit 7: timing faults tend to find the DQ with the least margin.
full app per-thread view during a failing run
Per-thread view of the same run: threads that hit an error turn red. 100% coverage means a thread has tested its whole share once.

CLI

> memslammer -s            # verify 90% of free RAM, stop at the first error
memslammer verify: 9984 MB, 24 threads, block 16777216, rereads 200, pattern random, cache none, order seq, heat 0, yield 1
[     10.1s] cycles 0, coverage 26.9%, 57.90 GB/s, errors 0
[     20.2s] cycles 0, coverage 53.8%, 57.97 GB/s, errors 0
[     30.2s] cycles 0, coverage 80.8%, 57.86 GB/s, errors 0
[     40.2s] cycles 24, coverage 108.3%, 57.73 GB/s, errors 0
[   41.993s] ERROR thread 5 cycle 1 (total 1) bits 0x0000000000008000
[     42.0s] cycles 24, coverage 113.6%, 57.03 GB/s, errors 1
RESULT tester=memslammer errors=1 first_error_s=41.993 elapsed_s=42.014

Real output on the test box (warm, a few minutes after another run), same unstable setting as everywhere on this page.

Options: -m MB, -t threads, -d seconds, -s stop on first error, -M verify|chain, plus every ingredient below (-h lists them). Exit status: 0 no errors, 1 errors, 2 bad arguments. Ctrl+C stops cleanly and prints the summary. Every GUI shows the equivalent CLI command for its settings.

How the test works

verify (default). Each thread owns a share of the test memory and walks it in 16 MiB blocks. It fills a block with random data (xoshiro256**, fresh seed per block), then re-reads and compares the block 200 times, regenerating the expected values on the fly, so there's no second copy to read. Any mismatch is an error, logged with the time, thread, block offset and the exact bits that flipped. Then it moves to the next block.

What we learned building it (details and raw data in docs/results.md):

chain. A clean-room reimplementation of the chained transform and checksum technique Karhu RAM Test uses (docs/karhu.md). It's kept as a baseline. verify is modelled on the first test of TestMem5's anta777 "Absolut" profile (docs/tm5.md), which caught our test OC in 12 of 13 TM5 failures.

Results

Test box: Ryzen 9 5900X, 2x8 GB DDR4 at 3600 MT/s with tCL 14 / tRCD 14 (deliberately too low, otherwise stable settings). No WHEA or machine-check events: the fault is silent data corruption that only a tester sees. The harness stops each tester at its first error and records the timings the memory controller actually ran.

Cold-start race: 15 min idle before each run, 3 rounds, order rotated

memslammer verify
218 s
verify, clflushopt
242 s
Karhu RAM Test
368 s
memslammer chain
411 s
TM5 anta777 Absolut
418 s

Median time to first error. Per-round times (verify / Karhu / TM5): 394 / 568 / 443, 218 / 368 / 418, 114 / 320 / 319 s. verify was fastest in every round.

Later batches: 5 min idle (the realistic "back from UEFI" case)

batchruns (s)medianstart Tctl
Windows, 2026-11-07, 16 MiB blocks97, 88, 130, 108, 106, 109107 s55–57 °C
Linux (live USB), 2026-11-09278, 196, 226, 170211 s50–53 °C
Windows, 2026-11-08397, 341, 355, 374, 308, 253, 667, 143348 s47–55 °C

Every run failed, the slowest after 667 s. Throughput and time-to-error are the same on Linux and Windows. The ordering by starting temperature is consistent with the finding that warm DIMMs fail sooner.

Limits: one machine, one fault type, small samples. Differences under ~1.5x in median are noise at these sample sizes. We found no tRFC setting that fails quickly, so refresh-timing faults are untested.

Why trust it

Build from source

make                 # CLI + lite for Linux and Windows (gcc, mingw-w64, GTK 3 headers)
make gui             # full app for this OS (Rust stable)
make test            # self-test
make release V=0.2.0 # tag + push; CI builds and publishes the release

Layout: core/ engine (portable C, AVX2 loops isolated in engine.c), cli/, lite/ (Win32 + GTK), gui/ (Rust FFI + gpui-kit), harness/ (the benchmark rig behind every number on this page), docs/ (write-ups and raw results).