Validation and Methods

How I Made SSD Validation Repeatable

How I turned SSD validation into a repeatable process: fixed phases, write saturation with idle recovery, power capture, and a report each run had to fill in.

On this page 13 sections

I ran quality at an SSD company, and I built one test plan that every drive, enclosure and firmware revision had to pass through in the same order. This article walks through that plan, from the folder layout and phase markers to the write-saturation runs, power capture and the report each run had to fill in.

How I made SSD validation repeatable: phase markers, a write-saturation curve and one report templateA three-panel cover. Left: nine phase markers in a row, the ninth drawn as the finish. Center: the write speed of an example 2 TB external SSD, 1.78 GB/s for the first five minutes and then a cliff to about 0.17 GB/s. Right: a report sheet of eight stacked sections, the same template for every product.VALIDATION AND METHODSOne plan for every drivePHASES · SATURATION · REPORT01 PHASES02 SATURATION03 REPORT123456789One marker per phase1.78 GB/sthen about 0.17 GB/s2 TB external SSDOne template

The lockdown protocol under it is written up in the first part of my benchmarking guide, and the sustained-write runs described here are the test behind the drive results in Flash Myths, Tested. The question this page answers is what it takes to make one result something you can repeat on a second machine.

A result is a claim

A benchmark number is a claim, and my job was to check it. Before a drive earned a line in a report, it had been written to for hours, its power draw had been captured, its temperature had been measured with a probe instead of taken on the drive’s word, and, if it had a fan, its noise had been measured too. Then it went through the same steps on another system, because a result that only shows up on one machine isn’t a result yet.

A single run tells you what one drive did on one afternoon, on one host, in one thermal state. It says very little about what the next unit will do, or what the same unit will do after a firmware change. When I ran quality at an SSD company, most of the questions I had to answer were comparisons between this firmware and the last one, this controller and that one, or this batch and the golden sample.

A result is a claim

A number reaches the report only after a second system agrees

A left-to-right flow of four boxes joined by copper arrows: test the drive, repeat on a second system, compare the runs, a line in the report. Under the first box, a list of four measurements: hours of writes, power capture, probe temperature, and fan noise if the drive has a fan. A dashed arrow from the third box leads down to a box that reads: only on one machine, not a result yet.01Test thedrive02Repeat ona secondsystem03Comparethe runs04A line inthe reportHours of writesPower captureProbe temperatureFan noise, if anyOnly on one machineNot a result yetResult moves onResult held back
Figure 1 · The path one drive’s result takes before it counts, and the four measurements taken first. Source: my validation test plan.

Comparisons only work when everything except the thing you changed is held still. So I stopped treating each product as a fresh project and ran every one through the same steps in the same order, on whatever system was in front of me. I have left out product names and customer details on purpose.

The shape of a run

Each device under test got a folder, and each folder had ATTO, CrystalDiskMark, DiskBench, Power, SMART, UL and WS (write saturation) subfolders. Benchmarks from UL’s PCMark 10 and 3DMark Storage went in the UL folder, and the SMART folder held the drive’s health data from before and after the run.

Each run was split into phases. When a phase finished, a small marker file was written with the text “Benchmarking Completed Successfully: Phase N”. There were nine phases for most products and ten for some. Those markers did two jobs: you could tell at a glance how far an interrupted run had got, and the timestamps gave me a free record of how long each run took.

The shape of a run

The median run took 5.5 hours, and most sat close to it

59 complete runs, first phase marker to last

A column chart of 59 complete runs by hours from the first phase marker to the last, in quarter-hour bins, the first starting at 3.25 hours and the last at 7.25. Counts by bin start: 5 at 3.25, 2 at 3.5, 2 at 3.75, 1 at 4.5, 2 at 5.0, 16 at 5.25, 24 at 5.5, 4 at 5.75, and 1 each at 6.0, 6.25 and 7.25. The 5.5 hour bin holds the median.Runs in each bin0102030523.52414.52516245.541616.571Hours from the first phase marker to the last (bin start)Bin holding the medianOther quarter-hour bins
Figure 2 · How long each complete run took, in quarter-hour bins; the bar at 5.5 hours holds the median, and the middle half finished between 5.3 and 5.7 hours. Source: my phase-marker timestamps.

Going back through those markers, I can see a clear story in the timestamps. Across dozens of complete runs, the median time from the first marker to the last was 5.5 hours, and the middle half finished between 5.3 and 5.7 hours. That spread was tight because the plan was scripted and the phases didn’t change.

