Benchmark xApps
Stress Test EPI
A multi-xApp EPI stress and benchmark harness. Go (with an Angular
control dashboard under webui/).
One binary hosts N virtual xApps, each with its own RIC client, each
driving E2SM-EPI NodeProbe controls at every visible
E2 node — so the RIC is load-tested across an N × M (xApps × nodes)
matrix.
- SM: E2SM-EPI (RAN Function 100). Fires EPI NodeProbe controls via
ric.Client.RunWithProbes; EPI responses flow through the Control outcome (EpiTiming.SBRTTNs, …), notOnIndication. No plugin registration is needed to fire EPI probes. -
What it does: spawns N goroutine-hosted virtual xApps that probe every node at the configured cadence, and exposes an HTTP control plane mirroring the emulator's scale API so the lab can drive both sides symmetrically:
Endpoint Purpose GET /healthLiveness GET /metricsPrometheus metrics (probe outcomes, RTTs, drops) GET /xappsCurrent virtual-xApp roster POST /scale-up?n=KAdd K virtual xApps POST /scale-down?n=KRemove K virtual xApps
Probe outcomes and RTTs are recorded into Prometheus; overload shows up
as probes_dropped_full_total.
- Config: xapp.probe_cadence (parallel | sequential),
xapp.node_probe_interval_ms (6);
stress.{xapps_initial_count, startup_stagger_ms,
deployment_name_prefix, probe_dispatch (burst|flow),
probes_per_interval, probe_max_pending, node_probe_timeout_ms};
http.listen (0.0.0.0:7998).
Don't set xapp.deployment_name
The harness assigns a per-instance identity to each virtual xApp from
stress.deployment_name_prefix — setting xapp.deployment_name
yourself would collide across the fleet.
Pair it with the E2 emulator's own scale API to stress the RIC from both the northbound (xApp) and southbound (E2 node) sides at once, and watch the EPI latency histograms and back-pressure counters in Observability.