Repository navigation
feat: add 8500B jumbo frame packet size to perf tests - #31
Conversation
- Add 8500 to default TREX packet sizes (64,512,1400,8500) - Increase echo app recv buffers from 2048 to 10000 bytes for jumbo payloads - Set MTU 9001 on DUT kernel interfaces for jumbo frame support - Add --max-pkt-len=9100 --mbuf-size=10240 to testpmd for jumbo frames - Add --mbuf-factor 8 to TRex startup for large packet memory allocation https://claude.ai/code/session_01294ECCWxYiENcnK5HVVyoL
[CI] Stage: DeployInfrastructure ready.
|
[CI] Stage: SummaryAll tests PASSED. ARP seeding: kernel /proc/net/arp (automatic)
|
✅ Integration Tests Passed (Run 23693401580)Branch: Test Results
Application Logs (last 20 lines)receiver-echo-server.log sender-echo-server.log sender-test-client.log receiver-test-client-iperf.log sender-test-client-iperf.log Full Application Logs (last 200 lines each)receiver-echo-server.logsender-echo-server.logsender-test-client.logreceiver-test-client-iperf.logsender-test-client-iperf.log
|
…ling - Add mbuf_9k: 4096 to trex_cfg.yaml memory config so TRex can allocate mbufs large enough for 8500B packets - Remove --mbuf-factor 8 (explicit pool config is the proper fix) - Add try/except per packet size in run_benchmark.py so one size failing doesn't crash the entire benchmark — partial results are still written https://claude.ai/code/session_01294ECCWxYiENcnK5HVVyoL
[Perf] Stage: DeployDeploying |
[CI] Stage: DeployInfrastructure ready.
|
[Perf] Stage: Instances Ready
|
[Perf] Stage: TRex ConfigStarting TRex configuration (MAC discovery + NIC binding)... |
[Perf] Stage: TRex Config OK
|
[Perf] Stage: TRex StartedTRex server running. Beginning benchmarks... |
[Perf] DUT ReadyDUT instance |
[Perf] Stage: Benchmark (1/3)Running |
[Perf] Benchmark Diag:
|
[Perf] Benchmark Diag:
|
[Perf] Stage: Benchmark (2/3)Running |
[CI] Stage: SummaryAll tests PASSED. ARP seeding: kernel /proc/net/arp (automatic)
|
[Perf] Benchmark Diag:
|
✅ Integration Tests Passed (Run 23694538130)Branch: Test Results
Application Logs (last 20 lines)receiver-echo-server.log sender-echo-server.log sender-test-client.log receiver-test-client-iperf.log sender-test-client-iperf.log Full Application Logs (last 200 lines each)receiver-echo-server.logsender-echo-server.logsender-test-client.logreceiver-test-client-iperf.logsender-test-client-iperf.log
|
[Perf] Benchmark Diag:
|
[Perf] Stage: Benchmark (3/3)Running |
[Perf] Benchmark Diag:
|
[Perf] Benchmark Diag:
|
[Perf] Diag: testpmd logtestpmd output (last 30 lines) |
[Perf] Stage: Results[21:58:57] INFO Generating markdown summary... Performance Test Results — c5n.2xlargeCommit: 1400B packets
512B packets
64B packets
|
- Set DPDK port MTU to 9001 (AWS VPC max) in both the UdpSocket and DpdkBackend paths so the NIC accepts jumbo frames - Increase mempool data_room_size from 2176 to 9344 bytes (9216 + headroom) so mbufs can hold full jumbo frames without truncation - Use force=True in TRex client.start() to bypass the 16 Gbps line rate check — ENA PMD falsely reports 16 Gbps but c5n actually has 25 Gbps Root cause of 100% drop for rust-dpdk 8500B: the DPDK port's default MTU was 1500, so the NIC silently dropped all jumbo frames on RX. https://claude.ai/code/session_01294ECCWxYiENcnK5HVVyoL
[Perf] Stage: DeployDeploying |
- Change instance type from c5n.2xlarge to c6in.xlarge - Remove force=True from TRex to see if c6in ENA reports accurate line rate - c6in.xlarge: 4 vCPUs, 8 GB, 30 Gbps — $0.284/hr vs $0.432/hr https://claude.ai/code/session_01294ECCWxYiENcnK5HVVyoL
- Move try/except to per-rate-step so partial results (e.g. 70K, 140K succeed but 350K hits line rate) are still saved to the JSON - Sort packet sizes numerically in the summary table (64B < 512B < 1400B < 8500B) instead of lexicographic string sort https://claude.ai/code/session_01294ECCWxYiENcnK5HVVyoL
Integration Test Failure (Run 23695262254)Branch: failure-summary.json{
"failed_step": "deploy_infrastructure",
"error": "Infrastructure deployment failed",
"exit_code": 2,
"timestamp": "2026-03-28T22:07:48.749420Z",
"sender_instance_id": "",
"receiver_instance_id": "",
"commit": "c9f6f9d7c322f6704a19edc659177cebd356c0bf",
"run_url": "https://github.com/gspivey/dpdk-stdlib-rust/actions/runs/23695262254"
}```
### instance-0-user-data.log (8463 bytes, last 80 lines)Compiling cexpr v0.6.0 Compiling heck v0.5.0 error[E0308]: mismatched types For more information about this error, try Compiling regex v1.12.3 Compiling smallvec v1.15.1 error[E0308]: mismatched types For more information about this error, try [ 101.646945] cloud-init[1750]: Downloaded unicode-ident v1.0.24 [ 103.193734] cloud-init[1767]: Downloaded socket2 v0.6.3 total 108 |
[CI] Stage: DeployInfrastructure ready.
|
[CI] Stage: SummaryAll tests PASSED. ARP seeding: kernel /proc/net/arp (automatic)
|
[Perf] Stage: DeployDeploying |
✅ Integration Tests Passed (Run 24240693445)Branch: Test Results
Application Logs (last 20 lines)receiver-echo-server.log sender-echo-server.log sender-test-client.log receiver-test-client-iperf.log sender-test-client-iperf.log Full Application Logs (last 200 lines each)receiver-echo-server.logsender-echo-server.logsender-test-client.logreceiver-test-client-iperf.logsender-test-client-iperf.log
|
[Perf] Stage: Instances Ready
|
[Perf] Stage: TRex ConfigStarting TRex configuration (MAC discovery + NIC binding)... |
[Perf] Stage: TRex Config OK
|
[Perf] Stage: TRex StartedTRex server running. Beginning benchmarks... |
[Perf] DUT ReadyDUT instance |
[Perf] Stage: Benchmark (1/3)Running |
[Perf] Benchmark Diag:
|
[Perf] Benchmark Diag:
|
[Perf] Stage: Benchmark (2/3)Running |
[Perf] Benchmark Diag:
|
[Perf] Benchmark Diag:
|
[Perf] Stage: Benchmark (3/3)Running |
[Perf] Benchmark Diag:
|
[Perf] Benchmark Diag:
|
[Perf] Diag: testpmd logtestpmd output (last 30 lines) |
[Perf] Stage: Results[12:34:49] INFO Generating markdown summary... Performance Test Results — unknownCommit: 64B packets
512B packets
1400B packets
8500B packets
|
8500B jumbo frames on c6in.xlarge: rust-dpdk delivers 125K PPS at 8.5 Gbps with 0.00% drop, matching native-dpdk (testpmd). Jumbo frames achieve higher sustained bandwidth than 1400B with 6x fewer packets. Bandwidth ceiling is ENA single-flow limit, not our stack. Also documents ENA Express MTU <= 8900 incompatibility finding. https://claude.ai/code/session_01294ECCWxYiENcnK5HVVyoL
[CI] Stage: DeployInfrastructure ready.
|
[CI] Stage: SummaryAll tests PASSED. ARP seeding: kernel /proc/net/arp (automatic)
|
✅ Integration Tests Passed (Run 24244488181)Branch: Test Results
Application Logs (last 20 lines)receiver-echo-server.log sender-echo-server.log sender-test-client.log receiver-test-client-iperf.log sender-test-client-iperf.log Full Application Logs (last 200 lines each)receiver-echo-server.logsender-echo-server.logsender-test-client.logreceiver-test-client-iperf.logsender-test-client-iperf.log
|
## ROADMAP Item #31 Implements `dpdk-stdlib-tcp: DUT test binaries and synthetic benchmark` from ROADMAP.md. **Spec:** `.kiro/specs/tcp-support/` tasks 12.1, 12.2, 13.1, 13.2, 13.3 ### Changes 1. **apps/tcp-echo** — Sync TCP echo server with `--ip`/`--port` flags and graceful SIGTERM/SIGINT shutdown 2. **apps/tcp-test-client** — TCP client with 4 test modes: `handshake` (connect-then-close), `bidir` (bidirectional echo verification), `shutdown` (graceful FIN teardown), `std-parity` (byte-for-byte comparison vs std::net::TcpStream) 3. **apps/tokio-tcp-echo** — Async TCP echo server via dpdk-tokio compat layer 4. **apps/tcp-synthetic-bench** — Mock PacketBackend benchmark measuring connection establishment latency, single-stream throughput, and engine tick processing time. Outputs markdown (stdout) + JSON (stderr) ### CI Workflow (requires manual apply) The `tcp-synthetic-perf` job for `integration-tests.yml` is prepared but cannot be pushed due to PAT `workflow` scope limitation. The job definition: - Runs on `ubuntu-latest` (no AWS needed) - Builds and runs `tcp-synthetic-bench` in release mode - Posts results as PR comment with commit hash and run link - Uploads results artifact with 30-day retention The workflow change is included as a local diff and should be applied by a human maintainer or token with `workflow` scope. ### Tests - `cargo build` — all workspace crates compile cleanly - `cargo test` — all existing tests pass (0 failures) ### Tradeoffs - `tcp-synthetic-bench` drives the TcpEngine directly (no real TCP connections) to measure pure framework overhead - `MockBackend` struct is defined for spec compliance but the benchmark uses engine-direct approach for deterministic measurements - `try_clone()` in tcp-test-client's std-parity mode works because the std fallback path is used for the kernel comparison --------- Co-authored-by: Agent Router <agent@gspivey.com>
Summary
dut_bind_kernel()--max-pkt-len=9100 --mbuf-size=10240to testpmd for jumbo frame support--mbuf-factor 8to TRex startup for large packet memory allocationMotivation
With 1400B packets we're hitting 6.5-7 Gbps. Jumbo frames (8500B) should dramatically increase bandwidth by amortizing per-packet overhead over ~6x more payload. Theoretical max on c5n.2xlarge at 25 Gbps = ~367K PPS at 8500B.
Test plan
cargo build && cargo test— all 252 tests passhttps://claude.ai/code/session_01294ECCWxYiENcnK5HVVyoL