The full-table benchmark measures one router taking in tables from its peers. What two routers of one AS do with each other, each sending the other every path it has (ADD-PATH both ways with all_paths, as a mesh of routers that each hold the network's whole view is configured), was measured nowhere: the exporter following the table's journal while the sessions fill the table, at the size of the Internet. In production that exchange took 70 seconds for a table that arrives from the Internet in 20. A new benchmark, mesh, starts two servers in one AS with distinct router IDs, peers them over IPv6 loopback with ADD-PATH both ways and all_paths, and feeds the first from four synthetic peers and the second from two over IPv4 loopback (BENCH_PEERS, BENCH_PEERS_B, BENCH_SCALE_DOWN). It prints how long each router takes to hold its own peers' routes and then the other's, with the rate of the latter. BENCH_DEADLINE prints the sessions' state if a router is not there in time. The benchmarks now allocate with jemalloc, as the daemon does, except when memory is being counted: the C library's allocator put its own locks in the profiles. Two routers on one host have each other's addresses as next hops, loopback addresses, which the import check refuses as it refuses a next hop that is this machine; the permissive import policy, which only tests use and no configuration can ask for, now takes them. Testing: the next-hop test covers both policies; the benchmark runs on macOS and in the Linux VM under perf. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
52 lines
1.1 KiB
TOML
52 lines
1.1 KiB
TOML
[package]
|
|
name = "bgp-bench"
|
|
description = "Benchmarks at the scale of the Internet routing table"
|
|
authors.workspace = true
|
|
edition.workspace = true
|
|
homepage.workspace = true
|
|
license.workspace = true
|
|
repository.workspace = true
|
|
version.workspace = true
|
|
publish = false
|
|
|
|
[dependencies]
|
|
bgp-packet.workspace = true
|
|
bgp-primitives.workspace = true
|
|
bytes.workspace = true
|
|
flate2 = "1"
|
|
stats_alloc = { version = "0.1.10", optional = true }
|
|
|
|
[target.'cfg(not(target_env = "msvc"))'.dependencies]
|
|
tikv-jemallocator.workspace = true
|
|
|
|
[dev-dependencies]
|
|
bgp-integration-tests.workspace = true
|
|
bgp-rib.workspace = true
|
|
bgp-server.workspace = true
|
|
tokio.workspace = true
|
|
|
|
[features]
|
|
# Counts every allocation, to report how much memory a table holds. The
|
|
# counters are shared by all threads and slow them down, so timings are
|
|
# taken without this and memory is measured in a run of its own.
|
|
count-memory = ["dep:stats_alloc"]
|
|
|
|
[[bench]]
|
|
name = "full_table"
|
|
harness = false
|
|
|
|
[[bench]]
|
|
name = "real_table"
|
|
harness = false
|
|
|
|
[[bench]]
|
|
name = "transit"
|
|
harness = false
|
|
|
|
[lints]
|
|
workspace = true
|
|
|
|
[[bench]]
|
|
name = "mesh"
|
|
harness = false
|