Repository navigation
simplify topology: single rx_queues knob replaces rx_queues × workers_per_queue - #26
Conversation
…e knob The topology previously had two dimensions: rx_queues × workers_per_queue. This collapses it to one: rx_queues. Each RSS queue gets exactly 1 processing thread. When rx_queues <= 1, the socket runs in run-to-completion mode (no pipeline threads). Auto-detection: available = lcores - 1 (reserve app thread). If available <= 1 → RTC. Otherwise rx_queues = min(available, nic_max). Changes: - Remove workers_per_queue from TopologyConfig, TopologyPlan, builder API - Remove DPDK_WORKERS_PER_QUEUE env var support - Remove auto_detect_workers() helper - Simplify auto_detect_queues(): direct mapping of available lcores - Pipeline threads = rx_queues total (1 RX dispatcher + rx_queues-1 workers) - Remove --workers CLI arg from echo app - Update all tests and documentation https://claude.ai/code/session_01AX8ikLeQqd8DpPXdjAg97d
[CI] Stage: DeployInfrastructure ready.
|
[CI] Stage: SummaryAll tests PASSED. ARP seeding: kernel /proc/net/arp (automatic)
|
✅ Integration Tests Passed (Run 23520693963)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: DeployDeploying |
[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/5)Running |
[Perf] Benchmark Diag:
|
[Perf] Benchmark Diag:
|
[Perf] Stage: Benchmark (2/5)Running |
[Perf] Benchmark Diag:
|
[Perf] Benchmark Diag:
|
[Perf] Stage: Benchmark (3/5)Running |
[Perf] Benchmark Diag:
|
[Perf] Benchmark Diag:
|
[Perf] Stage: Benchmark (4/5)Running |
[Perf] Benchmark Diag:
|
[Perf] Benchmark Diag:
|
[Perf] Stage: Benchmark (5/5)Running |
[Perf] Benchmark Diag:
|
[Perf] Benchmark Diag:
|
[Perf] Diag: testpmd logtestpmd output (last 30 lines) |
[Perf] Stage: Results[03:52:03] INFO Generating markdown summary... Performance Test Results — c5n.2xlargeCommit: 1400B packets
512B packets
64B packets
|
…m defaults - README: replace "10-100x" claim with actual measured ~2x PPS improvement, remove multi-core pipeline section (experimental), fix stale --dpdk flag - echo app: rewrite to mirror plain-echo (65 lines vs 282), demonstrating the drop-in replacement story (only difference is the import line) - plain-echo: add signal handling and read timeout to match echo structure - perf-test-log: add Run #4 entry for topology simplification PR #26 - perf-tests: remove rust-dpdk-multicore from default configs (experimental) https://claude.ai/code/session_013kEK2d9wyTRWwmoAB4VBco
PR #26 did have a full perf run (GH Actions 23522716883). Key findings: - rust-dpdk single-core matches native-dpdk at 700K/1400B (both 36% drop) - rust-dpdk-multicore 100% broken (--workers flag removed by simplification) - DPDK delivers ~2x throughput of kernel sockets at 64B/700K saturation https://claude.ai/code/session_013kEK2d9wyTRWwmoAB4VBco
Performance test results from GH Actions run 26633424088: - rust-dpdk 700K/64B: 695,587 RX (0.6% drop) — no regression vs Run #25 - rust-dpdk 700K/512B: 693,903 RX (0.9% drop) — no regression - tokio-dpdk caps at ~311K PPS — unchanged - native-dpdk baseline: 698,590 at 700K/64B Conclusion: IPv6 socket address support is performance-neutral.
Performance test results from GH Actions run 26815657085: - rust-dpdk at 700K PPS 64B: 689,799 RX (1.46% drop) - native-dpdk at 700K PPS 64B: 688,347 RX (1.66% drop) - No regression vs Run #26 Synthetic CPU-only IPv6 vs IPv4 comparison confirms expected ~28% TX overhead at 64B due to larger headers and mandatory UDP checksum. RX performance equivalent. Marks IPv6 roadmap tasks 3 and 9 as complete.
## ROADMAP Item #26: `dpdk-stdlib-tcp` Engine property tests Implements tasks 6.1, 6.2, 6.3 from `.kiro/specs/tcp-support/tasks.md`. ### Tests Added 15 property-based tests in `dpdk-stdlib-tcp/tests/engine_props.rs` covering: **Task 6.1 — Engine state machine properties:** - Property 11: Timer-driven segment generation (RTO retransmit + persist probe) - Property 12: TIME_WAIT/FIN_WAIT_2 cleanup (TCB freed after timeout) - Property 13: Resource limit enforcement (max_tcbs + backlog exceeded → RST) - Property 14: RST validation per RFC 5961 (exact seq aborts, in-window challenges, out-of-window drops) **Task 6.2 — Congestion control properties:** - Property 15: Flight-size invariant (unacked ≤ min(cwnd, rwnd)) - Property 16: Slow-start cwnd growth (MSS per ACK) - Property 17: Initial window formula (RFC 6928) - Property 18: Fast retransmit formula (NewReno: ssthresh + cwnd) - Property 22: Partial ACK in recovery (deflate cwnd, stay in recovery) - Property 25: Persist-never-aborts (indefinite probing without TimedOut) All tests use proptest with ≥100 cases per property. `cargo build && cargo test` passes with 0 failures. ### Tradeoffs - Properties 8, 9, 10, 21, 23 already exist in earlier PRs (engine_handshake_props.rs, established_props.rs, ooo_reorder_props.rs). This PR adds the remaining properties. - Tests exercise the engine directly via MockClock rather than through the full socket API, enabling deterministic timer testing. --------- Co-authored-by: Agent Router <agent@agent-router.dev>
Summary
workers_per_queuefromTopologyConfig,TopologyPlan, builder API, env vars, and CLIrx_queuesis now the single knob: each RSS queue gets exactly 1 processing threadrx_queues <= 1(or under stubs), no pipeline threads are spawnedrx_queues = min(lcores - 1, nic_max), RTC when ≤ 1 availableNet: -246 lines added, +139 lines (107 lines deleted). All 212 tests pass.
Test plan
cargo build— clean compilecargo test— all 212 tests pass (148 dpdk-udp, 51 dpdk, 8 dpdk-tokio, 3 dpdk-sys, 2 signal)https://claude.ai/code/session_01AX8ikLeQqd8DpPXdjAg97d