Published 2026-08-27 · Seed: web benchmark · Focus: how to run a web benchmark

How to Run a Web Benchmark That Another Engineer Can Repeat

how to run a web benchmark illustration

Learning how to run a web benchmark is less about flags and more about refusing to lie to yourself. The same URL can produce a hero number or a useful number. The difference is hypothesis, warm-up, accepted samples, and a published command line.

This is a method you can copy into a lab notebook. It works with oha, wrk2, vegeta, or bombardier. The binary is interchangeable. The ritual is not.

Write the hypothesis first

One sentence. “This change should raise JSON throughput at 256 connections without moving p99 above 8 ms on c7g.2xlarge.” If you cannot fit the claim into one sentence, you are planning two tests. How to run a web benchmark starts with naming the test you are not running.

Freeze the artifact

Container digest, compiler flags, GOMAXPROCS, jemalloc yes or no, uvloop yes or no, worker count, and the exact framework version. If those drift, you compared weekends, not software. Put the freeze in the report header so a reviewer does not have to ask.

Separate client and server

Do not run the generator on the same machine as the server unless you label the run as a laptop demo. Pin processes to disjoint cores. Disable frequency boosting if you care about variance more than a headline. Check that the client is not at 100% CPU while the server is at 40%. That pattern means you learned how to run a web benchmark of the generator.

Warm, then sample, then gate

  1. Warm the server for 15–30 seconds. JIT languages and page caches lie on the first burst.
  2. Collect at least three accepted samples of 30–60 seconds after warm-up.
  3. Discard runs whose error rate exceeds the gate, commonly 0.1% or 0.0%.
  4. Publish median RPS on successful responses, p50/p95/p99, CPU, RSS, and the command.
  5. Increase connections or rate until errors appear or latency leaves the budget. The interesting number is the last healthy point.
oha -z 45s -c 256 --latency-correction http://10.0.0.8:8080/json
echo "GET http://10.0.0.8:8080/json" | vegeta attack -rate=20000 -duration=45s | vegeta report

Record the envelope

Kernel, NIC offloads, somaxconn, ephemeral ports, irqbalance, instance family, and whether client and server shared a placement group. TLS cipher and session ticket reuse if you tested TLS. Max concurrent streams if you tested HTTP/2. How to run a web benchmark without footnotes is how two teams shout past each other.

Coordinated omission

If the client delays the next request because it is still waiting, naive latency understates how late a user would have been. Use wrk2, vegeta rate mode, k6 arrival-rate, or oha latency correction. Mention which you used. Reviewers who know how to run a web benchmark will look for that sentence.

What to publish

A screenshot of peak RPS is not a report. It is a vibe. If you need tools before method, start with web benchmark tools 2026. If you are about to run a 30-minute mixed-route soak and call it the same thing, read web benchmark vs load testing.

FAQ

How long should a run be? Long enough that p99 is not one lonely slow request. Forty-five seconds after warm-up is a start, not a religion.

How many connections? Enough to approach the hypothesis, then a sweep until the guardrail trips. One arbitrary -c 100 is not a method.

That is how to run a web benchmark that survives a skeptical staff engineer. Everything else is decoration on an unreproducible chart.

Mistakes people make around how to run a web benchmark

The first mistake is treating how to run a web benchmark as a slogan instead of a scoped experiment. The second is copying a command from a chat log without pinning the client version. The third is publishing a peak while dropping the error column. Any one of those three will make a later review of how to run a web benchmark feel like starting over.

A fourth mistake is mixing clusters. The seed web benchmark is allowed to inform this page. A composite from an unrelated seed is not allowed to finish the claim. If someone pastes a plaintext crown into a discussion of how to run a web benchmark, ask which protocol, which payload, and which error gate they used. If they cannot answer, the paste is decoration.

A fifth mistake is skipping warm-up and then blaming the framework. JIT runtimes, page cache, and TLS session tickets all distort the first seconds. How you treat those seconds is part of how to run a web benchmark whether or not the original brief mentioned them.

Checklist before you claim how to run a web benchmark

If a box on that list is empty, you are not done with how to run a web benchmark. You are drafting. Drafts can live in a branch. They should not live in a decision memo.

Who owns how to run a web benchmark inside a company

Give the work a code owner. Platform teams usually own the harness. Product teams usually own the hypothesis, because only they know which route is expensive. Finance does not own how to run a web benchmark, but they will quote it. Write the sentence they are allowed to quote and put it at the top of the report.

On-call owns the dashboard that how to run a web benchmark is supposed to move. If on-call cannot find the panel in two minutes, the study will not change operations. That is not a documentation nit. That is how laboratory work dies after the launch channel goes quiet.

Security and privacy review the payload and the logs. A test that ships real user bodies into a load generator is not a study of how to run a web benchmark. It is an incident with extra steps. Use synthetic documents that match production shape.

Worked example in the web benchmark cluster

Suppose two engineers disagree about how to run a web benchmark after a runtime bump. They rerun the same pinned command on the reserved instance family. One run is client bound. The other used HTTP/2 without saying so. After both mistakes are labeled, the delta shrinks to a number that no longer funds a rewrite. That outcome is a success. Studies that only count rewrites as success will stay loud and stay wrong.

Suppose instead the rerun confirms a 35% p99 improvement on the route that is 40% of CPU. Then how to run a web benchmark has earned a migration design, not a migration. The design still needs an APM row, a rollback, and a field check. Lab wins that skip those three become next quarter’s incident review.

Keep raw JSON next to the Git SHA. If you cannot point at a file, you do not have a result for how to run a web benchmark. You have a memory. Memories do not survive staffing changes. Put the file path in the ticket before the meeting so the meeting cannot become a debate about vibes.

If this page is the first time someone on the team has seen the phrase how to run a web benchmark, send them the seed overview for web benchmark after they finish the checklist, not before. Reading the cluster in the wrong order is how long-tails collapse back into a single generic argument. Keep the long-tail sharp. That is the only reason this article exists as its own URL.