Skip to main content
Agency Program Get 2× more leads and save 50% on hosting. Built for agencies ready to grow. Book a call

We Benchmarked Our New Servers Against Our Old Ones: 3,600 Requests, Published in Full

A WordPress hosting benchmark with the method, the confounders and the gaps published alongside the numbers. 3,600 timed requests across two generations of our own servers: the block editor at 56 ms against 149 ms, wp-admin at 26 ms against 73 ms, plus a third-party score you can reproduce yourself.

NS
Neha Sharma
Content, InstaWP
Updated Sep 1, 2026 17 min read

Most hosting benchmarks ask you to take a number on faith. This one does not. Below are 3,600 timed requests, the exact method that produced them, every confounding variable we know about, the tests we could not run, and an offer of the raw per-request data so you can check our arithmetic.

We rebuilt the server fleet behind our managed WordPress hosting this year. This is the measurement of what that actually bought, run on 21 August 2026 against our own hardware, old and new.

Key Takeaways

Opening the block editor took 56 ms on the new generation against 149 ms on the previous one, and wp-admin took 26 ms against 73 ms. Admin screens are rebuilt on every request, so no page cache gives that time back.

The new machines are far more predictable. On the homepage, the slowest 1 request in 100 lands just 1.7 ms above the median, compared with 51 ms on the previous generation. Almost every request is the typical request.

3,600 timed requests and 0 failed responses across identical WordPress installs measured directly on the machines. The full test battery was run twice, showing the apparatus was stable to within 0.6%.

This is not a processor comparison. The two machines also differ in memory, neighbour count, virtualisation, and database tuning. The full confounder table is published below rather than buried.

What we did not measure: concurrency, competitors, visitor-perceived load time, and CDN delivery. Every gap is stated along with the reason we could not close it.

Why we ran this

Every WordPress page starts as nothing. The theme loads, the plugins fire, the queries run, and only then does HTML exist. That work happens on a CPU and it is the one part of your site a cache cannot skip.

WordPress builds a page in a single process, so what you feel is how fast one core can work, not how many there are. That is the whole reason our new generation looks the way it does: we optimised for faster cores. It also clears up a confusion that costs people money, because adding PHP workers does not make one page render faster, it lets more pages render at the same time. We pulled that apart in PHP workers vs CPU cores.

The claim we wanted to test was narrow: does a site on our new-generation hardware spend less time building a page than the same site on the generation it replaced?

How we measured

The metric is server think time: curl‘s time_starttransfer minus time_connect, which is the interval between the server accepting the request and the first byte of the response coming back. We measured on the machine itself, over HTTP to the box’s own address, through the real nginx to Apache to PHP-FPM path. No internet, no TLS handshake, no CDN in the way.

  • 100 requests per task, per server, with 10 warm-up requests discarded before each task.
  • The whole battery run twice on each server, to measure how much the apparatus itself drifts.
  • Percentiles by linear interpolation between closest ranks.
  • Load average captured immediately before and after every task, on both servers.
  • Response sizes compared byte for byte between the two servers on every task, so we are never timing two different pages.
  • 0 non-200 responses out of all 3,600 samples.

One methodological trap is worth describing because it very nearly spoiled the run. WordPress validates the auth cookie, not just the logged_in cookie, so an authenticated test built the obvious way silently benchmarks three login redirects instead of the admin screens. The harness now refuses to record a sample unless the request returns 200 with cookies, 302 without them, and the response body contains the admin menu and the test username and no login form. All four assertions run on both servers on every pass.

A run built that way would have silently benchmarked three login redirects.

InstaWP infrastructure team, benchmark report, 21 August 2026
Terminal output of the InstaWP latency measurement harness running, showing the authentication self-check passing, the microcache probe, and each of the nine scenarios completing with zero bad responses.
The harness running. Each scenario is preceded by an authentication self-check that hard-fails unless the request returns 200 with cookies and 302 without them, and unless the response body carries the admin menu and no login form. This is a short demonstration run at n = 15 captured on 31 August 2026 to show the method. The figures in the tables come from the 21 August run at n = 100. Host and domain are redacted.

