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.
Before you start
Section titled “Before you start”- 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 four BFCM traffic shapes
Section titled “The four BFCM traffic shapes”Shape 1: Doorbuster spike
Section titled “Shape 1: Doorbuster spike”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
Shape 2: Email wave (flash sale)
Section titled “Shape 2: Email wave (flash sale)”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
Shape 3: Sustained surge
Section titled “Shape 3: Sustained surge”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
Shape 4: Multi-wave
Section titled “Shape 4: Multi-wave”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.
Writing the staged profiles in Taurus
Section titled “Writing the staged profiles in Taurus”Doorbuster spike profile
Section titled “Doorbuster spike profile”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: POSTEmail wave profile
Section titled “Email wave profile”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-downMulti-wave dress rehearsal profile
Section titled “Multi-wave dress rehearsal profile”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-downRunning the profile in MaxoPerf
Section titled “Running the profile in MaxoPerf”- Open Tests → New test in the MaxoPerf console.
- Give the test a clear name, for example
bfcm-2025-doorbuster-spikeorbfcm-2025-dress-rehearsal. - Under the Files tab, upload the Taurus YAML above as the entrypoint file.
- In Load profile, confirm the duration matches the total stage time in your YAML.
- Under Configuration, add failure criteria:
p95 latency (POST /checkout/start) > 1000 ms→ failerror rate > 1 %→ fail
- Select your runner location(s). For a BFCM test, choose a region close to your primary customer geography.
- Click Run and watch the live Overview tab.
Reading the run
Section titled “Reading the run”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.
Do / don’t
Section titled “Do / don’t”| Do | Don’t |
|---|---|
| Model each distinct traffic shape as a separate test first | Combine all waves in a single run before you understand each shape individually |
| Use a 30-second or shorter ramp for doorbuster scenarios | Use a 5-minute ramp to simulate a doorbuster, which underestimates the shock |
| Include recovery observation windows between waves | End the test immediately after the peak |
| Label each Taurus request clearly so you get a per-endpoint latency breakdown | Use a single unlabeled scenario that averages all endpoints |
| Document the wave times in the test name and description | Rely on memory to remember which test was which profile |
Where to go next
Section titled “Where to go next”- End-to-end journey load: build the full checkout funnel scenario that runs inside these profiles.
- Spike and stress for sales: push past the modeled peak to find the breaking point.
- Staged ramp profile: the general recipe for multi-stage load profiles.
- BFCM readiness checklist: confirm each profile type has run and passed its criteria before the event.