Lock the system down first

Before a single data point counted, the system had to be locked down. I wrote the full protocol up in SSD Benchmarking 101. In short, the drive under test was never the boot drive, antivirus was off or excluded the drive, search indexing was off, the power plan was High Performance with PCIe ASPM off, and updates were paused. Testing whether it worked was simple. Run the same test three times, and if you get three different numbers, the system isn’t locked down.

Lock the system down first

Six things stayed fixed, and one test showed they held

Six cards in two rows of three, each with a check mark: the drive under test is never the boot drive; antivirus is off or excludes the drive; search indexing is off; the power plan is High Performance with PCIe ASPM off; updates are paused; the BIOS version is recorded and held. Below them a banner reads: run the same test three times. Three matching numbers mean the lockdown held. Three different numbers mean the system is not locked down.01Drive under testis never theboot drive02Antivirus off orexcluding thedrive03Search indexingoff04High Performancepower plan,PCIe ASPM off05Updates paused06BIOS versionrecorded andheldTHE TESTRun the same test three times.Three matching numbers mean the lockdown held.Three different numbers mean it is not locked down.Condition held fixedCheck on the lockdown
Figure 3 · The conditions fixed before any data point counted, and the repeat test that checks the lockdown worked. Source: my validation test plan and Benchmarking 101.

Locking it down went deeper than Windows. A BIOS revision can change the output, so the BIOS version was part of the record and stayed put for the length of a comparison. A board that took a BIOS update halfway through was a different system from the one that produced the earlier numbers.

Built by hand

None of this had SI behind it. There was no test framework and no scheduler either. Everything ran on Iometer, batch files, Performance Monitor and spreadsheets, and I wrote and debugged every piece by hand, solving one problem at a time.

Built by hand

One batch file line runs one step, and the line order is the plan

Three layers. At the top, a batch file shown as a stack of command lines, with the line order marked as the test plan. In the middle, one line broken into parts: Iometer.exe, the /c configuration file WS-1hr.icf going in, and the /r results file WS-1hr.csv coming out. At the bottom, Performance Monitor and spreadsheets as two tools that work beside it.01 BATCH FILELine 1: one Iometer stepLine 2: the next step...Last line: the final steporder = plan02 ONE LINE, ONE STEPIometer.exe /c WS-1hr.icf /r WS-1hr.csvload thisconfigurationwrite thisresults fileThe file name tells you which step it came from03 BESIDE ITPerformance Monitor04 AFTERWARDSpreadsheetsConfiguration inResults out
Figure 4 · How a hand-built run was put together: a batch file of Iometer lines, each loading a configuration and writing a results file, with Performance Monitor and spreadsheets beside it. Source: my validation test plan.

Iometer did the work, driven from the command line. One line runs one step. It loads a configuration file and writes a results CSV, like Iometer.exe /c WS-1hr.icf /r WS-1hr.csv. A batch file chained those lines together, and the order of the lines was the test plan.

Write saturation, then idle recovery

I cared most about the write-saturation test, because it is where drives stop looking like their spec sheets. I kept the configuration simple on purpose. It runs in Iometer 1.1.0 with 100% sequential writes in 1 MiB transfers, aligned to 1 MiB, with a random data pattern and one worker. The main version keeps 32 I/Os outstanding, and as I remember it a separate queue-depth-1 version kept one. It targets the raw disk with no file system in the way, so the drive fills block by block and file system behavior can’t color the result. There is one configuration for each duration, 15 minutes and 30 minutes, then one hour, two hours, four hours and eight hours.

Here is one run on one 2 TB external SSD, a 75-minute Iometer run from October 2022. For the first five minutes it writes at 1.78 GB/s. Then it falls off a cliff to about 0.17 GB/s. That is a drop of roughly 90%, and it stays there for the rest of the 75-minute run. That is 539 GB of fast writing, and the drive never went back to that speed during the run.

Write saturation, then idle recovery

After about 539 GB the drive fell from 1.78 GB/s to about 0.17 GB/s

2 TB external SSD, sustained 1 MiB sequential writes, 75 minutes

A line chart of write speed in GB/s against minutes into a 75-minute run on a 2 TB external SSD. The drive writes at 1.78 GB/s for the first five minutes, about 539 GB, then drops to about 0.17 GB/s and stays there for the rest of the run.Write speed, GB/s00.51.01.52.001530456075Minutes into the runThe cliff: 5 minutes in,after 539 GB written1.78 GB/sAbout 0.17 GB/s for the rest of the run10-second average write speedData written
Figure 5 · The whole 75-minute run on one 2 TB external SSD; each point is a 10-second average. Source: my Iometer write-saturation run on this drive.

