{"id":25,"date":"2026-06-06T21:48:56","date_gmt":"2026-06-06T21:48:56","guid":{"rendered":"https:\/\/softwareproduction.eu\/wordpress\/?p=25"},"modified":"2026-06-06T23:45:38","modified_gmt":"2026-06-06T23:45:38","slug":"load-testing-results-15x-faster-5x-more-capacity","status":"publish","type":"post","link":"https:\/\/softwareproduction.eu\/?p=25","title":{"rendered":"Load Testing Results \u2014 15\u00d7 Faster, 5\u00d7 More Capacity"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\"><em>Nineteenth in a series about migrating from legacy architectures to a modern Nuxt 4 stack.<\/em><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Architecture Decisions Have Consequences \u2014 Measure Them<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Architecture decisions accumulate, and their combined effect only becomes visible under real load.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Before production, a large enterprise application was load-tested with production-equivalent patterns, not synthetic traffic. k6 replayed a model derived from real production logs: 20 pages, weighted by actual traffic share.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">The Headline Numbers<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>Metric<\/th><th style=\"text-align:center\">Legacy System<\/th><th style=\"text-align:center\">New System<\/th><th style=\"text-align:center\">Change<\/th><\/tr><\/thead><tbody><tr><td><strong>Median response time<\/strong><\/td><td style=\"text-align:center\">2,618 ms<\/td><td style=\"text-align:center\">165 ms<\/td><td style=\"text-align:center\"><strong>15.9\u00d7 faster<\/strong><\/td><\/tr><tr><td><strong>Error rate<\/strong> (1\u00d7 prod load)<\/td><td style=\"text-align:center\">3.91%<\/td><td style=\"text-align:center\">0.09%<\/td><td style=\"text-align:center\"><strong>97% lower<\/strong><\/td><\/tr><tr><td><strong>Max tested capacity<\/strong><\/td><td style=\"text-align:center\">~99 RPM<\/td><td style=\"text-align:center\">494+ RPM<\/td><td style=\"text-align:center\"><strong>5\u00d7 more<\/strong><\/td><\/tr><tr><td><strong>Infrastructure<\/strong><\/td><td style=\"text-align:center\">3\u00d7 fixed VMs (24 vCPU, 96 GB)<\/td><td style=\"text-align:center\">Auto-scaled containers<\/td><td style=\"text-align:center\"><strong>Elastic<\/strong><\/td><\/tr><tr><td><strong>Lighthouse Performance<\/strong> (mobile)<\/td><td style=\"text-align:center\">~50<\/td><td style=\"text-align:center\">97+<\/td><td style=\"text-align:center\"><strong>Near-perfect<\/strong><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">A 2.6-second median means the <em>better half<\/em> of requests still took 2.6 seconds. A 165 ms median means the page renders before a user can blink.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Test Methodology<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Traffic Pattern<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The load test replayed production-equivalent traffic using k6&#8217;s HTTP module:<\/p>\n\n\n\n<pre class=\"mermaid\">pie showData\n  title Traffic Distribution (top 10 pages)\n  \"Homepage (28%)\" : 28\n  \"Product Overview (19%)\" : 19\n  \"Product Details (14%)\" : 14\n  \"Checkout Step 1 (9%)\" : 9\n  \"FAQ (7%)\" : 7\n  \"Contact (6%)\" : 6\n  \"About (5%)\" : 5\n  \"Legal \/ Imprint (4%)\" : 4\n  \"Blog Overview (3%)\" : 3\n  \"Other (11 pages) (5%)\" : 5<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Test Types<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Two test types were run:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Replay Test<\/strong> \u2014 constant load at 1\u00d7 production traffic (99 RPM) for 30 minutes  <\/li>\n<li><strong>Ramp Test<\/strong> \u2014 linear ramp from 1\u00d7 to 5\u00d7 production traffic over 30 minutes<\/li>\n<\/ol>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Replay Test: 1\u00d7 Production Load<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The replay test answers: <em>&#8220;Can the new system handle current production traffic?&#8221;<\/em><\/p>\n\n\n\n<pre class=\"mermaid\">flowchart TB\n  title[\"Replay Test Results (1\u00d7 production load = 99 RPM)\"]\n\n  subgraph Legacy_System[\"Legacy System\"]\n    L_Median[\"Median RT: 2,618 ms\"]\n    L_P95[\"P95 RT: 8,500+ ms\"]\n    L_Error[\"Error Rate: 3.91%\"]\n    L_RPM[\"Requests\/min: 99\"]\n    L_Status[\"Status: Degraded\"]\n  end\n\n  subgraph New_System[\"New System\"]\n    N_Median[\"Median RT: 168 ms\"]\n    N_P95[\"P95 RT: 450 ms\"]\n    N_Error[\"Error Rate: 0.09%\"]\n    N_RPM[\"Requests\/min: 99\"]\n    N_Status[\"Status: Healthy\"]\n  end\n\n  L_Median --- N_Median\n  L_P95 --- N_P95\n  L_Error --- N_Error\n  L_RPM --- N_RPM\n  L_Status --- N_Status<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The new system handles production traffic with 96% lower response times and 97% fewer errors. The P95 at 450 ms means even the slowest 5% of requests are faster than the legacy system&#8217;s <em>median<\/em>.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Ramp Test: Finding the Ceiling<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The ramp test answers: <em>&#8220;How far can we push it before it breaks?&#8221;<\/em><\/p>\n\n\n\n<pre class=\"mermaid\">xychart-beta\n  title \"Ramp Test Results (1\u00d7 \u2192 5\u00d7 production load)\"\n  x-axis \"Load (\u00d7 production)\" [1, 2, 3, 4, 5]\n  y-axis \"Response Time (ms)\"\n  line [2618, 4000, 5000, 6000, 8800]\n  line [165, 165, 165, 165, 165]<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The median <strong>stayed flat at 165 ms<\/strong> even at 5\u00d7 load. There was no linear degradation: additional load did not increase per-request latency.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The P95 degraded to 8.8 seconds at 5\u00d7, driven by scale-out lag. New replicas needed time to start; once they were online, they matched existing replica performance.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">The Right-Sizing Experiment<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Finding the <strong>minimum viable resource allocation<\/strong> is a critical part of load testing. Four configurations were tested:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>Config<\/th><th>vCPU<\/th><th>RAM<\/th><th>PM2 Workers<\/th><th>V8 Heap<\/th><th>Result<\/th><\/tr><\/thead><tbody><tr><td>#1<\/td><td>4<\/td><td>8 GiB<\/td><td>3<\/td><td>2048 MB<\/td><td>\u2705 Stable, over-provisioned<\/td><\/tr><tr><td>#2<\/td><td>2<\/td><td>4 GiB<\/td><td>2<\/td><td>1536 MB<\/td><td>\u2705 Stable, efficient<\/td><\/tr><tr><td>#3<\/td><td>1<\/td><td>2 GiB<\/td><td>2<\/td><td>1024 MB<\/td><td>\u274c Cascading failures<\/td><\/tr><tr><td>#4<\/td><td>2<\/td><td>4 GiB<\/td><td>2<\/td><td>1536 MB<\/td><td>\u2705 Validated (6\u00d7 load)<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<pre class=\"mermaid\">flowchart LR\n  A[\"Config #1: 4 vCPU \/ 8 GiB \/ 3 workers \/ 2048 MB heap\"] --&gt;|Over-provisioned| B[\"Config #2: 2 vCPU \/ 4 GiB \/ 2 workers \/ 1536 MB heap\"]\n  B --&gt;|Right-size further| C[\"Config #3: 1 vCPU \/ 2 GiB \/ 2 workers \/ 1024 MB heap\"]\n  C --&gt;|Cascading failures| D[\"Config #4: 2 vCPU \/ 4 GiB \/ 2 workers \/ 1536 MB heap (Validated at 6\u00d7 load)\"]<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">The Failed Right-Sizing (Config #3)<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Reducing to 1 vCPU \/ 2 GiB caused a cascade:<\/p>\n\n\n\n<pre class=\"mermaid\">sequenceDiagram\n  participant L as Load Generator\n  participant R1 as Replica 1\n  participant R2 as Replica 2\n  participant R3 as Replica 3\n  participant HP as Health Probe\n\n  Note over R1,R3: Failure Cascade at 1 vCPU \/ 2 GiB\n\n  L-&gt;&gt;R1: t=0s: Traffic (99 RPM)\n  Note over R1: Memory: 1,791 \/ 2,048 MB (87.5%)\n\n  R1--&gt;&gt;R1: t=10s: V8 GC stalls&lt;br\/&gt;Event loop blocked\n  HP-&gt;&gt;R1: t=15s: Health probe\n  HP--&gt;&gt;HP: Timeout\n  HP-&gt;&gt;R1: Mark unhealthy \u2192 restart\n\n  Note over R2: t=20s: Absorbs 2\u00d7 traffic\n  L-&gt;&gt;R2: Increased traffic\n\n  R2--&gt;&gt;R2: t=25s: Memory spike \u2192 restart\n  Note over R3: t=30s: Overloaded \u2192 restart\n\n  Note over R1,R3: t=35s: All replicas restarting\n  Note over L: t=45s: Zero capacity for ~10 seconds&lt;br\/&gt;\u2192 5% error rate<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">V8 needs breathing room. At 87.5% heap utilization, GC pauses block the event loop long enough for health probes to time out. The minimum viable compute here was 2 vCPU \/ 4 GiB, though the exact threshold depends on application complexity, page weight, and caching. The principle is general; the numbers are specific.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">The Validated Production Configuration<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The configuration that passed k6&#8217;s exit-code-0 threshold at 6\u00d7 production load:<\/p>\n\n\n\n<pre class=\"mermaid\">flowchart TB\n  subgraph SPA[\"SPA Containers\"]\n    SPA_CPU[\"CPU: 2 vCPU\"]\n    SPA_MEM[\"Memory: 4 GiB\"]\n    SPA_PM2[\"PM2 Workers: 2 per container\"]\n    SPA_HEAP[\"V8 Heap: 1536 MB (--max-old-space-size=1536)\"]\n    SPA_MIN[\"Min Replicas: 5\"]\n    SPA_MAX[\"Max Replicas: 20\"]\n  end\n\n  subgraph API[\"API Containers\"]\n    API_CPU[\"CPU: 0.5 vCPU\"]\n    API_MEM[\"Memory: 1 GiB\"]\n    API_MIN[\"Min Replicas: 3\"]\n    API_MAX[\"Max Replicas: 20\"]\n  end\n\n  subgraph Results[\"Result at 6\u00d7 load\"]\n    RES_MED[\"Median RT: 165 ms\"]\n    RES_ERR[\"Error rate: 0.82%\"]\n    RES_CPU[\"CPU peak: 12% of allocation\"]\n    RES_MEM[\"Memory peak: 60% of allocation\"]\n  end\n\n  SPA --&gt; Results\n  API --&gt; Results<\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Cost Analysis<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">50% less CPU and 50% less memory per replica compared to the initial over-provisioned config:<\/p>\n\n\n\n<pre class=\"mermaid\">flowchart TB\n  subgraph Legacy[\"Legacy (fixed)\"]\n    L1[\"3\u00d7 VM instances\"]\n    L2[\"24 vCPU, 96 GB RAM \u2014 always on\"]\n    L3[\"Cost: constant regardless of traffic\"]\n  end\n\n  subgraph New[\"New (elastic)\"]\n    N1[\"5\u201320 SPA replicas (2 vCPU, 4 GiB each)\"]\n    N2[\"3\u201320 API replicas (0.5 vCPU, 1 GiB each)\"]\n    N3[\"Per-second billing \u2014 pay for actual usage\"]\n    N4[\"At idle: 5 SPA + 3 API\"]\n    N5[\"At peak: 15 SPA + 8 API\"]\n    N6[\"Average: ~60% of peak capacity billed\"]\n  end\n\n  Legacy --&gt;|\"Migrated to\"| New<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Elastic billing lowers cost during low-traffic periods \u2014 nights, weekends, and holidays \u2014 while still scaling for spikes without permanent over-provisioning.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">What the Numbers Mean for Architecture<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Each architecture decision from earlier articles contributed to these numbers:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>Decision<\/th><th>Contribution<\/th><\/tr><\/thead><tbody><tr><td>SSR (Article 1)<\/td><td>Eliminates client-side rendering delay<\/td><\/tr><tr><td>GraphQL Gateway (Article 2)<\/td><td>Single query per page instead of 3\u20135 REST calls<\/td><\/tr><tr><td>Multi-Tier Cache (Article 6)<\/td><td>Sub-ms content retrieval for cached pages<\/td><\/tr><tr><td>Deferred Hydration (Article 6)<\/td><td>Eliminates render-blocking JavaScript<\/td><\/tr><tr><td>Same-Origin Image Proxy (Article 6)<\/td><td>Improves LCP by reducing cross-origin overhead<\/td><\/tr><tr><td>PM2 Cluster Mode (Article 10)<\/td><td>Zero-downtime worker restarts<\/td><\/tr><tr><td>Container Apps Auto-Scaling (Article 11)<\/td><td>Elastic capacity, no over-provisioning<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<pre class=\"mermaid\">flowchart LR\n  SSR[\"SSR\"] --&gt; PERF[\"Lower TTFB &amp; faster first paint\"]\n  GQL[\"GraphQL Gateway\"] --&gt; PERF\n  CACHE[\"Multi-Tier Cache\"] --&gt; PERF\n  HYDR[\"Deferred Hydration\"] --&gt; PERF\n  IMG[\"Same-Origin Image Proxy\"] --&gt; PERF\n  PM2[\"PM2 Cluster Mode\"] --&gt; REL[\"Resilience &amp; zero-downtime deploys\"]\n  AS[\"Container Apps Auto-Scaling\"] --&gt; CAP[\"Elastic capacity\"]\n\n  PERF --&gt; OUT[\"15.9\u00d7 faster median\\nLighthouse 97+\"]\n  REL --&gt; OUT\n  CAP --&gt; OUT<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">No single decision produces 15.9\u00d7. It is the <strong>combination<\/strong> \u2014 each one removing a different bottleneck \u2014 that delivers the aggregate result.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Lessons Learned<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Load test with production traffic patterns, not synthetic ones<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">A synthetic test hitting the homepage 100 times per second says nothing about real-world performance. Real traffic has a distribution \u2014 heavy pages, light pages, API calls, form submissions. The test must match it.<\/p>\n\n\n\n<pre class=\"mermaid\">flowchart LR\n  A[\"Synthetic test: 100 req\/s to homepage\"] --&gt;|Misleading| C[\"Unrealistic bottlenecks\"]\n  B[\"Production-equivalent mix:\\nheavy pages, light pages, APIs, forms\"] --&gt;|Accurate| D[\"Realistic capacity &amp; latency insights\"]<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Right-sizing failures are the most valuable test results<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The cascading failure at 1 vCPU \/ 2 GiB taught more about system behavior than all successful tests combined. It exposed the GC pressure threshold, health probe timing sensitivity, and cold-start vulnerability. These insights shaped the production configuration.<\/p>\n\n\n\n<pre class=\"mermaid\">flowchart TB\n  F[\"Right-sizing attempt\"] --&gt; F1[\"Too small (1 vCPU \/ 2 GiB)\"]\n  F1 --&gt; F2[\"GC pressure &amp; probe timeouts\"]\n  F2 --&gt; F3[\"Cascading restarts\"]\n  F3 --&gt; F4[\"Error budget impact\"]\n  F4 --&gt; F5[\"Refined production config\\n(2 vCPU \/ 4 GiB, validated at 6\u00d7)\"]<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Median response time is the metric that matters most<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">P95 and P99 matter for tail latency, but the median determines the experience for <em>most<\/em> users. A flat median under increasing load (165 ms at 1\u00d7 and 5\u00d7) proves horizontal scaling without per-request degradation.<\/p>\n\n\n\n<pre class=\"mermaid\">xychart-beta\n  title \"Median vs P95 under load\"\n  x-axis \"Load (\u00d7 production)\" [1, 2, 3, 4, 5]\n  y-axis \"Response Time (ms)\"\n  line [165, 165, 165, 165, 165]\n  line [450, 1200, 3000, 6000, 8800]<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">15\u00d7 is not an optimization \u2014 it is a different architecture<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">A 15.9\u00d7 improvement does not come from optimizing an existing system. It comes from removing fundamental bottlenecks: dual rendering, multi-source data joining, absence of caching, fixed infrastructure. The improvement is architectural, not incremental.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">What&#8217;s Next<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Article 16<\/strong>: <em>The Full Picture \u2014 What the New Concept Delivers<\/em> \u2014 Synthesis for decision-makers and architects.  <\/li>\n<li><strong>Article 17<\/strong>: <em>The <code>@delegate<\/code> Directive Deep Dive \u2014 Cross-Subgraph Field Resolution<\/em> \u2014 A technical deep dive into the most powerful schema stitching feature.  <\/li>\n<li><strong>Article 18<\/strong>: <em>Building a Headless Design System in Vue 3 \u2014 The Compose Pattern<\/em> \u2014 Separating style logic from templates.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Munir Husseini is a software architect specializing in full-stack TypeScript, .NET, and cloud-native architectures.<\/em><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Nineteenth in a series about migrating from legacy architectures to a modern Nuxt 4 stack. Architecture Decisions Have Consequences \u2014 Measure Them Architecture decisions accumulate, and their combined effect only becomes visible under real load. Before production, a large enterprise application was load-tested with production-equivalent patterns, not synthetic traffic. k6 replayed a model derived from [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":246,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[5],"tags":[],"class_list":["post-25","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-advanced-web-app-with-nuxt-and-net"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.7 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Load Testing Results \u2014 15\u00d7 Faster, 5\u00d7 More Capacity - Scalable Web Production<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/softwareproduction.eu\/?p=25\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Load Testing Results \u2014 15\u00d7 Faster, 5\u00d7 More Capacity - Scalable Web Production\" \/>\n<meta property=\"og:description\" content=\"Nineteenth in a series about migrating from legacy architectures to a modern Nuxt 4 stack. Architecture Decisions Have Consequences \u2014 Measure Them Architecture decisions accumulate, and their combined effect only becomes visible under real load. Before production, a large enterprise application was load-tested with production-equivalent patterns, not synthetic traffic. k6 replayed a model derived from [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/softwareproduction.eu\/?p=25\" \/>\n<meta property=\"og:site_name\" content=\"Scalable Web Production\" \/>\n<meta property=\"article:published_time\" content=\"2026-06-06T21:48:56+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-06-06T23:45:38+00:00\" \/>\n<meta name=\"author\" content=\"Munir Husseini\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Munir Husseini\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"7 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/softwareproduction.eu\\\/?p=25#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/softwareproduction.eu\\\/?p=25\"},\"author\":{\"name\":\"Munir Husseini\",\"@id\":\"https:\\\/\\\/softwareproduction.eu\\\/#\\\/schema\\\/person\\\/fec48f54713e1bd117640fb9b748802f\"},\"headline\":\"Load Testing Results \u2014 15\u00d7 Faster, 5\u00d7 More Capacity\",\"datePublished\":\"2026-06-06T21:48:56+00:00\",\"dateModified\":\"2026-06-06T23:45:38+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/softwareproduction.eu\\\/?p=25\"},\"wordCount\":763,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/softwareproduction.eu\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/softwareproduction.eu\\\/?p=25#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/softwareproduction.eu\\\/wordpress\\\/wp-content\\\/uploads\\\/2026\\\/06\\\/19-load-testing-results.jpg\",\"articleSection\":[\"Advanced Web App with Nuxt and .NET\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/softwareproduction.eu\\\/?p=25#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/softwareproduction.eu\\\/?p=25\",\"url\":\"https:\\\/\\\/softwareproduction.eu\\\/?p=25\",\"name\":\"Load Testing Results \u2014 15\u00d7 Faster, 5\u00d7 More Capacity - Scalable Web Production\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/softwareproduction.eu\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/softwareproduction.eu\\\/?p=25#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/softwareproduction.eu\\\/?p=25#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/softwareproduction.eu\\\/wordpress\\\/wp-content\\\/uploads\\\/2026\\\/06\\\/19-load-testing-results.jpg\",\"datePublished\":\"2026-06-06T21:48:56+00:00\",\"dateModified\":\"2026-06-06T23:45:38+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/softwareproduction.eu\\\/?p=25#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/softwareproduction.eu\\\/?p=25\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/softwareproduction.eu\\\/?p=25#primaryimage\",\"url\":\"https:\\\/\\\/softwareproduction.eu\\\/wordpress\\\/wp-content\\\/uploads\\\/2026\\\/06\\\/19-load-testing-results.jpg\",\"contentUrl\":\"https:\\\/\\\/softwareproduction.eu\\\/wordpress\\\/wp-content\\\/uploads\\\/2026\\\/06\\\/19-load-testing-results.jpg\",\"width\":1880,\"height\":1253},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/softwareproduction.eu\\\/?p=25#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/softwareproduction.eu\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Load Testing Results \u2014 15\u00d7 Faster, 5\u00d7 More Capacity\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/softwareproduction.eu\\\/#website\",\"url\":\"https:\\\/\\\/softwareproduction.eu\\\/\",\"name\":\"Softwareproduction\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/softwareproduction.eu\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/softwareproduction.eu\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/softwareproduction.eu\\\/#organization\",\"name\":\"Munir Husseini\",\"url\":\"https:\\\/\\\/softwareproduction.eu\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/softwareproduction.eu\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/softwareproduction.eu\\\/wordpress\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/softwareproduction-logo-32.png\",\"contentUrl\":\"https:\\\/\\\/softwareproduction.eu\\\/wordpress\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/softwareproduction-logo-32.png\",\"width\":32,\"height\":32,\"caption\":\"Munir Husseini\"},\"image\":{\"@id\":\"https:\\\/\\\/softwareproduction.eu\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/softwareproduction.eu\\\/#\\\/schema\\\/person\\\/fec48f54713e1bd117640fb9b748802f\",\"name\":\"Munir Husseini\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/b07845732d4d7bddfc43e608ae6662d564a14b35706dfae0c9610071d978f54e?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/b07845732d4d7bddfc43e608ae6662d564a14b35706dfae0c9610071d978f54e?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/b07845732d4d7bddfc43e608ae6662d564a14b35706dfae0c9610071d978f54e?s=96&d=mm&r=g\",\"caption\":\"Munir Husseini\"},\"sameAs\":[\"https:\\\/\\\/softwareproduction.eu\\\/\"],\"url\":\"https:\\\/\\\/softwareproduction.eu\\\/?author=1\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Load Testing Results \u2014 15\u00d7 Faster, 5\u00d7 More Capacity - Scalable Web Production","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/softwareproduction.eu\/?p=25","og_locale":"en_US","og_type":"article","og_title":"Load Testing Results \u2014 15\u00d7 Faster, 5\u00d7 More Capacity - Scalable Web Production","og_description":"Nineteenth in a series about migrating from legacy architectures to a modern Nuxt 4 stack. Architecture Decisions Have Consequences \u2014 Measure Them Architecture decisions accumulate, and their combined effect only becomes visible under real load. Before production, a large enterprise application was load-tested with production-equivalent patterns, not synthetic traffic. k6 replayed a model derived from [&hellip;]","og_url":"https:\/\/softwareproduction.eu\/?p=25","og_site_name":"Scalable Web Production","article_published_time":"2026-06-06T21:48:56+00:00","article_modified_time":"2026-06-06T23:45:38+00:00","author":"Munir Husseini","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Munir Husseini","Est. reading time":"7 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/softwareproduction.eu\/?p=25#article","isPartOf":{"@id":"https:\/\/softwareproduction.eu\/?p=25"},"author":{"name":"Munir Husseini","@id":"https:\/\/softwareproduction.eu\/#\/schema\/person\/fec48f54713e1bd117640fb9b748802f"},"headline":"Load Testing Results \u2014 15\u00d7 Faster, 5\u00d7 More Capacity","datePublished":"2026-06-06T21:48:56+00:00","dateModified":"2026-06-06T23:45:38+00:00","mainEntityOfPage":{"@id":"https:\/\/softwareproduction.eu\/?p=25"},"wordCount":763,"commentCount":0,"publisher":{"@id":"https:\/\/softwareproduction.eu\/#organization"},"image":{"@id":"https:\/\/softwareproduction.eu\/?p=25#primaryimage"},"thumbnailUrl":"https:\/\/softwareproduction.eu\/wordpress\/wp-content\/uploads\/2026\/06\/19-load-testing-results.jpg","articleSection":["Advanced Web App with Nuxt and .NET"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/softwareproduction.eu\/?p=25#respond"]}]},{"@type":"WebPage","@id":"https:\/\/softwareproduction.eu\/?p=25","url":"https:\/\/softwareproduction.eu\/?p=25","name":"Load Testing Results \u2014 15\u00d7 Faster, 5\u00d7 More Capacity - Scalable Web Production","isPartOf":{"@id":"https:\/\/softwareproduction.eu\/#website"},"primaryImageOfPage":{"@id":"https:\/\/softwareproduction.eu\/?p=25#primaryimage"},"image":{"@id":"https:\/\/softwareproduction.eu\/?p=25#primaryimage"},"thumbnailUrl":"https:\/\/softwareproduction.eu\/wordpress\/wp-content\/uploads\/2026\/06\/19-load-testing-results.jpg","datePublished":"2026-06-06T21:48:56+00:00","dateModified":"2026-06-06T23:45:38+00:00","breadcrumb":{"@id":"https:\/\/softwareproduction.eu\/?p=25#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/softwareproduction.eu\/?p=25"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/softwareproduction.eu\/?p=25#primaryimage","url":"https:\/\/softwareproduction.eu\/wordpress\/wp-content\/uploads\/2026\/06\/19-load-testing-results.jpg","contentUrl":"https:\/\/softwareproduction.eu\/wordpress\/wp-content\/uploads\/2026\/06\/19-load-testing-results.jpg","width":1880,"height":1253},{"@type":"BreadcrumbList","@id":"https:\/\/softwareproduction.eu\/?p=25#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/softwareproduction.eu\/"},{"@type":"ListItem","position":2,"name":"Load Testing Results \u2014 15\u00d7 Faster, 5\u00d7 More Capacity"}]},{"@type":"WebSite","@id":"https:\/\/softwareproduction.eu\/#website","url":"https:\/\/softwareproduction.eu\/","name":"Softwareproduction","description":"","publisher":{"@id":"https:\/\/softwareproduction.eu\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/softwareproduction.eu\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/softwareproduction.eu\/#organization","name":"Munir Husseini","url":"https:\/\/softwareproduction.eu\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/softwareproduction.eu\/#\/schema\/logo\/image\/","url":"https:\/\/softwareproduction.eu\/wordpress\/wp-content\/uploads\/2026\/05\/softwareproduction-logo-32.png","contentUrl":"https:\/\/softwareproduction.eu\/wordpress\/wp-content\/uploads\/2026\/05\/softwareproduction-logo-32.png","width":32,"height":32,"caption":"Munir Husseini"},"image":{"@id":"https:\/\/softwareproduction.eu\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/softwareproduction.eu\/#\/schema\/person\/fec48f54713e1bd117640fb9b748802f","name":"Munir Husseini","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/b07845732d4d7bddfc43e608ae6662d564a14b35706dfae0c9610071d978f54e?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/b07845732d4d7bddfc43e608ae6662d564a14b35706dfae0c9610071d978f54e?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/b07845732d4d7bddfc43e608ae6662d564a14b35706dfae0c9610071d978f54e?s=96&d=mm&r=g","caption":"Munir Husseini"},"sameAs":["https:\/\/softwareproduction.eu\/"],"url":"https:\/\/softwareproduction.eu\/?author=1"}]}},"jetpack_featured_media_url":"https:\/\/softwareproduction.eu\/wordpress\/wp-content\/uploads\/2026\/06\/19-load-testing-results.jpg","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/softwareproduction.eu\/index.php?rest_route=\/wp\/v2\/posts\/25","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/softwareproduction.eu\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/softwareproduction.eu\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/softwareproduction.eu\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/softwareproduction.eu\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=25"}],"version-history":[{"count":8,"href":"https:\/\/softwareproduction.eu\/index.php?rest_route=\/wp\/v2\/posts\/25\/revisions"}],"predecessor-version":[{"id":247,"href":"https:\/\/softwareproduction.eu\/index.php?rest_route=\/wp\/v2\/posts\/25\/revisions\/247"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/softwareproduction.eu\/index.php?rest_route=\/wp\/v2\/media\/246"}],"wp:attachment":[{"href":"https:\/\/softwareproduction.eu\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=25"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/softwareproduction.eu\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=25"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/softwareproduction.eu\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=25"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}