The iperf3-based approach in this repo is practical for commodity hardware. For higher-precision testing, line-rate saturation at 10G+ with small packets, or application-layer benchmarking, the tools below are the industry standard.
Standard Linux networking uses kernel interrupt processing. At small packet sizes, this saturates CPU before the NIC is saturated — this is why iperf3 shows reduced throughput at 128-byte. DPDK bypasses the kernel entirely, polling the NIC in userspace to achieve true line-rate at any packet size.
flowchart LR
subgraph kernel["Standard Linux (iperf3)"]
nic1["NIC"] -->|"interrupt"| kernel_net["Kernel\nnetwork stack"] --> app["iperf3\nuserspace"]
end
subgraph dpdk_stack["DPDK-based (TRex / Pktgen)"]
nic2["NIC"] -->|"poll mode\n(no kernel)"| dpdk["DPDK PMD\nuserspace"] --> gen["TRex /\nPktgen"]
end
Open-source, DPDK-based. The most capable and widely used software traffic generator. Used by FD.io CSIT for all VPP benchmarks.
Capabilities:
- Stateless mode: raw L2/L3 packet generation at line rate (10G, 40G, 100G)
- ASTF (Advanced Stateful) mode: full TCP/HTTP connection simulation
- Built-in RFC 2544 test suite
- Lua scripting for custom traffic profiles
- Real-time statistics dashboard
# Install TRex
wget https://trex-tgn.cisco.com/trex/release/latest_release
tar -xzf v*.tar.gz
# Basic stateless run — 10Gbps bidirectional IMIX
./t-rex-64 -f cap2/imix_64.yaml -d 60 -m 1
# RFC 2544 automated test
./t-rex-64 --cfg /etc/trex_cfg.yaml --rfc2544 -f cap2/64b.yamlRequirements: Two dedicated 10G Intel NICs (82599/X710/XL710) bound to
DPDK via dpdk-devbind. Cannot share NICs with the OS.
Simpler than TRex — focused on maximum raw PPS (packets per second) with fine-grained control over packet fields. Ideal for measuring exact PPS limits at specific packet sizes.
# Launch Pktgen with two ports
./pktgen -l 0-7 -n 4 -- -P -m "1.0, 2.1" -f txrx.luaGUI-based packet crafter and traffic generator. Build custom packets byte-by-byte and send at controlled rates. Useful for:
- Protocol fuzzing
- Custom header testing
- RFC 2544 automation via Python API
Tests bufferbloat — how much latency and jitter spike when the network is fully saturated. This measures a different dimension from raw throughput: whether the network remains usable under load.
pip install flent
# RRUL test — simultaneous TCP up/down + latency measurement
flent -H 192.168.100.11 rrul -l 60 -o results.pngRRUL (Realtime Response Under Load): Runs 4 TCP upload + 4 TCP download streams simultaneously while measuring ICMP RTT every 100ms. A well-tuned router with proper QoS should maintain <10ms added latency; an untuned router may show hundreds of milliseconds.
For Layer-7 testing — load balancer throughput, WAF performance, HTTP/HTTPS request rates.
# wrk: 12 threads, 400 connections, 30 seconds
wrk -t12 -c400 -d30s http://192.168.100.1/Combines ping and traceroute into continuous per-hop latency and loss
measurement. Useful for identifying which hop in a path is introducing
latency or loss under load.
mtr --report --report-cycles 100 192.168.100.1Testing maximum throughput is only half the picture. Real networks have latency, jitter, loss, and reordering. Test how VyOS handles these with Linux's built-in traffic control tools.
tc with the netem discipline injects impairments on a Linux interface:
# Add 50ms RTT delay + 10ms jitter to eth1
sudo tc qdisc add dev eth1 root netem delay 50ms 10ms
# Add 1% random packet loss
sudo tc qdisc add dev eth1 root netem loss 1%
# Add delay + loss + 0.1% duplication
sudo tc qdisc add dev eth1 root netem delay 50ms loss 1% duplicate 0.1%
# Remove all impairments
sudo tc qdisc del dev eth1 rootImpairment test playbook pattern:
Place a Linux node between the sender and DUT. Use netem on that node to
simulate WAN conditions. Benchmark VyOS behaviour under each scenario:
| Scenario | netem parameters |
|---|---|
| LAN (baseline) | no impairment |
| Good WAN | delay 20ms |
| Poor WAN | delay 100ms loss 0.5% |
| Terrible WAN | delay 200ms 50ms loss 2% corrupt 0.1% |
FD.io CSIT (Continuous System Integration and Testing) is the open-source benchmark suite used to test VPP (Vector Packet Processing) and DPDK-based data planes. It is the closest thing to a download-and-run RFC 2544 suite.
- Test automation: Robot Framework
- Traffic generation: Cisco TRex (DPDK)
- Output: NDR (Non-Drop Rate) and PDR (Partial Drop Rate) per RFC 2544
- Reports: HTML/PDF with throughput, latency, and loss curves
# Clone CSIT
git clone https://github.com/FDio/csit.git
# Run a VPP benchmarking scenario (requires TRex + DUT node)
cd csit
./resources/tools/testbed-setup/ansible/deploy_local.shCSIT is complex to set up but produces publication-quality results. See the FD.io CSIT docs for setup guides.