After the saturation run came the interesting part. My script followed it with a sequence of idle gaps, and after each gap a five-minute write burst:

  1. Idle for 30 seconds, then write for five minutes.
  2. Idle for one minute, then write for five minutes.
  3. Idle for five minutes, then write for five minutes.
  4. Idle for 30 minutes, then write for five minutes.

Idle gaps were Iometer steps too, so the same tool timed every wait and logged it the same way. Every step wrote its own CSV, named for the step it belonged to, so a result could be traced to a phase without opening the file.

Here is what the same drive did after each rest. Each panel is the five-minute write burst that followed the idle gap, drawn on the same scale.

Write saturation, then idle recovery

A longer rest bought back more fast writing, but not all of it

The same 2 TB external SSD, five-minute write burst after each rest

Four small line charts of write speed in GB/s over a five-minute burst, one after each idle gap. After 30 seconds idle the drive writes nothing at full speed. After 1 minute it writes 51 GB at full speed. After 5 minutes it writes 192 GB at full speed. After 30 minutes it writes 293 GB at full speed. A dashed line in each marks the fresh-drive speed of 1.78 GB/s.Write speed, GB/s01 30 SECONDS IDLENo fast writes01201234502 1 MINUTE IDLE51 GB at full speed01201234503 5 MINUTES IDLE192 GB at full speed01201234504 30 MINUTES IDLE293 GB at full speed012012345Minutes into the write burstWrite speedData writtenFresh drive, 1.78 GB/s
Figure 6 · Speed over the five-minute write burst after each idle gap, all four on one scale; the shaded area is data written. Source: my Iometer idle-recovery runs on this drive.

That sequence is a direct measurement of recovery. Once a drive’s fast write region is exhausted, its write speed drops to whatever the flash and controller can sustain. How much speed comes back after a short rest tells you how quickly the firmware reclaims that fast region and how much background work it has to do first. Two drives with the same steady-state number can behave very differently in that test, and a firmware update can change the answer without changing anything on the spec sheet.

Run Time at full speed Data written at full speed
Fresh drive 302 seconds about 539 GB
After a 30-second rest none 0 GB
After a 1-minute rest about 29 seconds about 51 GB
After a 5-minute rest about 108 seconds about 192 GB
After a 30-minute rest about 164 seconds about 293 GB

That drive shows how slowly recovery comes. After a 30-second rest it could not write anything at full speed. After a minute it managed about 51 GB, and after five minutes about 192 GB. Even after a full 30 minutes it only got back about 293 GB, a little over half of the 539 GB it wrote at full speed on a fresh drive. The longest rest in the plan was 30 minutes, so I cannot say how long a full recovery takes.

What made it hard

My first enemy was the operating system. In the copy and read-back tests, anything just read or written gets cached in RAM, so the next run comes back faster and you are measuring memory instead of the drive. Numbers looked great and meant nothing. Housekeeping was the fix. I restarted between runs, ran TRIM, and rebooted the system several times to make sure the caching wasn’t creeping back in. I also cleared the drive after every power restart, so each pass started from the same clean state and nothing carried over from the last one.

Scripts had their own limits. Iometer configuration files are tied to a machine. Each one carries the name of the host and the number of the disk it writes to. Moving the plan to another system meant editing every file, and the disk number was the part that couldn’t go wrong, because a raw write test pointed at the wrong disk writes over whatever lives there. So the plan lived in separate folders by disk number, and the host name in each copy had to match the system in front of me. Across tens of systems, keeping track of which copy belonged to which machine was a job of its own.

What made it hard

Each problem the plan hit got one fix that stayed in the plan

Four rows, each a problem card on the left joined by a copper arrow to a fix card on the right. Reads and writes land in RAM so reruns look fast: restart between runs, run TRIM, reboot a few times and clear the drive after power restarts. Each configuration file names its host and disk: keep the plan in folders by disk number with the host name matched to the system. A batch file has no judgment and runs on after a failure: phase markers show how far a run really got. The host's side of the story was missing: a Performance Monitor collector set saved as CSV.THE PROBLEMTHE FIXReads and writes landin RAM, so reruns lookfastRestart between runs,run TRIM, reboot a fewtimes, clear the driveafter power restartsEach configuration filenames its host and diskPlan kept in folders bydisk number, host namematched to the systemA batch file has nojudgment and runs onafter a failurePhase markers show howfar a run really gotThe host’s side ofthe story was missingPerformance Monitorcollector set, savedas CSVProblemFix kept in the plan
Figure 7 · Four problems that made repeatable runs hard and the fix kept for each. Source: my validation test plan.