The test site

The same site was built from scratch on both servers on the day of the test, from the same script.

Component Setting
WordPress 7.0.4, identical on both
Theme Twenty Twenty-Five
Plugins None active. One 40-line must-use plugin registering the AJAX endpoint
Content 41 posts with fixed titles, slugs, bodies, and dates
Permalinks /%postname%/
Caching No page cache, no persistent object cache, WP-Cron disabled
PHP 8.3 FPM, pm=ondemand, byte-identical pool configuration on both servers
OPcache 128 MB, JIT off, identical configuration on both servers

Both sites answered on the same domain string, so response bodies are byte-comparable. They were: page sizes matched exactly on all nine tests.

The two servers

One new-generation machine and one previous-generation machine, both picked to be typical rather than flattering. The previous-generation box is the median box of its group by site count, chosen from seven candidates, not the busiest or the quietest. If the difference between a dedicated machine and a virtualised one is new to you, we unpacked it in cloud hosting vs VPS.

Component New generation Previous generation
Machine Dedicated physical server Virtualised cloud instance
CPU 8-core AMD Zen 5, 16 threads 8 vCPU
CPU governor performance Not exposed to the guest
Memory 64 GB DDR5 16 GB
Storage NVMe SSD in a ZFS mirror ext4 on network block storage
Sites sharing the box 14 736
Load average at test time 0.20 0.26
PHP 8.3.33 8.3.30
MariaDB 11.4.12 11.4.10

Results: server think time

Server think time by task, median of 100 requests

Time the server spends building the page, measured on the machine itself. Lower is better. Identical WordPress install, content and theme on both servers, with no plugins active.

New-generation serverPrevious-generation server

Opening the block editor

56.3 ms
148.8 ms

Loading the homepage

35.3 ms
93.1 ms

Running a site search

36.9 ms
97.7 ms

Loading a blog post

34.3 ms
90.2 ms

Opening the posts list

26.7 ms
73.6 ms

Opening wp-admin

25.8 ms
72.8 ms

A REST API request

25.1 ms
69.2 ms

An AJAX request

16.9 ms
49.2 ms
0 ms80 ms160 ms

n = 100 requests per task per server, 10 warm-up requests discarded before each. 0 non-200 responses across all 3,600 samples. Measured 21 August 2026. The REST API row bypasses our 5-second nginx microcache, for the reason explained in the methodology section.

The full distribution, not just the middle of it. IQR is the interquartile range, the spread of the middle half of requests. A small IQR means the server is predictable.

Task Server Median (ms) IQR (ms) p95 (ms) p99 (ms)
Opening the block editor New gen 56.28 2.73 58.81 73.60
Previous gen 148.81 5.88 174.26 200.83
Loading the homepage New gen 35.29 0.49 36.79 36.96
Previous gen 93.07 3.31 122.30 144.22
Running a site search New gen 36.88 0.31 38.46 38.49
Previous gen 97.66 2.35 102.44 106.61
Loading a blog post New gen 34.30 1.83 36.09 36.30
Previous gen 90.21 2.14 95.08 104.83
Opening the posts list New gen 26.69 0.49 27.96 28.64
Previous gen 73.57 5.37 97.60 112.66
Opening wp-admin New gen 25.77 0.89 26.64 26.78
Previous gen 72.83 7.37 86.70 92.58
A REST API request New gen 25.11 1.32 27.37 27.77
Previous gen 69.23 3.79 102.98 106.20
An AJAX request New gen 16.92 0.26 17.55 19.40
Previous gen 49.17 6.84 84.82 94.19
Terminal output showing the stored 21 August benchmark JSON files on the server, a record read with jq, a raw sample slice, and the median, p95, p99 and IQR recomputed from the stored 100-sample arrays.
The 21 August dataset read back on the machine that produced it: the stored per-scenario JSON, one record opened, a slice of the raw per-request timings, and the median, p95, p99 and IQR recomputed from the stored 100-sample arrays. These are the numbers in the table above. Host, domain and address fields are redacted.

