{"id":39336,"date":"2025-09-18T08:16:35","date_gmt":"2025-09-18T06:16:35","guid":{"rendered":"https:\/\/tremhost.com\/blog\/?p=39336"},"modified":"2025-09-18T08:16:35","modified_gmt":"2025-09-18T06:16:35","slug":"vps-for-wordpress-woocommerce-real-benchmarks-setup-steps","status":"publish","type":"post","link":"https:\/\/tremhost.com\/blog\/vps-for-wordpress-woocommerce-real-benchmarks-setup-steps\/","title":{"rendered":"VPS for WordPress\/WooCommerce: Real Benchmarks &#038; Setup Steps"},"content":{"rendered":"<div id=\"bsf_rt_marker\"><\/div><h1>VPS for WordPress\/WooCommerce: Real Benchmarks &amp; Setup Steps<\/h1>\n<p>Most WordPress sites hum on <strong>2 vCPU \/ 4 GB NVMe<\/strong>. Busy blogs\/light stores feel great on <strong>4 vCPU \/ 8 GB<\/strong> with Redis and a tuned DB. Promo-heavy WooCommerce is safest at <strong>8 vCPU \/ 16 GB<\/strong> (often with a separate DB). Aim for <strong>p95 &lt;100\u2013200 ms<\/strong> on cached pages and <strong>p95 &lt;300\u2013600 ms<\/strong> on key dynamic pages (cart\/checkout). Start smaller only if your provider supports <strong>instant upgrades<\/strong>.<\/p>\n<blockquote><p>Quiet plug: <strong>Tremhost VPS<\/strong> ships NVMe storage, instant resize, snapshots, and optional panels\u2014ideal for WP\/Woo stacks without hassle.<\/p><\/blockquote>\n<h2>Quick Sizing Matrix (Decide in 60 seconds)<\/h2>\n<table>\n<thead>\n<tr>\n<th>Use case<\/th>\n<th align=\"right\">Peak concurrent users<\/th>\n<th align=\"right\">Baseline<\/th>\n<th align=\"right\">Comfortable<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Company site \/ blog (cached)<\/td>\n<td align=\"right\">&lt;20<\/td>\n<td align=\"right\"><strong>1 vCPU \/ 2 GB<\/strong><\/td>\n<td align=\"right\"><strong>2 vCPU \/ 4 GB<\/strong><\/td>\n<\/tr>\n<tr>\n<td>WordPress w\/ plugins<\/td>\n<td align=\"right\">20\u201360<\/td>\n<td align=\"right\"><strong>2 vCPU \/ 4 GB<\/strong><\/td>\n<td align=\"right\"><strong>4 vCPU \/ 8 GB<\/strong><\/td>\n<\/tr>\n<tr>\n<td>WooCommerce (light)<\/td>\n<td align=\"right\">10\u201340<\/td>\n<td align=\"right\"><strong>2 vCPU \/ 4 GB<\/strong><\/td>\n<td align=\"right\"><strong>4 vCPU \/ 8 GB<\/strong><\/td>\n<\/tr>\n<tr>\n<td>WooCommerce (promo\/busy)<\/td>\n<td align=\"right\">60\u2013150<\/td>\n<td align=\"right\"><strong>4 vCPU \/ 8 GB<\/strong><\/td>\n<td align=\"right\"><strong>8 vCPU \/ 16 GB<\/strong><\/td>\n<\/tr>\n<tr>\n<td>Multi-site w\/ control panel<\/td>\n<td align=\"right\">mixed<\/td>\n<td align=\"right\"><strong>4 vCPU \/ 8 GB<\/strong><\/td>\n<td align=\"right\"><strong>6\u20138 vCPU \/ 12\u201316 GB<\/strong><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><em>Panels add 1\u20132 GB baseline RAM; plan accordingly.<\/em><\/p>\n<h2>\u201cRealistic results\u201d targets (to sanity-check performance)<\/h2>\n<p>These are practical ranges on clean NVMe VPSs with the setup below. Treat them as targets, not absolutes\u2014themes, plugins, and CDNs matter.<\/p>\n<table>\n<thead>\n<tr>\n<th>VPS size<\/th>\n<th align=\"right\">Cached pages (req\/s)<\/th>\n<th align=\"right\">p95 cached<\/th>\n<th align=\"right\">Woo dynamic (req\/s)<\/th>\n<th align=\"right\">p95 dynamic<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><strong>2 vCPU \/ 4 GB<\/strong><\/td>\n<td align=\"right\">500\u2013900<\/td>\n<td align=\"right\">120\u2013200 ms<\/td>\n<td align=\"right\">30\u201360<\/td>\n<td align=\"right\">500\u2013800 ms<\/td>\n<\/tr>\n<tr>\n<td><strong>4 vCPU \/ 8 GB<\/strong><\/td>\n<td align=\"right\">800\u20131,200<\/td>\n<td align=\"right\">90\u2013160 ms<\/td>\n<td align=\"right\">60\u2013100<\/td>\n<td align=\"right\">350\u2013650 ms<\/td>\n<\/tr>\n<tr>\n<td><strong>8 vCPU \/ 16 GB<\/strong><\/td>\n<td align=\"right\">1,100\u20131,800<\/td>\n<td align=\"right\">70\u2013140 ms<\/td>\n<td align=\"right\">90\u2013120<\/td>\n<td align=\"right\">300\u2013500 ms<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><strong>Good TTFB goals:<\/strong> cached <strong>&lt;100\u2013200 ms<\/strong> in-region; dynamic <strong>&lt;300\u2013600 ms<\/strong>.<\/p>\n<h2>How to test (no scripts needed)<\/h2>\n<ul>\n<li><strong>Run two scenarios:<\/strong>\n<ol>\n<li><strong>Cached<\/strong>: homepage\/blog listing with page cache warm.<\/li>\n<li><strong>Dynamic<\/strong>: product \u2192 add-to-cart \u2192 cart \u2192 checkout (no full-page cache).<\/li>\n<\/ol>\n<\/li>\n<li><strong>Use simple tools:<\/strong> an online load tester (Loader.io, k6 Cloud, etc.), plus your host\u2019s monitoring for CPU\/RAM\/disk and HTTP response times.<\/li>\n<li><strong>What to watch:<\/strong> p95 latency, cache hit rate, CPU saturation (&gt;70%), RAM (&gt;85% with swap activity), and iowait (backup jobs or slow disks).<\/li>\n<\/ul>\n<p>If numbers are far off: your cache isn\u2019t hitting, DB is slow (missing indexes\/autoload bloat), or PHP workers are saturated.<\/p>\n<h2>30-Minute Setup That Actually Performs<\/h2>\n<p><strong>Core stack (fast + stable):<\/strong><\/p>\n<ul>\n<li><strong>Web server + cache:<\/strong> LiteSpeed\/LSCache (or NGINX FastCGI cache)<\/li>\n<li><strong>PHP:<\/strong> 8.2\/8.3 with opcache on<\/li>\n<li><strong>Object cache:<\/strong> Redis for sessions and queries<\/li>\n<li><strong>DB:<\/strong> MariaDB 10.6+ or MySQL 8, tuned buffer pool<\/li>\n<li><strong>Transport:<\/strong> HTTP\/3 + TLS 1.3<\/li>\n<li><strong>Storage:<\/strong> NVMe SSD (non-negotiable)<\/li>\n<\/ul>\n<p><strong>Key switches to flip:<\/strong><\/p>\n<ol>\n<li>Full-page cache for all public pages.<\/li>\n<li><strong>Exclude from cache:<\/strong> <code>\/cart\/<\/code>, <code>\/checkout\/<\/code>, <code>\/my-account\/<\/code>.<\/li>\n<li>Enable Redis object cache; keep it off the default DB.<\/li>\n<li>Size the database buffer pool to ~30\u201350% of RAM (start conservative).<\/li>\n<li>Replace WP pseudo-cron with a real cron (every 2\u20135 min).<\/li>\n<li>Daily backups + weeklies; perform a <strong>test restore<\/strong> (file + DB table).<\/li>\n<li>Security basics: AutoSSL, current WAF rules, rate-limit <code>\/wp-login.php<\/code>, restrict <code>\/xmlrpc.php<\/code>, 2FA for admins.<\/li>\n<\/ol>\n<h2>Tuning That Moves the Needle (and nothing else)<\/h2>\n<ul>\n<li><strong>Caching first:<\/strong> page cache + Redis object cache.<\/li>\n<li><strong>Trim plugins<\/strong> that run on every request or hammer the DB.<\/li>\n<li><strong>Images:<\/strong> serve WebP, preload key fonts, lazy-load correctly.<\/li>\n<li><strong>Email:<\/strong> use a transactional SMTP API for orders\/notifications.<\/li>\n<li><strong>Backups:<\/strong> run off-peak; keep 20\u201330% free disk for snapshots and logs.<\/li>\n<\/ul>\n<h2>Upgrade vs Split: Clear Rules<\/h2>\n<p><strong>Upgrade the VPS<\/strong> when (during peak) two or more are true:<\/p>\n<ul>\n<li>CPU &gt; <strong>70%<\/strong> sustained or host \u201csteal\u201d time &gt; 5\u201310%<\/li>\n<li>RAM &gt; <strong>85%<\/strong> with noticeable swap use<\/li>\n<li>p95 latency keeps rising despite good cache hit rate<\/li>\n<\/ul>\n<p><strong>Split roles (web vs DB)<\/strong> when:<\/p>\n<ul>\n<li>DB slow queries dominate even with spare web CPU<\/li>\n<li>Imports\/reports impact front-end latency<\/li>\n<li>You need separate maintenance windows<\/li>\n<\/ul>\n<p>Common path: <strong>4 vCPU \/ 8 GB \u2192 8 vCPU \/ 16 GB \u2192 separate DB (4 vCPU \/ 8 GB)<\/strong>.<\/p>\n<h2>Troubleshooting quick map<\/h2>\n<ul>\n<li><strong>Cached pages slow<\/strong> \u2192 cache headers wrong, cookie variance, CDN overrides.<\/li>\n<li><strong>Woo checkout slow<\/strong> \u2192 missing indexes, overloaded options table, heavy payment\/webhook plugins.<\/li>\n<li><strong>High iowait<\/strong> \u2192 NVMe missing or backups colliding with traffic; reschedule jobs.<\/li>\n<li><strong>PHP pegged<\/strong> \u2192 too few workers or slow code; modestly raise workers or add vCPU after profiling.<\/li>\n<\/ul>\n<h2>What to promise clients (agency copy you can reuse)<\/h2>\n<ul>\n<li>\u201c<strong>LiteSpeed + NVMe + Redis<\/strong> for real-world speed.\u201d<\/li>\n<li>\u201c<strong>Daily backups + on-demand restore<\/strong>, tested monthly.\u201d<\/li>\n<li>\u201c<strong>SPF\/DKIM\/DMARC set up<\/strong> for better inbox reach.\u201d<\/li>\n<li>\u201cWooCommerce cut through checkout under load\u2014<strong>cart\/checkout never cached<\/strong>.\u201d<\/li>\n<\/ul>\n<blockquote><p>Hosting multiple sites? <strong>Tremhost VPS<\/strong> pairs nicely with <strong>Reseller Hosting<\/strong> for white-label, billing, and migrations.<\/p><\/blockquote>\n<h2>FAQs (People Also Ask)<\/h2>\n<p><strong>Is 2 vCPU \/ 4 GB enough for Woo?<\/strong><br \/>\nFor light stores, yes\u2014if caching and Redis are in place. Promo bursts or complex plugins do better on <strong>4 vCPU \/ 8 GB<\/strong>.<\/p>\n<p><strong>LiteSpeed or NGINX?<\/strong><br \/>\nBoth are excellent. LiteSpeed + LSCache is turnkey for WordPress; NGINX FastCGI cache is great if you prefer manual control.<\/p>\n<p><strong>Do I need Redis?<\/strong><br \/>\nFor WooCommerce and plugin-heavy sites, yes. It cuts database trips and stabilizes p95 latency.<\/p>\n<p><strong>How often should I test restores?<\/strong><br \/>\nMonthly. If you haven\u2019t restored, you don\u2019t have a backup\u2014you have files.<\/p>\n<p>Need a VPS that hits these targets and scales in seconds? <strong>Tremhost VPS<\/strong> offers NVMe, instant resize, snapshots, and 24\/7 support. If you host clients, pair it with <strong>Reseller Hosting<\/strong> to add white-label, billing, and zero-drama migrations<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>VPS for WordPress\/WooCommerce: Real Benchmarks &amp; Setup Steps Most WordPress sites hum on 2 vCPU \/ 4 GB NVMe. Busy blogs\/light stores feel great on 4 vCPU \/ 8 GB with Redis and a tuned DB. Promo-heavy WooCommerce is safest at 8 vCPU \/ 16 GB (often with a separate DB). Aim for p95 &lt;100\u2013200 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":39255,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"tdm_status":"","tdm_grid_status":"","footnotes":""},"categories":[163],"tags":[],"class_list":{"0":"post-39336","1":"post","2":"type-post","3":"status-publish","4":"format-standard","5":"has-post-thumbnail","7":"category-hosting"},"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/tremhost.com\/blog\/wp-json\/wp\/v2\/posts\/39336","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/tremhost.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/tremhost.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/tremhost.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/tremhost.com\/blog\/wp-json\/wp\/v2\/comments?post=39336"}],"version-history":[{"count":1,"href":"https:\/\/tremhost.com\/blog\/wp-json\/wp\/v2\/posts\/39336\/revisions"}],"predecessor-version":[{"id":39337,"href":"https:\/\/tremhost.com\/blog\/wp-json\/wp\/v2\/posts\/39336\/revisions\/39337"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/tremhost.com\/blog\/wp-json\/wp\/v2\/media\/39255"}],"wp:attachment":[{"href":"https:\/\/tremhost.com\/blog\/wp-json\/wp\/v2\/media?parent=39336"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/tremhost.com\/blog\/wp-json\/wp\/v2\/categories?post=39336"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/tremhost.com\/blog\/wp-json\/wp\/v2\/tags?post=39336"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}