Drag to bend · double-click to straighten
{{ n.type==='source' ? 'source' : n.category }} {{ n.name }} ×{{ n.replicas }}
Total{{ fmt(n.readRps + n.writeRps) }} rps
Reads{{ fmt(n.readRps) }} rps
Writes{{ fmt(n.writeRps) }} rps
Load{{ fmt(n.sim.load) }} rps
Latency p99{{ n.sim.p99.toFixed(0) }}ms
Utilization {{ (n.sim.util*100).toFixed(0) }}%
Drag components from the left to design your system,
then connect them by dragging between the ports.
{{ hint }}

System Metrics

{{ statusIcon }} {{ global.statusText }}
Latency p50
{{ global.p50.toFixed(0) }}ms
Latency p99
{{ global.p99.toFixed(0) }}ms
Served
{{ fmt(global.served) }}rps
Error rate
{{ (global.errorRate*100).toFixed(2) }}%
Availability
{{ (global.availability*100).toFixed(3) }}%
Est. cost
${{ global.cost }}/hr
Max sustainable load (before saturation)
{{ fmt(global.maxLoad) }}rps  ({{ global.headroom.toFixed(2) }}× headroom)

Bottlenecks & Alerts {{ alerts.length }}

{{ a.title }} — {{ a.msg }}

{{ testResult.title }}

{{ l.name }}

Metric Stream

{{ ev.t }} {{ ev.m }}

Edit: {{ selected.name }}

Select a component on the canvas to tune its parameters, or drag a "kill" toggle to inject a failure.

Workload

Model: M/M/1 queueing per node (utilization ρ = load ÷ capacity·replicas). Caches are read-through — they serve hit-rate% locally and forward only misses to the origin wired behind them. Routing & queue nodes split load across children; other nodes call each dependency at full rate. Replicas add redundant availability 1−(1−a)ⁿ. Percentiles are analytic estimates, not a packet-level trace.