Performance Advisor
The Performance Advisor reads the KPIs from a simulation run, finds the bottlenecks, and proposes ranked one-click fixes that improve service while keeping cost down. It's the "what should I change?" layer on top of the raw results: a checker (spot the problem), a recommender (rank the fixes), and a fixer (apply them).
Everything it computes is deterministic — closed-form queueing math over the KPIs your run already produces. No data leaves the browser. The optional Explain button is the only part that calls the AI companion, and only when you click it.
Where it shows up
| View | What you get |
|---|---|
| Experiment | The advisor panel, above the results — ranked recommendations with Apply / Apply all / Explain, plus the service-targets editor. |
| Optimize | Seed from last run — tight, KPI-derived bounds + auto constraints for a faster search. An SLA-gap recommendation also gets a Seed optimizer button that jumps you straight here. |
| Editor | A Performance section listing the recommendations from the last run, with Apply. |
| Presentation | A Bottleneck: banner naming the most critical node during playback. |
| Property panel | Optional Cost per server / Cost per capacity unit inputs so "minimize cost" means money. |
What it detects
After a run it compares each node's KPIs against targets (built-in defaults, plus any SLA you set) and emits recommendations:
- Over-utilized resource — utilization above the healthy band (default
> 0.85) → add the smallest number of servers that restores headroom. - Over-provisioned resource — utilization below the band (default
< 0.40) while running more than one server → remove servers to save cost. - Customer loss — a queue is balking or reneging → raise its capacity (and it points at the resource behind the loss).
- Long queue — a backed-up queue is reported as a symptom; the advisor names the downstream resource that's actually the bottleneck.
- SLA gap — a
p95 waitover your target → hands the cheapest global fix to the optimizer (requires a detailed run, see below). - Throughput shortfall — a sink below your throughput target.
Healthy model → no recommendations (the panel says "✓ No bottlenecks").
Worked example: the airport check-in, under-staffed
Start from the airport tutorial model but cut the desks from 4 to 1. The shape is:
source (a passenger every ~2 min) → queue (the line) → resource (1 desk, triangular 1/3/6 min service) → sink.
One desk can't keep up with a passenger every two minutes, so it saturates.
Run it. Open the Experiment tab and click Run experiment. The advisor panel (now above the results) lights up with something like:
⚠ critical — Desks is over-utilized utilization 0.99 > target 0.85
servers 1 → 4· [Apply]Apply the fix. Click Apply. The change is staged into the model as a single undo step (servers 1 → 4). Nothing else moves.
Re-run to confirm. Click Run experiment again. Utilization drops back into the healthy band and the queue's wait collapses — the advisor now shows "✓ No bottlenecks."
That's the full checker → recommender → fixer loop: it found the saturated desk, told you the smallest bump that fixes it, applied it, and you verified it.
Service targets (optional SLA)
The small Service targets editor in the Experiment tab lets you set:
- p95 wait ≤ — a tail-latency promise (e.g. 95% of customers wait under 10 minutes).
- throughput ≥ — a minimum customers-served target.
The advisor flags gaps against these, and the optimizer reads the same targets when you seed it. Targets are saved with the model.
Detailed runs for SLA checks
The p95 wait check needs percentile data, which only a detailed run produces. If you've set a p95 wait SLA but ran without detail, the panel says "Run with detailed enabled to check the wait SLA."
Real cost
By default every server and capacity unit costs 1, so "minimize cost" means "minimize total units." Set Cost per server (on a resource) or Cost per capacity unit (on a queue) in the property panel and the advisor — and the optimizer — weigh real money. Three cheap kiosks can then beat one expensive specialist.
Hand-off to the optimizer
For the cheapest global fix (not just one node), use the optimizer:
- On the Optimize tab, Seed from last run pre-fills the decision variables with tight, KPI-derived bounds and drops healthy nodes from the search — a smaller space, so the Cross-Entropy search converges faster. See Cross-Entropy optimization.
- When the advisor raises an SLA gap, its recommendation carries a Seed optimizer button that stores that seeded problem and switches you to the Optimize tab, pre-filled and ready to run.
Explain (AI, optional)
The Explain button at the bottom of the advisor panel hands the findings — titles, the KPI-vs-target numbers, and the proposed fixes — to the AI companion for a plain-English summary of what's wrong and the service-vs-cost trade-off of each fix. It sends only those already-computed findings (never your raw model), and it costs one of your daily companion turns. It appears once you've run at least one experiment.
At a glance
- Run an experiment → read the ranked recommendations above the results.
- Apply a fix (one undo step) → Run again to verify.
- Set service targets for SLA-aware advice; set per-resource costs for money-aware advice.
- Use Seed from last run / Seed optimizer for the cheapest global fix.
- Explain for an AI narration of the findings.