Skip to content

Realistic peak load profiles

BFCM traffic arrives in waves, not as a smooth ramp. A doorbuster deal fires at midnight and spikes instantly. A marketing email lands in inboxes and causes a second wave at 10 AM. Then load stays high all day through Cyber Monday. Each wave has its own shape, and each shape exposes different failures. A constant-VU load test cannot show them. Model the shapes in MaxoPerf, or the readiness program is for show.

  • 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 riskiest traffic shape. A limited-inventory deal goes live at a set time and drives a near-vertical VU surge. The system has no time to autoscale smoothly.

  • 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 brings traffic in a familiar pattern: a sharp 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 traffic stays high for hours: 2×–4× the daily average, all day. Your soak test must cover this shape.

  • 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 the first three: a doorbuster at midnight, an email wave at 10 AM, a sustained surge through the afternoon and another email wave at 8 PM. Use this 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. Give the test a clear name, for example 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 shows up as its own segment in the VU chart. For each wave, check:

  • Latency at peak hold. If p95 went above your SLO threshold, the system cannot handle that wave shape.
  • Recovery between waves. Latency and error rate should drop back to baseline in the trough between waves. If they do not, the system is building up state (queued requests, held connections, leaked memory).
  • Throughput per wave. RPS should rise and fall with VUs. If throughput flattens while VUs keep climbing, the system is saturating.
  • Error rate across waves. Expect zero errors in the troughs and errors below your SLO at the peaks.
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, which underestimates the shock
Include recovery observation windows between wavesEnd the test immediately after the peak
Label each Taurus request clearly so you get a 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