Benchmark Test
Overview
FBOSS Benchmark Tests measure the performance of agent operations on real hardware — for example route add/delete at scale, ECMP group shrink, init-and-exit time, and control-plane RX rates. They are used to catch performance regressions and to qualify a platform's performance characteristics before production.
All benchmarks are consolidated into two binaries:
sai_all_benchmarks-sai_impl(mono)sai_multi_switch_all_benchmarks-sai_impl(multi-switch)
The runner discovers benchmarks from the binary via --bm_list, optionally pre-filters known-bad tests, and runs each benchmark in its own process for full setup → run → teardown isolation.
Setup
Benchmarks run on a standalone DUT using the per-platform agent config under fboss/oss/hw_test_configs. Results are written to a CSV that includes timing (benchmark_time_ps) and, when a platform key is supplied, threshold validation (threshold_status).
Test Cases
All benchmark registrations can be found at:
https://github.com/facebook/fboss/tree/main/fboss/agent/hw/benchmarks
To list the benchmarks present in a binary:
./bin/sai_all_benchmarks-sai_impl --bm_list
Run Modes
Benchmarks can run in either agent run mode:
- multi_switch (recommended) — runs
sai_multi_switch_all_benchmarks-sai_impl; the runner passes--multi_switch --hw_agent_for_testingand manages thehw_agentservice lifecycle automatically, mirroring production. - mono (deprecated) — runs
sai_all_benchmarks-sai_implin a single process.
Prefer multi_switch — it mirrors the production process model. mono is deprecated and will be removed in the future. (Note: for the benchmark subcommand the historical default is mono; pass --agent-run-mode multi_switch explicitly to use the recommended mode.)
Steps to Run Benchmark Test
Build and package FBOSS following the build guide and copy the package to the switch per Packaging and Running FBOSS HW Tests on Switch. You must be in the
/opt/fbossdirectory when running tests.Run in multi_switch mode (recommended):
./bin/run_test.py benchmark \
--agent-run-mode multi_switch \
--config ./share/hw_test_configs/$CONFIG \
--skip-known-bad-tests "brcm/13.3.0.0_odp/tomahawk5" \
--test-run-timeout 1800Run in mono mode:
./bin/run_test.py benchmark \
--agent-run-mode mono \
--config ./share/hw_test_configs/$CONFIG \
--skip-known-bad-tests "brcm/13.3.0.0_odp/tomahawk5" \
--test-run-timeout 1800By default (no
--filter/--filter_file)run_test.pydiscovers and runs all benchmarks in the binary.Run a single benchmark (optional). The name below is for illustration only — benchmarks available vary by platform, so use
--bm_listto find a valid name for your binary first:./bin/sai_all_benchmarks-sai_impl --bm_list # list valid names
./bin/run_test.py benchmark \
--agent-run-mode multi_switch \
--config ./share/hw_test_configs/$CONFIG \
--filter HwFswScaleRouteAddBenchmark
Common flags:
--agent-run-mode:monoormulti_switch. Selects the mono vs multi-switch benchmark binary.--num-npus {1,2}: number of NPUs for multi-switch mode (default 1). With 2,--multi_npu_platform_mappingis passed to the binary.--filter: regex matched against discovered benchmark names to narrow which benchmarks run.--filter_file: file with one registeredBENCHMARK()name per line.--skip-known-bad-tests: platform key (vendor/sdk/asic— note: a single SDK segment, unlike agent tests) used both to pre-filter known-bad benchmarks before running and to load per-platform thresholds. Without it, all discovered benchmarks run and threshold validation is skipped (results showNO_THRESHOLD).--test-run-timeout: per-benchmark timeout in seconds (default 1200).
Threshold validation looks up entries by benchmark name in share/hw_benchmark_tests/sai_bench.materialized_JSON, preferring the matching mode (mono vs multi-switch) and falling back to the other if only one is configured. When no threshold is configured, the runner prints a WILL ALWAYS PASS warning so missing entries are visible.