The block editor and wp-admin rows are the ones we care about most. They are what somebody building a site feels all day, and they are exactly what a page cache cannot fix, because an admin screen is built fresh every single time. Opening the block editor came in at 56 ms against 149 ms, a 93 ms saving on a single click that a site builder makes hundreds of times a day.

One honest wrinkle in that row: post-new.php writes an auto-draft row on every request, so it is partly a database write test, and the database configuration is the least matched thing between the two machines. Some of that gap is configuration rather than hardware. Both servers created an identical number of auto-drafts during the run and all of them were deleted afterwards.

The REST API row deserves a note too, because it corrects something we published earlier. Our nginx template puts a five-second microcache in front of /wp-json/ and nothing else, so a naive REST measurement compares two cache hits and tells you nothing about the server. Measured through the microcache the numbers are 0.04 ms and 0.23 ms, which are meaningless as a hardware comparison. The row in the table above bypasses the cache with a unique parameter per request, so every request is a genuine miss. That is the real number.

Consistency matters more than the average

The medians are the least interesting part of this dataset. The spread is the story.

The slowest requests, not just the typical one

The solid bar is the median request. The faded extension runs out to the 99th percentile, the slowest 1 request in 100. A short extension means almost every request behaves like the median one.

New-generation server Previous-generation server

Opening the block editor

56 to 74 ms
149 to 201 ms

Loading the homepage

35 to 37 ms
93 to 144 ms

Running a site search

37 to 38 ms
98 to 107 ms

Loading a blog post

34 to 36 ms
90 to 105 ms

Opening the posts list

27 to 29 ms
74 to 113 ms

Opening wp-admin

26 to 27 ms
73 to 93 ms
0 ms 105 ms 210 ms

The 99th percentile is reported descriptively. At n = 100, a confidence interval around a 99th percentile is not statistically valid, so we do not attach one.

On the new-generation server the homepage 99th percentile is 36.96 ms against a 35.29 ms median. That is a 1.7 ms tail: essentially every request is the median request. On the previous generation the same p99 is 144.22 ms against a 93.07 ms median, a 51 ms tail. The interquartile ranges say the same thing, 0.49 ms against 3.31 ms on the homepage and 0.26 ms against 6.84 ms on AJAX.

Predictability is worth more than a good average. An average is what a benchmark sees. A tail is what your visitor sees on the request that happens to land badly.

As for whether the apparatus itself is trustworthy: we ran the entire battery twice on both machines. Median drift between the two runs across all eighteen task-server pairs was 0.6 percent, and the worst drift on any real task was 3.3 percent. Against gaps of 160 to 190 percent, instrument noise is not what produced this result.

A benchmark we did not write: 9.8 against 7.3

Our own harness is our own harness. WP Benchmark is a free plugin from the WordPress repository that we did not write, and anyone can run it. We ran it on both machines on the same day with identical settings, alternating between them rather than batching.

Two notes on the cards below, because they are evidence and you should know exactly what they are. The plugin draws its results panel at a fixed 420 pixels with an 85 pixel label column, which makes the group labels overlap the rows beneath them, so we widened the panel and that column and captured at twice the pixel density to make the numbers legible. And the plugin stores only its most recent run, so the two object-cache-enabled cards are its own saved output while the two skipped-cache cards were regenerated from the per-test scores we recorded on the day, through the plugin’s own markup. We proved that template first by regenerating a card we still had and matching it byte for byte. No benchmark was re-run and no score was altered.