A batch file also has no judgment. It runs the next line whether or not the last one worked, so a failure early in a long run could burn hours before anyone noticed. Phase markers let me see how far a run really got.

Performance Monitor gave me the host’s side of the story. I kept a short step-by-step for it. Build a data collector set, start and stop it with the run, load the data afterward and save it as CSV, so the host’s view could sit next to the drive’s.

Fill, copy and real files

Synthetic tests don’t exercise what a person does with a drive, so the plan also moved real data. DiskBench copied a fixed 50 GiB folder of many files onto the drive and logged the result. One log shows 31,227 files and 53.7 GB copied in about 30.5 seconds, or roughly 1.76 GB/s. Since the source folder never changed, any difference between two runs came from the drive, the firmware or the host, and none of it from the data. Keeping the copy numbers honest took more work than running the copy, as I described above.

Fill, copy and real files

The same 50 GiB folder went onto each drive, so the drive set the time

One logged DiskBench copy

A source folder box reading fixed folder, 50 GiB, 31,227 files, joined by a copper arrow to a box for the drive under test. Below, three cards give the logged run: 53.7 GB copied, 30.5 seconds, and roughly 1.76 GB/s. A line under the cards says that because the folder never changes, any difference between two runs comes from the drive, the firmware or the host.01 SOURCE FOLDER50 GiB31,227 filesNever changes02 DRIVE UNDER TESTDiskBench copyLogged to a fileTHE LOGGED RUN53.7 GBcopied30.5 secondsto copy it1.76 GB/sroughly, end to endThe folder never changes, so a difference between two runscomes from the drive, the firmware or the host.Fixed inputDrive and its result
Figure 8 · A fixed folder of many files is copied onto the drive under test; the logged run copied 53.7 GB in about 30.5 seconds, roughly 1.76 GB/s. Source: my DiskBench log.

Power, measured with the right gear

Performance without power is half a result, especially for bus-powered enclosures where the port sets the budget. I measured it with Quarch hardware, starting with the HD PPM and moving through several variants of their modules over the years. Software changed along with the hardware, from Test Monkey to Quarch’s newer Power Studio. Every run stored the rail voltages, currents and total power as CSV files beside the benchmark results.

A firmware revision on an 8 TB drive

In April 2022 I captured the same drive on old and new firmware, with CrystalDiskMark set to two passes per test. The two builds differed by about 0.26 W on average across the CrystalDiskMark runs, and the peak was 9.89 W on the old build against 9.59 W on the retail one. Neither figure is dramatic, and the reason to record them is that a bus-powered enclosure has very little headroom to give away.

Four 4 TB drives at PCIe 4.0 speeds

In a November 2025 comparison, average power during CrystalDiskMark ran from 1.9 W to 3.9 W across the four, with peaks from 3.8 W to 9.0 W. Each drive has one Quarch capture of one CrystalDiskMark run, two passes at 1 GiB. For a bus-powered design, the gap between average and peak is the number that matters, and only the CSV shows it.

Power, measured with the right gear

Peaks ran well above the average on all four 4 TB drives

CrystalDiskMark at PCIe 4.0 speeds, drives unnamed

Eight horizontal bars of power in watts during one CrystalDiskMark run on four 4 TB drives at PCIe 4.0 speeds. Drive A averaged 1.9 W with a peak of 3.8 W. Drive B averaged 2.2 W with a peak of 4.9 W. Drive C averaged 2.9 W with a peak of 8.2 W. Drive D averaged 3.9 W with a peak of 9.0 W.Drive0246810Power during one CrystalDiskMark run, wattsDrive Aaverage1.9 WDrive Apeak3.8 WDrive Baverage2.2 WDrive Bpeak4.9 WDrive Caverage2.9 WDrive Cpeak8.2 WDrive Daverage3.9 WDrive Dpeak9.0 WAverage powerPeak power
Figure 9 · Average and peak power during one CrystalDiskMark run for four 4 TB drives; the gap between the two is what a bus-powered design has to cover. Source: my Quarch power captures.

Heat, noise and a multimeter

