blob: 9eb96d37c13a2af2347272d60180547ab0a795c1 [file] [log] [blame] [view]
# Netstack benchmarks
Netstack benchmarks are a set of test components with the following objectives:
* Define and generate various netstack related benchmarking data as part of CI
and publish them to Chromeperf benchmarking dashboards.
* Enable regression monitoring in Chromeperf to catch any regressions in CI and
raise monorail bugs.
Our benchmarks fill a similar role to automated testing, but specifically for
performance: they give us the confidence to change and improve the network stack
while being aware of the performance impact of those changes.
Most netstack benchmarks can be run either as regular hermetic tests, or as
end-to-end performance tests using Fuchsia's perftest infrastructure. The former
is recommended for local development and iteration when possible because it is
simpler: it is compatible with any product configuration and it does not require
adding any additional dependencies to your package set.
To run the benchmarks as end-to-end tests, pass the `--e2e` flag to `fx test`
and specify one of the tests defined in //src/tests/end_to_end/perf/test. For
example:
```
fx test --e2e netstack_benchmarks_test
```
Make sure that your package universe contains the
`//src/tests/end_to_end/perf:test` group so you have the required dependencies
available. Also note that if you are running `netstack_iperf_test` or
`netstack_benchmarks_test`, you will need to run on the `terminal` product so
that SL4F is available. For example, your `fx set` line might look like the
following:
```
fx set terminal.x64 --with //src/tests/end_to_end/perf:test
```
## Microbenchmarks
### Loopback socket benchmarks {#loopback-socket-benchmarks}
These focus on measuring the duration of specific socket related system calls
from the benchmarking binary for TCP, UDP, and ICMP sockets over loopback. They
run against Netstack2, Netstack3, and Netstack2 with Fast UDP enabled.
#### Fake netstack
The loopback socket benchmarks also run against the "fake netstack",
a stubbed-out netstack the implements the minimum amount of the
fuchsia.posix.socket API possible, to attempt to measure the overhead of
the API structure itself.
### Tun socket benchmarks
These benchmarks measure the same operations as the
[loopback socket benchmarks](#loopback-socket-benchmarks), except there are two
netstacks involved connected via a network-tun [device-pair]. This means that
the latency numbers also include time spent in the netstack's device layer,
which is absent from the loopback benchmarks. They run against Netstack2 and
Netstack3.
### UDP serde benchmarks
These benchmarks measure the time to serialize and deserialize the metadata that
is sent with each packet in Fast UDP.
### Netdevice benchmarks
These benchmarks measure the round trip latency for packet buffer transmission
between a client and a device, using an in-process fake network device.
### Netstack3 benchmarks
Netstack3 defines microbenchmarks internally that measure the following:
* The time required to forward a batch of IP packets
* The time required to take tokens out of a token bucket
## Macrobenchmarks
### iPerf benchmarks
These benchmarks use iperf3 to measure throughput, CPU usage, jitter, and packet
loss for TCP and UDP traffic. They run over both loopback (fully on-device) and
over Ethernet, with the server running on Fuchsia and the client on the host.
They exercise both single-flow and multi-flow scenarios.
### Resource usage benchmarks
These benchmarks measure the resource usage (memory consumption and handle
counts) of a hermetic netstack process while exercising it with a set of
workloads. Metrics are emitted for baseline usage on netstack startup, initial
usage after one run of a given workload, peak usage while running a workload
repeatedly, and final increase in usage from the baseline after a workload is
complete.
[device-pair]: /sdk/fidl/fuchsia.net.tun/tun.fidl