WP Benchmark results card for a WordPress site on an InstaWP new-generation server with the persistent object cache tests skipped, showing per-test scores and a final server score of 9.8 out of 10.
New-generation server, persistent object cache tests skipped. Final server score 9.8 out of 10. Regenerated from the per-test scores recorded on the day, through the plugin’s own markup, because the plugin keeps only its most recent run.
WP Benchmark results card for the same WordPress site on an InstaWP previous-generation server with the persistent object cache tests skipped, showing per-test scores and a final server score of 7.3 out of 10.
Previous-generation server. Same site, same settings, same day. Final server score 7.3 out of 10. Regenerated the same way as the card above.

9.8 against 7.3, on a tool we do not control. The new-generation figure also reproduces the 9.7 we measured on 29 July, on a different day and a different site, which is a useful stability check on a number we had only ever recorded once.

Read that gap as a floor rather than a measurement. Nineteen of the thirty new-generation sub-tests sit at exactly 10.0, the top of the plugin’s scale, so wherever the new machine hits the ceiling the real difference is at least what the score implies and probably more. It also means these scores cannot be turned into speed multipliers. For multipliers, use the compute figures above, where the units are real.

Image processing is where the older machine struggles most: 3.76 to 4.98 across three of its four image sub-tests, against 9.37 to 10 on the new one. That is not an abstract workload. It is what happens every time somebody uploads a photo to the media library.

And since we are publishing the screenshot rather than describing it, the new-generation card is not flawless either. Content filtering 8.7, recursive mathematical calculations 8.55, image quality conversion 9.37, multiple thumbnail generation 9.38, REGEX processing 9.4.

One obvious objection: the July report had part of the benchmark switched off, so would a complete run have looked worse? We checked. With the persistent object cache tests enabled the new generation still scores 9.8, with all four object-cache sub-tests landing on 10. The previous generation scores 7.2 with them on, against 7.3 with them off.

WP Benchmark results card for a WordPress site on an InstaWP new-generation server with the persistent object cache tests enabled, showing all four object cache sub-tests at 10 and a final server score of 9.8 out of 10.
New-generation server with the persistent object cache tests enabled. Final server score 9.8, unchanged from the run with them skipped, and all four object-cache sub-tests at 10. This one is the plugin’s own saved output.
WP Benchmark results card for the same WordPress site on an InstaWP previous-generation server with the persistent object cache tests enabled, showing the mixed usage sub-test scoring zero and a final server score of 7.2 out of 10.
Previous-generation server with the object cache tests enabled. Final server score 7.2, the plugin’s own saved output. Note the mixed usage row sitting at zero, which is the timeout artefact explained below.

That last number needs a warning, and it cuts in a direction that does not flatter the comparison. On this plugin a test that blows its twenty-second ceiling is recorded as 0 ms and averaged in as though it had been instant, which pulls the average down and makes a struggling machine look faster. On the previous-generation box the object cache mixed-usage test timed out on all five iterations, and the read test on two of five. Its 7.2 is therefore flattered by those failures rather than penalised by them, and its object-cache sub-scores should not be read as a statement about object caching.

What else was different besides the hardware

This is the section most hosting benchmarks leave out, so here it is first rather than last. The two machines differ in more than their processors, and every one of those differences pushes the result in the same direction.

What differs New generation Previous generation Effect
Memory 64 GB 16 GB more headroom
Sites sharing the machine 14 736 53× fewer neighbours
Machine type Dedicated hardware Virtual machine No hypervisor overhead
Database buffer pool 1.5 GB 768 MB larger
Database log file 2 GB 256 MB larger
Memory pressure during the run 3 MB of swap in use 4.4 GB of swap in use The older box was under real pressure
Storage Local NVMe Network block storage Lower latency

So read the table above as a comparison of two production environments as they actually run, which is the thing that affects a real customer, and not as a controlled comparison of two processors. We are not claiming the new CPU is two and a half times faster than the old one. We are saying a site on the new generation spends this much less time building a page than the same site on the generation it replaced, and here is every reason why beyond the silicon.