A drive’s own temperature sensor tells you what the controller thinks and says nothing about what the board is doing, so I measured it myself. An Amprobe TMD-50 with a K-type thermocouple gave me a real contact reading. Handheld IR thermometers were the fast way to scan a whole board, with one catch. Infrared readings on shiny surfaces such as bare metal heatsinks can be off, so the thermocouple was the check on the IR gun.

Anything with a fan got a decibel meter, because noise is a spec the customer hears, and an enclosure that is quiet at idle can be a different product under load. Multimeters covered the simple questions that need no software at all, like what voltage is actually arriving at the drive.

Heat, noise and a multimeter

Four hand instruments checked what the drive could not report

A schematic drive board with gold connector fingers on the left, a controller square in the middle and four flash packages on the right. A K-type thermocouple touches the controller for a contact reading. Dashed beams from an infrared thermometer above the board sweep all of it, marked as unreliable on bare shiny metal. A multimeter probe touches the connector to read the voltage arriving at the drive. A decibel meter by an enclosure fan at the top right measures noise at idle and under load.ControllerFlash packages01 CONTACTK-typethermocouple02 SCANIR thermometeroff on bare shiny metalEnclosure fan04 NOISEDecibel meter bythe fan, at idleand under load03 VOLTAGEMultimeter at theconnector reads thevolts reaching the driveProbe touching the partMeasured at a distanceConnector fingers
Figure 10 · Where each hand instrument went: a thermocouple on the controller, an infrared thermometer over the board, a multimeter at the connector and a decibel meter by the fan; the board drawing is schematic. Source: my validation test plan.

The report every run had to fill in

Last came the report. Every product report used the same template, which ran through interface, controller and flash, test system, devices under test, task list, results, suggestions and a summary. For an SSD, the task list was burst performance, sustained performance, a power check and a temperature check. Enclosures and readers added SMART and TRIM checks and, where it applied, macOS testing.

The report every run had to fill in

Every product report used the same eight sections in the same order

A report sheet of eight stacked sections in order: interface, controller and flash, test system, devices under test, task list, results, suggestions, summary. The task list row is joined by a copper line to two lists on the right. For an SSD: burst performance, sustained performance, a power check and a temperature check. Enclosures and readers add a SMART check, a TRIM check and, where it applied, macOS testing.01Interface02Controller and flash03Test system04Devices under test05Task list06Results07Suggestions08SummaryTASK LIST FOR AN SSDBurst performanceSustained performancePower checkTemperature checkENCLOSURES AND READERS ADDSMART checkTRIM checkmacOS, where it appliedSectionTask list and its itemsAdded tests
Figure 11 · The report template, with the task list opened up: what an SSD was tested for and what enclosures and readers added. Source: my validation test plan.

I never worked on a single bench. I ran this on tens of systems at a time, across different chipsets, CPUs and PCIe generations. Intel and AMD desktops across several chipset generations, with DDR4 and DDR5, were among them, and so was macOS testing. That plan stayed the same on every one, so a result that only appeared on one host could be recognized as a host result and not a drive result.

Side-by-side comparison workbooks sat in their own folder and covered controller against controller, power against power, sustained write against sustained write. Putting two products in one table is what turned raw results into a decision.

Why it worked

A repeatable plan like this earns its keep by making change visible. Run the same phases before and after a firmware revision, and any shift in idle recovery, power draw or sustained speed shows up against numbers you already trust, on the same platform, with the same files.

Why it worked

The same phases before and after a change make the shift visible

Schematic bars, not measured values

Two side-by-side panels with the same three rows: idle recovery, power draw and sustained speed. In the panel before the firmware revision all three bars are in the middle. In the panel after it, the idle recovery bar is longer and is marked with a copper arrow, while power draw and sustained speed are unchanged. The bars are schematic and carry no values.01 BEFORE THE REVISIONIdle recoveryPower drawSustained speed02 AFTER THE REVISIONIdle recoveryPower drawSustained speedSame platform, same files, same phases.Whatever moved is the change.Result against a trusted baselineShift that shows up
Figure 12 · The same three results measured before and after a firmware revision on the same platform with the same files; the bars are schematic. Illustrative values.

It also changes what an outlier means. Once you know what normal looks like, a drive that misbehaves stands out at once. You can start on why instead of arguing about whether the test was fair. And when a problem turns up that the plan didn’t cover, the fix is to add the missing phase, so the same surprise can’t get through twice.

Sources

Primary is the original paper, standard or datasheet. Secondary is a review, a vendor summary or a news report. Measured is my own test data.

Show all 1 sources
  • MeasuredThe author’s own measurements