Skip to content

Realistic peak load profiles

BFCM traffic is not a smooth ramp. It arrives in waves: a doorbuster deal fires at midnight and spikes instantly, a marketing email hits inboxes and causes a second wave at 10 AM, then sustained elevated load runs all day through Cyber Monday. Each wave has a different shape, and each shape reveals different failure modes. Modeling these shapes in MaxoPerf — rather than using a simple constant-VU load test — is what separates a real readiness program from theater.

  • You have completed capacity planning and traffic modeling and have your target VU counts and RPS by funnel stage.
  • A smoke test has passed against the target environment.
  • You have a Taurus YAML or k6 script that covers the critical user journeys.

The doorbuster is the highest-risk traffic shape. A limited-inventory deal goes live at a specific time and drives a near-vertical VU surge. The system has no time to autoscale gracefully.

  • Ramp speed: Near-instantaneous (10–30 seconds to full peak)
  • Peak hold: 5–15 minutes (until inventory sells out)
  • Recovery: Drops quickly after the deal closes
  • Key risks: Connection pool exhaustion, session store saturation, database lock contention

A promotional email delivers traffic in a recognizable pattern: a sharp initial spike 2–5 minutes after send, a decay, then a second smaller wave from mobile users who open the email later.

  • Ramp speed: Moderate (2–5 minutes to peak)
  • Peak hold: 15–30 minutes
  • Recovery: Gradual over 60–90 minutes
  • Key risks: CDN cache miss (first request), checkout abandonment under latency, search index saturation

After the morning doorbusters, BFCM maintains elevated traffic for hours — 2×–4× daily average, all day. This is the shape your soak test must validate.

  • Ramp speed: Slow (follows organic traffic growth)
  • Peak hold: 6–12 hours
  • Recovery: Overnight into Cyber Monday
  • Key risks: Memory leaks, connection exhaustion, query plan drift, slow degradation

The real BFCM profile combines all three: doorbuster at midnight, email wave at 10 AM, sustained surge through the afternoon, another email wave at 8 PM. This is the shape for your dress rehearsal.

execution:
- scenario: bfcm-checkout
stages:
# Idle baseline — system is warm but not loaded
- duration: 2m
target: 50
# Near-instant doorbuster surge
- duration: 30s
target: 1400
# Hold at peak — doorbuster window
- duration: 10m
target: 1400
# Inventory sells out — traffic drops fast
- duration: 2m
target: 100
# Recovery observation
- duration: 5m
target: 100
scenarios:
bfcm-checkout:
requests:
- url: https://api.staging.example.com/v1/products/featured
label: GET /products/featured
- url: https://api.staging.example.com/v1/cart/items
label: POST /cart/items
method: POST
headers:
Content-Type: application/json
body: '{"product_id": "deal-001", "qty": 1}'
- url: https://api.staging.example.com/v1/checkout/start
label: POST /checkout/start
method: POST
execution:
- scenario: bfcm-browse-to-checkout
stages:
- duration: 2m
target: 50 # baseline
- duration: 3m
target: 900 # email-triggered ramp
- duration: 20m
target: 900 # wave hold
- duration: 10m
target: 400 # first decay
- duration: 20m
target: 400 # tail traffic
- duration: 5m
target: 50 # cool-down
execution:
- scenario: bfcm-full-day
stages:
- duration: 5m
target: 100 # warm start
- duration: 30s
target: 1400 # wave 1: midnight doorbuster
- duration: 15m
target: 1400
- duration: 5m
target: 350 # inter-wave trough
- duration: 3m
target: 900 # wave 2: morning email
- duration: 30m
target: 900
- duration: 10m
target: 600 # sustained afternoon
- duration: 60m
target: 600
- duration: 3m
target: 1100 # wave 3: evening email
- duration: 20m
target: 1100
- duration: 10m
target: 200 # wind-down
  1. Open Tests → New test in the MaxoPerf console.
  2. Name the test clearly — e.g., bfcm-2025-doorbuster-spike or bfcm-2025-dress-rehearsal.
  3. Under the Files tab, upload the Taurus YAML above as the entrypoint file.
  4. In Load profile, confirm the duration matches the total stage time in your YAML.
  5. Under Configuration, add failure criteria:
    • p95 latency (POST /checkout/start) > 1000 ms → fail
    • error rate > 1 % → fail
  6. Select your runner location(s). For a BFCM test, choose a region close to your primary customer geography.
  7. Click Run and watch the live Overview tab.

On the Overview tab, each wave should be visible as a distinct segment in the VU chart. For each wave, check:

  • Latency at peak hold — did p95 exceed your SLO threshold? If yes, the system cannot handle that wave shape.
  • Recovery between waves — did latency and error rate drop back to baseline during the inter-wave trough? If not, the system is accumulating state (queued requests, held connections, leaked memory).
  • Throughput per wave — the RPS should track proportionally to VUs. If throughput plateaus while VUs keep climbing, the system is saturating.
  • Error rate across waves — zero errors during troughs; bounded errors during peaks (below your SLO).
DoDon’t
Model each distinct traffic shape as a separate test firstCombine all waves in a single run before you understand each shape individually
Use a 30-second or shorter ramp for doorbuster scenariosUse a 5-minute ramp to simulate a doorbuster — it underestimates the shock
Include recovery observation windows between wavesEnd the test immediately after the peak
Label each Taurus request clearly — you need per-endpoint latency breakdownUse a single unlabeled scenario that averages all endpoints
Document the wave times in the test name and descriptionRely on memory to remember which test was which profile