Two of those rows deserve to be said out loud. Our previous-generation servers carry far more sites each than the new ones, so part of this gap is neighbour load rather than hardware. And the previous-generation machine was 4.4 GB into swap during the test. That is a capacity decision we made, not a defect in the machine, and it is a fair description of what that generation is like to be hosted on today.

Nothing came out worse on the new generation, and that is itself worth flagging. A clean sweep with no counter-example anywhere in 1,800 paired samples is what you get when the comparison is not isolating one variable.

InstaWP infrastructure team, benchmark report, 21 August 2026

What we did not measure

  • Concurrency. Every number here is a single request at a time. Our plans differ in PHP worker count rather than in raw speed, which means a bigger plan buys you headroom under simultaneous traffic rather than a faster single page. That is precisely the thing this dataset says nothing about. We have no spare machine to load test without putting live customer sites in the blast radius, so we are not publishing a concurrency number rather than publishing a bad one.
  • Competitors. We have not benchmarked other hosts. Most host terms of service prohibit load testing anyway, so a head-to-head under load is not something we can lawfully produce. The established venue for that is Review Signal’s WordPress Hosting Benchmarks, which is independent and opt-in.
  • What your visitor experiences. This is generation time on the server. A real page load also includes network distance, which is a point-of-presence question rather than a processor one, plus images, fonts and third-party scripts, and those can easily dwarf the numbers here.
  • Client-side and CDN delivery. Not in this round. Anonymous HTML on our paid plans is edge-cached, so an external measurement mostly measures the CDN unless you go out of your way to prove the origin executed.
  • A same-machine null test. Two identical sites on one box, measured as though they were different hosts, is the proper way to establish the noise floor of the apparatus. It is queued and not finished. Until it is, treat the run-to-run drift figure above as our best available estimate rather than a formal noise floor.

Where a faster server does not help

A faster machine shrinks the baseline. It does not fix a plugin doing something expensive. If your dashboard is slow, the cause is more often a heavy plugin, a bloated database or an external API call firing on every admin page than it is the hardware underneath. We went through the usual suspects in why is my WordPress site slow despite good hosting, and most of them are still true on the fastest machine we own.

Faster cores are also not a replacement for caching, they are the complement to it. Object cache spares WordPress the repeat database work, and faster cores speed up everything that still has to be built from scratch. For anonymous visitors a page cache does most of the work and we recommend it. For wp-admin, the editor, the cart and checkout, nothing is cached and the processor is what you feel. That is exactly why we lead on the admin numbers. If you want the caching side of this, we wrote up how object caching works on InstaWP and the difference between a CDN and a cache.

Run it yourself, and take our raw data

Two ways to check us. Install WP Benchmark from the WordPress repository and run it on your own site. It is the same tool that produced the report above and we have no control over what it says. If you would rather test on something disposable than on a live site, spin up a staging site first.

Wrapping up

A site on our new-generation servers builds an admin page in about a third of the time the previous generation took, and it does it far more consistently. Part of that is faster cores, part of it is more memory, and part of it is fewer neighbours. We have shown you which is which as far as we can measure it, and we have told you what we have not measured yet.

The rollout is regional and still in progress, so not every site is on the new generation yet and we are not going to promise you a date. If you want to see what it feels like, the plans are on our managed WordPress hosting page and billing is pay as you go. If your workload does not fit a standard plan, we build to order up to 96 cores with memory and NVMe sized to match, and you can talk to us about it.

For the wider picture of what runs underneath a site here, our cloud stack breakdown covers the rest of the layers. And if you are moving a site over to see the difference for yourself, staging to production walks through the safe way to do it.

NS
Neha Sharma
Content, InstaWP

Neha writes practical WordPress tutorials and agency playbooks, with a focus on dev workflows and AI building.