Skip to content

feat: performance optimization phase 3 — zero-copy frame pool, per-worker SPSC - #25

Merged
gspivey merged 7 commits into
mainfrom
claude/performance-optimization-phase-3-CHQub
Mar 14, 2026
Merged

gspivey merged 7 commits into
mainfrom
claude/performance-optimization-phase-3-CHQub

Conversation

@gspivey

@gspivey gspivey commented Mar 13, 2026

Copy link
Copy Markdown
Owner

Summary

Multi-core pipeline redesign (Phase 3) targeting the remaining performance gaps at 350K-700K PPS:

  • FramePool slab allocator (P3.1): Pre-allocated contiguous buffer with lock-free free list. Eliminates all per-packet heap allocation on the RX→Worker hot path — zero allocator calls in steady state.
  • FrameRef zero-copy (P3.2-P3.3): 8-byte FrameRef (pool_idx + len) replaces Vec<u8> in worker SPSC rings. Frames passed by reference, not cloned.
  • Per-worker SPSC app rings (P3.4): Replaces shared MPSC app_ring with per-worker SPSC rings. recv_from() polls round-robin, eliminating CAS contention.
  • RSS-aware worker affinity (P3.6): Direct queue-to-worker mapping preserves NIC RSS flow locality.

Expected Impact (based on Phase 2 baseline)

Optimization Target
FramePool (zero-alloc) Eliminate 2 allocs + 1 copy per frame in pipeline
Per-worker SPSC Remove MPSC CAS contention (O(workers) → O(1))
RSS affinity Better cache locality per worker

Phase 2 Baseline (to beat)

Config 70K PPS 140K PPS 350K PPS 700K PPS
rust-dpdk-multicore 387us, 0% 409us, 0.02% 4,165us, 28.5% 4,269us, 64.3%

Test plan

  • All 143+ unit tests pass (cargo test)
  • FramePool unit tests: alloc/free cycles, exhaustion, concurrent producer-consumer
  • Pipeline integration test with FrameRef path
  • Per-worker SPSC app ring round-robin test
  • Trigger perf-tests.yml for benchmark comparison against Phase 2

https://claude.ai/code/session_01AX56ktjxp4ybrKFqAg7mMu

claude added 2 commits March 13, 2026 03:43
…rker SPSC, RSS affinity

Multi-core pipeline redesign addressing the remaining performance gaps:

- P3.1: FramePool slab allocator — pre-allocated contiguous buffer of N×frame_size
  bytes with lock-free SPSC free list. Eliminates all per-packet heap allocation
  on the RX→Worker hot path.

- P3.2-P3.3: FrameRef (pool_idx + len) replaces Vec<u8> in worker SPSC rings.
  Frames are passed by 8-byte reference instead of cloned Vec, zero-copy after
  initial DMA.

- P3.4: Per-worker SPSC app rings replace shared MPSC app_ring. recv_from()
  polls round-robin across worker rings, eliminating CAS contention that
  scaled poorly with worker count.

- P3.6: RSS-aware worker affinity — direct queue-to-worker mapping preserves
  flow locality from NIC RSS hashing.

- P3.8: Comprehensive unit tests for FramePool (alloc/free cycles, pool
  exhaustion, producer-consumer with SPSC ring, concurrent access).

https://claude.ai/code/session_01AX56ktjxp4ybrKFqAg7mMu
Mark P3.1-P3.4, P3.6, P3.8 complete. Add preliminary Run #3 entry to
perf-test-log.md with pending benchmark results (perf-tests.yml running).

https://claude.ai/code/session_01AX56ktjxp4ybrKFqAg7mMu
@github-actions

Copy link
Copy Markdown

[Perf] Stage: Deploy

Deploying PerfTestStack (TRex + DUT on c5n.2xlarge)...
Configs: rust-stdlib,plain-rust,rust-dpdk,rust-dpdk-multicore,native-dpdk
Packet sizes: 64,512,1400

@github-actions

Copy link
Copy Markdown

[Perf] Stage: Instances Ready

  • TRex: i-0093cd169681a34f1 (10.0.1.129)
  • DUT: i-093083fdc9249fdce (10.0.1.139)

@github-actions

Copy link
Copy Markdown

[Perf] Stage: TRex Config

Starting TRex configuration (MAC discovery + NIC binding)...

@github-actions

Copy link
Copy Markdown

[Perf] Stage: TRex Config OK

  • TX: 0000:00:06.0 MAC: 02:a8:38:73:5f:03
  • RX: 0000:00:07.0 MAC: 02:de:d3:11:07:1b
  • Gateway MAC: 02:ad:c1:93:71:77
    Starting TRex server...

@github-actions

Copy link
Copy Markdown

[Perf] Stage: TRex Started

TRex server running. Beginning benchmarks...

@github-actions

Copy link
Copy Markdown

[Perf] DUT Ready

DUT instance i-093083fdc9249fdce SSM working, build complete.

@github-actions

Copy link
Copy Markdown

[Perf] Stage: Benchmark (1/5)

Running rust-stdlib benchmark...
Packet sizes: 64,512,1400 | Duration: 30s/step | Target PPS: 70000,140000,350000,700000

@github-actions

Copy link
Copy Markdown

[Perf] Benchmark Diag: rust-stdlib preflight

TRex API OK: 2 ports
  Port 0: 02:a8:38:73:5f:03
  Port 1: 02:de:d3:11:07:1b
PREFLIGHT_OK

@github-actions

Copy link
Copy Markdown

[CI] Stage: Deploy

Infrastructure ready.

  • Sender: i-0ee1a3e6e7ddb5cae (DPDK ENI: 10.0.1.206)
  • Receiver: i-08ce818594135dfef (DPDK ENI: 10.0.1.59)
  • Both instances SSM-ready.

@github-actions

Copy link
Copy Markdown

[Perf] Benchmark Diag: rust-stdlib result

SSM exit: 0

Output (last 30 lines)
=== TRex Benchmark: rust-stdlib ===
Server: localhost, Port: 0
Src: 10.0.1.129 -> Dst: 10.0.1.139 (MAC: 02:ad:c1:93:71:77)
Packet sizes: [64, 512, 1400]
Rate steps (target PPS): [70000, 140000, 350000, 700000]
Duration per step: 30s
Source MAC: 02:a8:38:73:5f:03

--- Packet size: 64B ---
  Target: 70,000 pps ... TX: 70,000 pps, RX: 68,992 pps, Drop: 1.4407%, Lat avg: 0.0 us
  Target: 140,000 pps ... TX: 140,000 pps, RX: 138,904 pps, Drop: 0.7826%, Lat avg: 0.0 us
  Target: 350,000 pps ... TX: 350,000 pps, RX: 329,511 pps, Drop: 5.8541%, Lat avg: 0.0 us
  Target: 700,000 pps ... TX: 700,000 pps, RX: 331,024 pps, Drop: 52.7108%, Lat avg: 0.0 us

--- Packet size: 512B ---
  Target: 70,000 pps ... TX: 70,000 pps, RX: 68,999 pps, Drop: 1.4299%, Lat avg: 0.0 us
  Target: 140,000 pps ... TX: 140,000 pps, RX: 138,981 pps, Drop: 0.7278%, Lat avg: 334.0 us
  Target: 350,000 pps ... TX: 350,000 pps, RX: 313,586 pps, Drop: 10.4041%, Lat avg: 0.0 us
  Target: 700,000 pps ... TX: 700,000 pps, RX: 310,174 pps, Drop: 55.6894%, Lat avg: 1740.0 us

--- Packet size: 1400B ---
  Target: 70,000 pps ... TX: 70,000 pps, RX: 68,957 pps, Drop: 1.4904%, Lat avg: 0.0 us
  Target: 140,000 pps ... TX: 140,000 pps, RX: 138,976 pps, Drop: 0.7313%, Lat avg: 349.0 us
  Target: 350,000 pps ... TX: 350,000 pps, RX: 305,801 pps, Drop: 12.6282%, Lat avg: 484.0 us
  Target: 700,000 pps ... TX: 700,000 pps, RX: 302,293 pps, Drop: 56.8153%, Lat avg: 0.0 us

Results written to /tmp/perf-results/rust-stdlib.json
EXIT_CODE=0

@github-actions

Copy link
Copy Markdown

[Perf] Stage: Benchmark (2/5)

Running plain-rust benchmark...
Packet sizes: 64,512,1400 | Duration: 30s/step | Target PPS: 70000,140000,350000,700000

@github-actions

Copy link
Copy Markdown

[Perf] Benchmark Diag: plain-rust preflight

TRex API OK: 2 ports
  Port 0: 02:a8:38:73:5f:03
  Port 1: 02:de:d3:11:07:1b
PREFLIGHT_OK

@github-actions

Copy link
Copy Markdown

[Perf] Benchmark Diag: plain-rust result

SSM exit: 0

Output (last 30 lines)
=== TRex Benchmark: plain-rust ===
Server: localhost, Port: 0
Src: 10.0.1.129 -> Dst: 10.0.1.139 (MAC: 02:ad:c1:93:71:77)
Packet sizes: [64, 512, 1400]
Rate steps (target PPS): [70000, 140000, 350000, 700000]
Duration per step: 30s
Source MAC: 02:a8:38:73:5f:03

--- Packet size: 64B ---
  Target: 70,000 pps ... TX: 70,000 pps, RX: 68,999 pps, Drop: 1.4301%, Lat avg: 437.0 us
  Target: 140,000 pps ... TX: 140,000 pps, RX: 138,992 pps, Drop: 0.72%, Lat avg: 331.0 us
  Target: 350,000 pps ... TX: 350,000 pps, RX: 340,961 pps, Drop: 2.5825%, Lat avg: 499.0 us
  Target: 700,000 pps ... TX: 700,000 pps, RX: 329,133 pps, Drop: 52.981%, Lat avg: 0.0 us

--- Packet size: 512B ---
  Target: 70,000 pps ... TX: 70,000 pps, RX: 68,997 pps, Drop: 1.4323%, Lat avg: 0.0 us
  Target: 140,000 pps ... TX: 140,000 pps, RX: 138,995 pps, Drop: 0.7176%, Lat avg: 361.0 us
  Target: 350,000 pps ... TX: 350,000 pps, RX: 325,244 pps, Drop: 7.0731%, Lat avg: 0.0 us
  Target: 700,000 pps ... TX: 700,000 pps, RX: 319,345 pps, Drop: 54.3793%, Lat avg: 0.0 us

--- Packet size: 1400B ---
  Target: 70,000 pps ... TX: 70,000 pps, RX: 69,000 pps, Drop: 1.4286%, Lat avg: 0.0 us
  Target: 140,000 pps ... TX: 140,000 pps, RX: 138,972 pps, Drop: 0.7342%, Lat avg: 331.0 us
  Target: 350,000 pps ... TX: 350,000 pps, RX: 309,927 pps, Drop: 11.4494%, Lat avg: 570.0 us
  Target: 700,000 pps ... TX: 700,000 pps, RX: 294,764 pps, Drop: 57.8908%, Lat avg: 0.0 us

Results written to /tmp/perf-results/plain-rust.json
EXIT_CODE=0

@github-actions

Copy link
Copy Markdown

[Perf] Stage: Benchmark (3/5)

Running rust-dpdk benchmark...
Packet sizes: 64,512,1400 | Duration: 30s/step | Target PPS: 70000,140000,350000,700000

@github-actions

Copy link
Copy Markdown

[Perf] Benchmark Diag: rust-dpdk preflight

TRex API OK: 2 ports
  Port 0: 02:a8:38:73:5f:03
  Port 1: 02:de:d3:11:07:1b
PREFLIGHT_OK

@github-actions

Copy link
Copy Markdown

[CI] Stage: Summary

All tests PASSED.

ARP seeding: kernel /proc/net/arp (automatic)

  • tier1-dpdk-echo: 4 tests, 0 failures
  • tier2-kernel-interop: 4 tests, 0 failures
  • tier3-iperf-interop: 1 tests, 0 failures
  • tier3-iperf-interop: 1 tests, 0 failures

@github-actions

Copy link
Copy Markdown

✅ Integration Tests Passed (Run 23035234544)

Branch: 25/merge | Commit: 653b2340

Test Results

  • tier1-dpdk-echo.xml: 4 tests, 0 failures, skipped
  • tier2-kernel-interop.xml: 4 tests, 0 failures, skipped
  • tier3-iperf-sends.xml: 1 tests, 0 failures, skipped
  • tier3-our-app-sends.xml: 1 tests, 0 failures, skipped

Application Logs (last 20 lines)

receiver-echo-server.log

🚀 DPDK-STDLIB Echo Server
Binding to 10.0.1.59:9000
EAL: Detected CPU lcores: 2
EAL: Detected NUMA nodes: 1
EAL: Detected shared linkage of DPDK
EAL: Multi-process socket /var/run/dpdk/rte/mp_socket
EAL: Selected IOVA mode 'PA'
EAL: VFIO support initialized
EAL: Using IOMMU type 8 (No-IOMMU)
EAL: Probe PCI driver: net_ena (1d0f:ec20) device: 0000:00:06.0 (socket -1)
TELEMETRY: No legacy callbacks, legacy socket not created
✅ DPDK UDP socket bound to 10.0.1.59:9000 (MAC: 02:3e:4b:9f:ca:43)
Using DPDK acceleration (run-to-completion)
✅ Socket created successfully!
📡 Local address: 10.0.1.59:9000
🔄 Echo server running... (Ctrl+C to stop)
Shutting down gracefully...

sender-echo-server.log

🚀 DPDK-STDLIB Echo Server
Binding to 10.0.1.206:9000
EAL: Detected CPU lcores: 2
EAL: Detected NUMA nodes: 1
EAL: Detected shared linkage of DPDK
EAL: Multi-process socket /var/run/dpdk/rte/mp_socket
EAL: Selected IOVA mode 'PA'
EAL: VFIO support initialized
EAL: Using IOMMU type 8 (No-IOMMU)
EAL: Probe PCI driver: net_ena (1d0f:ec20) device: 0000:00:06.0 (socket -1)
TELEMETRY: No legacy callbacks, legacy socket not created
✅ DPDK UDP socket bound to 10.0.1.206:9000 (MAC: 02:cc:32:7d:d7:75)
Using DPDK acceleration (run-to-completion)
✅ Socket created successfully!
📡 Local address: 10.0.1.206:9000
🔄 Echo server running... (Ctrl+C to stop)
Shutting down gracefully...

sender-test-client.log

EAL: Multi-process socket /var/run/dpdk/rte/mp_socket
EAL: Selected IOVA mode 'PA'
EAL: VFIO support initialized
TELEMETRY: No legacy callbacks, legacy socket not created
DPDK bind failed (Port init failed: Invalid port ID: 0), falling back to tokio
Backend: tokio
Sending packets...
Sent 12 bytes: 'arp-probe #1'
Received 12 bytes from 10.0.1.59:9000: 'arp-probe #1'
Test complete
[2026-03-13T04:06:49Z] INFO: ARP resolution succeeded (got response from peer)
[2026-03-13T04:06:49Z] INFO: Test: udp_send_receive
[2026-03-13T04:06:50Z] INFO: UDP send/receive succeeded
[2026-03-13T04:06:50Z] INFO: Test: echo_roundtrip
[2026-03-13T04:06:51Z] INFO: Echo roundtrip succeeded: 5/5 responses received
[2026-03-13T04:06:51Z] INFO: Test: payload_integrity
[2026-03-13T04:06:51Z] INFO: Response received, checking payload match...
[2026-03-13T04:06:51Z] INFO: Payload integrity verified (found in response)
[2026-03-13T04:06:51Z] INFO: JUnit XML written to: /tmp/test-results/tier2-kernel-interop.xml
[2026-03-13T04:06:51Z] INFO: Tier 2 sender tests complete. Results: /tmp/test-results/tier2-kernel-interop.xml

receiver-test-client-iperf.log

[2026-03-13T04:13:21Z] INFO: iperf-sends: sent 10 packets, received 10 responses
[2026-03-13T04:13:21Z] INFO: iperf-sends: PASS (sent >= 5 packets)
[2026-03-13T04:13:21Z] INFO: JUnit XML written to: /tmp/test-results/tier3-iperf-sends.xml
[2026-03-13T04:13:21Z] INFO: iperf-sends test complete

sender-test-client-iperf.log

Received 30 bytes from 10.0.1.59:9000: 'dpdk-to-kernel-test-payload #3'
Sent 30 bytes: 'dpdk-to-kernel-test-payload #4'
Received 30 bytes from 10.0.1.59:9000: 'dpdk-to-kernel-test-payload #4'
Sent 30 bytes: 'dpdk-to-kernel-test-payload #5'
Received 30 bytes from 10.0.1.59:9000: 'dpdk-to-kernel-test-payload #5'
Sent 30 bytes: 'dpdk-to-kernel-test-payload #6'
Received 30 bytes from 10.0.1.59:9000: 'dpdk-to-kernel-test-payload #6'
Sent 30 bytes: 'dpdk-to-kernel-test-payload #7'
Received 30 bytes from 10.0.1.59:9000: 'dpdk-to-kernel-test-payload #7'
Sent 30 bytes: 'dpdk-to-kernel-test-payload #8'
Received 30 bytes from 10.0.1.59:9000: 'dpdk-to-kernel-test-payload #8'
Sent 30 bytes: 'dpdk-to-kernel-test-payload #9'
Received 30 bytes from 10.0.1.59:9000: 'dpdk-to-kernel-test-payload #9'
Sent 31 bytes: 'dpdk-to-kernel-test-payload #10'
Received 31 bytes from 10.0.1.59:9000: 'dpdk-to-kernel-test-payload #10'
Test complete
[2026-03-13T04:12:21Z] INFO: our-app-sends: sent 10 packets, received 10 responses
[2026-03-13T04:12:21Z] INFO: our-app-sends: PASS (sent >= 5 packets)
[2026-03-13T04:12:21Z] INFO: JUnit XML written to: /tmp/test-results/tier3-our-app-sends.xml
[2026-03-13T04:12:21Z] INFO: our-app-sends test complete
Full Application Logs (last 200 lines each)

receiver-echo-server.log

🚀 DPDK-STDLIB Echo Server
Binding to 10.0.1.59:9000
EAL: Detected CPU lcores: 2
EAL: Detected NUMA nodes: 1
EAL: Detected shared linkage of DPDK
EAL: Multi-process socket /var/run/dpdk/rte/mp_socket
EAL: Selected IOVA mode 'PA'
EAL: VFIO support initialized
EAL: Using IOMMU type 8 (No-IOMMU)
EAL: Probe PCI driver: net_ena (1d0f:ec20) device: 0000:00:06.0 (socket -1)
TELEMETRY: No legacy callbacks, legacy socket not created
✅ DPDK UDP socket bound to 10.0.1.59:9000 (MAC: 02:3e:4b:9f:ca:43)
Using DPDK acceleration (run-to-completion)
✅ Socket created successfully!
📡 Local address: 10.0.1.59:9000
🔄 Echo server running... (Ctrl+C to stop)
Shutting down gracefully...

sender-echo-server.log

🚀 DPDK-STDLIB Echo Server
Binding to 10.0.1.206:9000
EAL: Detected CPU lcores: 2
EAL: Detected NUMA nodes: 1
EAL: Detected shared linkage of DPDK
EAL: Multi-process socket /var/run/dpdk/rte/mp_socket
EAL: Selected IOVA mode 'PA'
EAL: VFIO support initialized
EAL: Using IOMMU type 8 (No-IOMMU)
EAL: Probe PCI driver: net_ena (1d0f:ec20) device: 0000:00:06.0 (socket -1)
TELEMETRY: No legacy callbacks, legacy socket not created
✅ DPDK UDP socket bound to 10.0.1.206:9000 (MAC: 02:cc:32:7d:d7:75)
Using DPDK acceleration (run-to-completion)
✅ Socket created successfully!
📡 Local address: 10.0.1.206:9000
🔄 Echo server running... (Ctrl+C to stop)
Shutting down gracefully...

sender-test-client.log

[2026-03-13T04:02:54Z] INFO: Test: arp_resolution
UDP Test Client
Target: 10.0.1.59:9000
Bind address: 10.0.1.206:0
Message: 'arp-probe'
Count: 1
EAL: Detected CPU lcores: 2
EAL: Detected NUMA nodes: 1
EAL: Detected shared linkage of DPDK
EAL: Multi-process socket /var/run/dpdk/rte/mp_socket
EAL: Selected IOVA mode 'PA'
EAL: VFIO support initialized
EAL: Using IOMMU type 8 (No-IOMMU)
EAL: Probe PCI driver: net_ena (1d0f:ec20) device: 0000:00:06.0 (socket -1)
TELEMETRY: No legacy callbacks, legacy socket not created
✅ DPDK UDP socket bound to 10.0.1.206:32768 (MAC: 02:cc:32:7d:d7:75)
Backend: dpdk
Sending packets...
Sent 12 bytes: 'arp-probe #1'
Received 12 bytes from 10.0.1.59:9000: 'arp-probe #1'
Test complete
[2026-03-13T04:02:54Z] INFO: ARP resolution succeeded (got response from peer)
[2026-03-13T04:02:54Z] INFO: Test: udp_send_receive
[2026-03-13T04:02:56Z] INFO: UDP send/receive succeeded
[2026-03-13T04:02:56Z] INFO: Test: echo_roundtrip
[2026-03-13T04:02:58Z] INFO: Echo roundtrip succeeded: 5/5 responses received
[2026-03-13T04:02:58Z] INFO: Test: payload_integrity
[2026-03-13T04:02:59Z] INFO: Response received, checking payload match...
[2026-03-13T04:02:59Z] INFO: Payload integrity verified (found in response)
[2026-03-13T04:02:59Z] INFO: JUnit XML written to: /tmp/test-results/tier1-dpdk-echo.xml
[2026-03-13T04:02:59Z] INFO: Tier 1 sender tests complete. Results: /tmp/test-results/tier1-dpdk-echo.xml
[2026-03-13T04:06:49Z] INFO: Test: arp_resolution
UDP Test Client
Target: 10.0.1.59:9000
Bind address: 0.0.0.0:0
Message: 'arp-probe'
Count: 1
EAL: Detected CPU lcores: 2
EAL: Detected NUMA nodes: 1
EAL: Detected shared linkage of DPDK
EAL: Multi-process socket /var/run/dpdk/rte/mp_socket
EAL: Selected IOVA mode 'PA'
EAL: VFIO support initialized
TELEMETRY: No legacy callbacks, legacy socket not created
DPDK bind failed (Port init failed: Invalid port ID: 0), falling back to tokio
Backend: tokio
Sending packets...
Sent 12 bytes: 'arp-probe #1'
Received 12 bytes from 10.0.1.59:9000: 'arp-probe #1'
Test complete
[2026-03-13T04:06:49Z] INFO: ARP resolution succeeded (got response from peer)
[2026-03-13T04:06:49Z] INFO: Test: udp_send_receive
[2026-03-13T04:06:50Z] INFO: UDP send/receive succeeded
[2026-03-13T04:06:50Z] INFO: Test: echo_roundtrip
[2026-03-13T04:06:51Z] INFO: Echo roundtrip succeeded: 5/5 responses received
[2026-03-13T04:06:51Z] INFO: Test: payload_integrity
[2026-03-13T04:06:51Z] INFO: Response received, checking payload match...
[2026-03-13T04:06:51Z] INFO: Payload integrity verified (found in response)
[2026-03-13T04:06:51Z] INFO: JUnit XML written to: /tmp/test-results/tier2-kernel-interop.xml
[2026-03-13T04:06:51Z] INFO: Tier 2 sender tests complete. Results: /tmp/test-results/tier2-kernel-interop.xml

receiver-test-client-iperf.log

[2026-03-13T04:13:21Z] INFO: iperf-sends: sent 10 packets, received 10 responses
[2026-03-13T04:13:21Z] INFO: iperf-sends: PASS (sent >= 5 packets)
[2026-03-13T04:13:21Z] INFO: JUnit XML written to: /tmp/test-results/tier3-iperf-sends.xml
[2026-03-13T04:13:21Z] INFO: iperf-sends test complete

sender-test-client-iperf.log

[2026-03-13T04:12:18Z] INFO: Pre-flight: checking DPDK state and ARP cache...
[2026-03-13T04:12:18Z] INFO: Local IP: 10.0.1.206, Peer IP: 10.0.1.59, Port: 9000
[2026-03-13T04:12:18Z] INFO: /proc/net/arp contents:
IP address       HW type     Flags       HW address            Mask     Device
10.0.1.1         0x1         0x2         02:2e:87:52:61:85     *        ens5
10.0.1.157       0x1         0x2         02:2e:e1:3e:91:09     *        ens5
10.0.1.206       0x1         0x2         02:cc:32:7d:d7:75     *        ens5
10.0.1.59        0x1         0x2         02:3e:4b:9f:ca:43     *        ens5
[2026-03-13T04:12:18Z] INFO: DPDK runtime state:
No /var/run/dpdk/ directory
[2026-03-13T04:12:18Z] INFO: vfio-pci bindings:
0000:00:06.0
bind
module
new_id
remove_id
uevent
unbind
[2026-03-13T04:12:18Z] INFO: Test binary: /opt/dpdk-stdlib/target/release/test-client
-rwxr-xr-x. 2 root root 1853880 Mar 13 04:00 /opt/dpdk-stdlib/target/release/test-client
[2026-03-13T04:12:18Z] INFO: Launching test-client: /opt/dpdk-stdlib/target/release/test-client --target 10.0.1.59 --port 9000 --bind-ip 10.0.1.206 --count 10 --delay 200
[2026-03-13T04:12:21Z] INFO: Test client output: UDP Test Client
Target: 10.0.1.59:9000
Bind address: 10.0.1.206:0
Message: 'dpdk-to-kernel-test-payload'
Count: 10
EAL: Detected CPU lcores: 2
EAL: Detected NUMA nodes: 1
EAL: Detected shared linkage of DPDK
EAL: Multi-process socket /var/run/dpdk/rte/mp_socket
EAL: Selected IOVA mode 'PA'
EAL: VFIO support initialized
EAL: Using IOMMU type 8 (No-IOMMU)
EAL: Probe PCI driver: net_ena (1d0f:ec20) device: 0000:00:06.0 (socket -1)
TELEMETRY: No legacy callbacks, legacy socket not created
✅ DPDK UDP socket bound to 10.0.1.206:32768 (MAC: 02:cc:32:7d:d7:75)
Backend: dpdk
Sending packets...
Sent 30 bytes: 'dpdk-to-kernel-test-payload #1'
Received 30 bytes from 10.0.1.59:9000: 'dpdk-to-kernel-test-payload #1'
Sent 30 bytes: 'dpdk-to-kernel-test-payload #2'
Received 30 bytes from 10.0.1.59:9000: 'dpdk-to-kernel-test-payload #2'
Sent 30 bytes: 'dpdk-to-kernel-test-payload #3'
Received 30 bytes from 10.0.1.59:9000: 'dpdk-to-kernel-test-payload #3'
Sent 30 bytes: 'dpdk-to-kernel-test-payload #4'
Received 30 bytes from 10.0.1.59:9000: 'dpdk-to-kernel-test-payload #4'
Sent 30 bytes: 'dpdk-to-kernel-test-payload #5'
Received 30 bytes from 10.0.1.59:9000: 'dpdk-to-kernel-test-payload #5'
Sent 30 bytes: 'dpdk-to-kernel-test-payload #6'
Received 30 bytes from 10.0.1.59:9000: 'dpdk-to-kernel-test-payload #6'
Sent 30 bytes: 'dpdk-to-kernel-test-payload #7'
Received 30 bytes from 10.0.1.59:9000: 'dpdk-to-kernel-test-payload #7'
Sent 30 bytes: 'dpdk-to-kernel-test-payload #8'
Received 30 bytes from 10.0.1.59:9000: 'dpdk-to-kernel-test-payload #8'
Sent 30 bytes: 'dpdk-to-kernel-test-payload #9'
Received 30 bytes from 10.0.1.59:9000: 'dpdk-to-kernel-test-payload #9'
Sent 31 bytes: 'dpdk-to-kernel-test-payload #10'
Received 31 bytes from 10.0.1.59:9000: 'dpdk-to-kernel-test-payload #10'
Test complete
[2026-03-13T04:12:21Z] INFO: our-app-sends: sent 10 packets, received 10 responses
[2026-03-13T04:12:21Z] INFO: our-app-sends: PASS (sent >= 5 packets)
[2026-03-13T04:12:21Z] INFO: JUnit XML written to: /tmp/test-results/tier3-our-app-sends.xml
[2026-03-13T04:12:21Z] INFO: our-app-sends test complete
⚠️ SSM Command Failures (receiver-ssm-failure.log)
=== Polling timeout after 30s ===
Status: InProgress
Instance: i-08ce818594135dfef (receiver)
Command ID: 858e5c97-5f56-41fa-b181-46bee6874060

=== STDOUT ===


=== STDERR ===


=== Polling timeout after 30s ===
Status: InProgress
Instance: i-08ce818594135dfef (receiver)
Command ID: 7cca3732-aa0e-4e08-8d10-7420b43530a3

=== STDOUT ===


=== STDERR ===


=== Polling timeout after 30s ===
Status: InProgress
Instance: i-08ce818594135dfef (receiver)
Command ID: 7dbca47c-b134-467e-8205-8a49e3a61326

=== STDOUT ===


=== STDERR ===


⚠️ SSM Command Failures (sender-ssm-failure.log)
=== Polling timeout after 30s ===
Status: InProgress
Instance: i-0ee1a3e6e7ddb5cae (sender)
Command ID: 59e8b60b-2986-4373-a436-c2a97e0494c4

=== STDOUT ===


=== STDERR ===


Network & PCI State

receiver-network-interfaces.log

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host noprefixroute 
       valid_lft forever preferred_lft forever
2: ens5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 qdisc mq state UP group default qlen 1000
    link/ether 02:c2:e2:85:2a:07 brd ff:ff:ff:ff:ff:ff
    altname enp0s5
    altname eni-0ba6a3f68f8643495
    altname device-number-0.0
    inet 10.0.1.163/24 metric 512 brd 10.0.1.255 scope global dynamic ens5
       valid_lft 2531sec preferred_lft 2531sec
    inet6 fe80::c2:e2ff:fe85:2a07/64 scope link proto kernel_ll 
       valid_lft forever preferred_lft forever
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default 
    link/ether 02:42:cc:b8:d0:3d brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever
6: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 02:3e:4b:9f:ca:43 brd ff:ff:ff:ff:ff:ff
    altname enp0s6
    altname ens6
    inet 10.0.1.59/24 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::3e:4bff:fe9f:ca43/64 scope link proto kernel_ll 
       valid_lft forever preferred_lft forever

sender-network-interfaces.log

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host noprefixroute 
       valid_lft forever preferred_lft forever
2: ens5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 qdisc mq state UP group default qlen 1000
    link/ether 02:b4:79:29:c5:d1 brd ff:ff:ff:ff:ff:ff
    altname enp0s5
    altname eni-08e88ec6bc6e30ab2
    altname device-number-0.0
    inet 10.0.1.17/24 metric 512 brd 10.0.1.255 scope global dynamic ens5
       valid_lft 2553sec preferred_lft 2553sec
    inet6 fe80::b4:79ff:fe29:c5d1/64 scope link proto kernel_ll 
       valid_lft forever preferred_lft forever
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default 
    link/ether 02:42:64:47:56:2f brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever

receiver-networking-diag-baseline.txt

=== NETWORKING DIAGNOSTICS ===
timestamp: 2026-03-13T04:02:14Z
hostname: ip-10-0-1-163.ec2.internal
kernel: 6.1.163-186.299.amzn2023.x86_64

=== DPDK PORT STATUS ===

Network devices using DPDK-compatible driver
============================================
0000:00:06.0 'Elastic Network Adapter (ENA) ec20' drv=vfio-pci unused=ena

Network devices using kernel driver
===================================
0000:00:05.0 'Elastic Network Adapter (ENA) ec20' if=ens5 drv=ena unused=vfio-pci *Active*

No 'Baseband' devices detected
==============================

No 'Crypto' devices detected
============================

No 'DMA' devices detected
=========================

No 'Eventdev' devices detected
==============================

No 'Mempool' devices detected
=============================

No 'Compress' devices detected
==============================

No 'Misc (rawdev)' devices detected
===================================

No 'Regex' devices detected
===========================

=== IP ADDRESSES ===
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host noprefixroute 
       valid_lft forever preferred_lft forever
2: ens5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 qdisc mq state UP group default qlen 1000
    link/ether 02:c2:e2:85:2a:07 brd ff:ff:ff:ff:ff:ff
    altname enp0s5
    altname eni-0ba6a3f68f8643495
    altname device-number-0.0
    inet 10.0.1.163/24 metric 512 brd 10.0.1.255 scope global dynamic ens5
       valid_lft 3320sec preferred_lft 3320sec
    inet6 fe80::c2:e2ff:fe85:2a07/64 scope link proto kernel_ll 
       valid_lft forever preferred_lft forever
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default 
    link/ether 02:42:cc:b8:d0:3d brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever

=== ARP TABLE ===
10.0.1.157 dev ens5 lladdr 02:2e:e1:3e:91:09 REACHABLE 
10.0.1.1 dev ens5 lladdr 02:2e:87:52:61:85 REACHABLE 

=== ROUTE TABLE ===
default via 10.0.1.1 dev ens5 proto dhcp src 10.0.1.163 metric 512 
10.0.0.2 via 10.0.1.1 dev ens5 proto dhcp src 10.0.1.163 metric 512 
10.0.1.0/24 dev ens5 proto kernel scope link src 10.0.1.163 metric 512 
10.0.1.1 dev ens5 proto dhcp scope link src 10.0.1.163 metric 512 
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1 linkdown 

=== IMDS: ENI INFORMATION ===
ENI MACs found: 02:3e:4b:9f:ca:43/ 02:c2:e2:85:2a:07/ 

--- ENI: 02:3e:4b:9f:ca:43/ ---
  device-number: 1
  local-ipv4s: 10.0.1.59
  subnet-id: subnet-035535826e7524a01
  subnet-cidr: 10.0.1.0/24

--- ENI: 02:c2:e2:85:2a:07/ ---
  device-number: 0
  local-ipv4s: 10.0.1.163
  subnet-id: subnet-035535826e7524a01
  subnet-cidr: 10.0.1.0/24


=== GATEWAY ARP TEST ===
Gateway IP: 10.0.1.1
Gateway ARP entry:
10.0.1.1 dev ens5 lladdr 02:2e:87:52:61:85 REACHABLE 

arping result:
ARPING 10.0.1.1 from 10.0.1.163 ens5
Unicast reply from 10.0.1.1 [02:2E:87:52:61:85]  0.543ms
Sent 1 probes (1 broadcast(s))
Received 1 response(s)

=== HUGEPAGE STATUS ===
AnonHugePages:         0 kB
ShmemHugePages:        0 kB
FileHugePages:         0 kB
HugePages_Total:    1024
HugePages_Free:     1024
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
Hugetlb:         2097152 kB

=== VFIO STATUS ===
total 0
drwxr-xr-x.  2 root root       80 Mar 13 04:02 .
drwxr-xr-x. 14 root root     3100 Mar 13 04:01 ..
crw-------.  1 root root 243,   0 Mar 13 04:02 noiommu-0
crw-rw-rw-.  1 root root  10, 196 Mar 13 03:57 vfio

noiommu mode:
Y

=== DPDK SHARED MEMORY ===
no /var/run/dpdk/ directory (clean state)

=== DPDK-RELATED DMESG (last 30 lines) ===
[    0.067942] x86/fpu: Enabled xstate features 0x2ff, context size is 2568 bytes, using 'compacted' format.
[    0.074147] audit: type=2000 audit(1773374247.808:1): state=initialized audit_enabled=0 res=1
[    0.075625] kprobes: kprobe jump-optimization is enabled. All kprobes are optimized if possible.
[    0.100276] ACPI: Interpreter enabled
[    0.100276] ACPI: Enabled 2 GPEs in block 00 to 0F
[    0.124023] pci 0000:00:05.0: enabling Extended Tags
[    0.156457] SGI XFS with ACLs, security attributes, quota, no debug enabled
[    0.187199] ACPI: \_SB_.LNKD: Enabled at IRQ 11
[    0.265284] IPI shorthand broadcast: enabled
[    0.265347] AES CTR mode by8 optimization enabled
[    2.545230] systemd[1]: Mounting dev-hugepages.mount - Huge Pages File System...
[    2.587212] systemd[1]: Mounted dev-hugepages.mount - Huge Pages File System.
[    2.634192] VFIO - User Level meta-driver version: 0.3
[    3.763290] ena 0000:00:05.0: Elastic Network Adapter (ENA) v2.16.1g
[    3.775053] ena 0000:00:05.0: ENA device version: 0.10
[    3.775813] ena 0000:00:05.0: ENA controller version: 0.0.1 implementation version 1
[    3.882184] ena 0000:00:05.0: ENA Large LLQ is disabled
[    3.894895] ena 0000:00:05.0: Elastic Network Adapter (ENA) found at mem c0500000, mac addr 02:c2:e2:85:2a:07
[    3.955270] ena 0000:00:05.0 ens5: renamed from eth0
[    5.034513] ena 0000:00:05.0 ens5: Local page cache is disabled for less than 16 channels
[  230.767390] pci 0000:00:06.0: enabling Extended Tags
[  230.771270] ena 0000:00:06.0: enabling device (0000 -> 0002)
[  230.783695] ena 0000:00:06.0: ENA device version: 0.10
[  230.784484] ena 0000:00:06.0: ENA controller version: 0.0.1 implementation version 1
[  230.883682] ena 0000:00:06.0: ENA Large LLQ is disabled
[  230.895575] ena 0000:00:06.0: Elastic Network Adapter (ENA) found at mem c0508000, mac addr 02:3e:4b:9f:ca:43
[  230.933786] ena 0000:00:06.0 ens6: renamed from eth0
[  231.367588] ena 0000:00:06.0 ens6: Local page cache is disabled for less than 16 channels
[  272.489153] vfio-pci 0000:00:06.0: Adding to iommu group 0
[  272.490490] vfio-pci 0000:00:06.0: Adding kernel taint for vfio-noiommu group on device

=== DPDK-RELATED PROCESSES ===
no DPDK processes running

=== END DIAGNOSTICS ===

sender-networking-diag-baseline.txt

=== NETWORKING DIAGNOSTICS ===
timestamp: 2026-03-13T04:02:06Z
hostname: ip-10-0-1-17.ec2.internal
kernel: 6.1.163-186.299.amzn2023.x86_64

=== DPDK PORT STATUS ===

Network devices using DPDK-compatible driver
============================================
0000:00:06.0 'Elastic Network Adapter (ENA) ec20' drv=vfio-pci unused=ena

Network devices using kernel driver
===================================
0000:00:05.0 'Elastic Network Adapter (ENA) ec20' if=ens5 drv=ena unused=vfio-pci *Active*

No 'Baseband' devices detected
==============================

No 'Crypto' devices detected
============================

No 'DMA' devices detected
=========================

No 'Eventdev' devices detected
==============================

No 'Mempool' devices detected
=============================

No 'Compress' devices detected
==============================

No 'Misc (rawdev)' devices detected
===================================

No 'Regex' devices detected
===========================

=== IP ADDRESSES ===
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host noprefixroute 
       valid_lft forever preferred_lft forever
2: ens5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 qdisc mq state UP group default qlen 1000
    link/ether 02:b4:79:29:c5:d1 brd ff:ff:ff:ff:ff:ff
    altname enp0s5
    altname eni-08e88ec6bc6e30ab2
    altname device-number-0.0
    inet 10.0.1.17/24 metric 512 brd 10.0.1.255 scope global dynamic ens5
       valid_lft 3327sec preferred_lft 3327sec
    inet6 fe80::b4:79ff:fe29:c5d1/64 scope link proto kernel_ll 
       valid_lft forever preferred_lft forever
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default 
    link/ether 02:42:64:47:56:2f brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever

=== ARP TABLE ===
10.0.1.1 dev ens5 lladdr 02:2e:87:52:61:85 REACHABLE 
10.0.1.157 dev ens5 lladdr 02:2e:e1:3e:91:09 REACHABLE 

=== ROUTE TABLE ===
default via 10.0.1.1 dev ens5 proto dhcp src 10.0.1.17 metric 512 
10.0.0.2 via 10.0.1.1 dev ens5 proto dhcp src 10.0.1.17 metric 512 
10.0.1.0/24 dev ens5 proto kernel scope link src 10.0.1.17 metric 512 
10.0.1.1 dev ens5 proto dhcp scope link src 10.0.1.17 metric 512 
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1 linkdown 

=== IMDS: ENI INFORMATION ===
ENI MACs found: 02:b4:79:29:c5:d1/ 02:cc:32:7d:d7:75/ 

--- ENI: 02:b4:79:29:c5:d1/ ---
  device-number: 0
  local-ipv4s: 10.0.1.17
  subnet-id: subnet-035535826e7524a01
  subnet-cidr: 10.0.1.0/24

--- ENI: 02:cc:32:7d:d7:75/ ---
  device-number: 1
  local-ipv4s: 10.0.1.206
  subnet-id: subnet-035535826e7524a01
  subnet-cidr: 10.0.1.0/24


=== GATEWAY ARP TEST ===
Gateway IP: 10.0.1.1
Gateway ARP entry:
10.0.1.1 dev ens5 lladdr 02:2e:87:52:61:85 REACHABLE 

arping result:
ARPING 10.0.1.1 from 10.0.1.17 ens5
Unicast reply from 10.0.1.1 [02:2E:87:52:61:85]  0.538ms
Sent 1 probes (1 broadcast(s))
Received 1 response(s)

=== HUGEPAGE STATUS ===
AnonHugePages:         0 kB
ShmemHugePages:        0 kB
FileHugePages:         0 kB
HugePages_Total:    1024
HugePages_Free:     1024
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
Hugetlb:         2097152 kB

=== VFIO STATUS ===
total 0
drwxr-xr-x.  2 root root       80 Mar 13 04:01 .
drwxr-xr-x. 14 root root     3100 Mar 13 04:00 ..
crw-------.  1 root root 243,   0 Mar 13 04:01 noiommu-0
crw-rw-rw-.  1 root root  10, 196 Mar 13 03:57 vfio

noiommu mode:
Y

=== DPDK SHARED MEMORY ===
no /var/run/dpdk/ directory (clean state)

=== DPDK-RELATED DMESG (last 30 lines) ===
[    0.067040] x86/fpu: Enabled xstate features 0x2ff, context size is 2568 bytes, using 'compacted' format.
[    0.073401] audit: type=2000 audit(1773374247.068:1): state=initialized audit_enabled=0 res=1
[    0.074866] kprobes: kprobe jump-optimization is enabled. All kprobes are optimized if possible.
[    0.099385] ACPI: Interpreter enabled
[    0.099385] ACPI: Enabled 2 GPEs in block 00 to 0F
[    0.122766] pci 0000:00:05.0: enabling Extended Tags
[    0.155852] SGI XFS with ACLs, security attributes, quota, no debug enabled
[    0.197153] ACPI: \_SB_.LNKD: Enabled at IRQ 11
[    0.264952] IPI shorthand broadcast: enabled
[    0.265037] AES CTR mode by8 optimization enabled
[    2.335223] systemd[1]: Mounting dev-hugepages.mount - Huge Pages File System...
[    2.378722] systemd[1]: Mounted dev-hugepages.mount - Huge Pages File System.
[    2.421143] VFIO - User Level meta-driver version: 0.3
[    3.547539] ena 0000:00:05.0: Elastic Network Adapter (ENA) v2.16.1g
[    3.555066] ena 0000:00:05.0: ENA device version: 0.10
[    3.555827] ena 0000:00:05.0: ENA controller version: 0.0.1 implementation version 1
[    3.655010] ena 0000:00:05.0: ENA Large LLQ is disabled
[    3.666993] ena 0000:00:05.0: Elastic Network Adapter (ENA) found at mem c0500000, mac addr 02:b4:79:29:c5:d1
[    3.725079] ena 0000:00:05.0 ens5: renamed from eth0
[    4.771423] ena 0000:00:05.0 ens5: Local page cache is disabled for less than 16 channels
[  210.517051] pci 0000:00:06.0: enabling Extended Tags
[  210.520885] ena 0000:00:06.0: enabling device (0000 -> 0002)
[  210.532100] ena 0000:00:06.0: ENA device version: 0.10
[  210.532850] ena 0000:00:06.0: ENA controller version: 0.0.1 implementation version 1
[  210.629384] ena 0000:00:06.0: ENA Large LLQ is disabled
[  210.641891] ena 0000:00:06.0: Elastic Network Adapter (ENA) found at mem c0508000, mac addr 02:cc:32:7d:d7:75
[  210.702185] ena 0000:00:06.0 ens6: renamed from eth0
[  210.980932] ena 0000:00:06.0 ens6: Local page cache is disabled for less than 16 channels
[  266.365532] vfio-pci 0000:00:06.0: Adding to iommu group 0
[  266.366821] vfio-pci 0000:00:06.0: Adding kernel taint for vfio-noiommu group on device

=== DPDK-RELATED PROCESSES ===
no DPDK processes running

=== END DIAGNOSTICS ===
⚠️ Crash Diagnostics

receiver-dmesg-crashes.log

[    0.074127] pid_max: default: 32768 minimum: 301
[    0.126114] iommu: Default domain type: Translated 
[    0.126858] NetLabel:  unlabeled traffic allowed by default
[    0.134297] PCI: CLS 0 bytes, default 64
[    0.205758] nvme nvme0: 2/0/0 default/read/poll queues
[    0.431315] systemd[1]: systemd 252.23-11.amzn2023 running in system mode (+PAM +AUDIT +SELINUX -APPARMOR +IMA +SMACK +SECCOMP -GCRYPT -GNUTLS +OPENSSL +ACL +BLKID +CURL +ELFUTILS +FIDO2 +IDN2 -IDN -IPTC +KMOD +LIBCRYPTSETUP +LIBFDISK +PCRE2 +PWQUALITY +P11KIT +QRENCODE +TPM2 -BZIP2 -LZ4 +XZ +ZLIB -ZSTD +BPF_FRAMEWORK +XKBCOMMON +UTMP +SYSVINIT default-hierarchy=unified)
[    0.431411] systemd[1]: No hostname configured, using default hostname.
[    0.527892] systemd[1]: Queued start job for default target initrd.target.
[    1.818008] systemd[1]: systemd 252.23-11.amzn2023 running in system mode (+PAM +AUDIT +SELINUX -APPARMOR +IMA +SMACK +SECCOMP -GCRYPT -GNUTLS +OPENSSL +ACL +BLKID +CURL +ELFUTILS +FIDO2 +IDN2 -IDN -IPTC +KMOD +LIBCRYPTSETUP +LIBFDISK +PCRE2 +PWQUALITY +P11KIT +QRENCODE +TPM2 -BZIP2 -LZ4 +XZ +ZLIB -ZSTD +BPF_FRAMEWORK +XKBCOMMON +UTMP +SYSVINIT default-hierarchy=unified)
[    9.552643] bridge: filtering via arp/ip/ip6tables is no longer available by default. Update your scripts to load br_netfilter if you need this.
[  310.645680] vfio-pci 0000:00:06.0: vfio-noiommu device opened by user (echo:6763)
[  546.124142] vfio-pci 0000:00:06.0: vfio-noiommu device opened by user (echo:10789)

sender-dmesg-crashes.log

[    0.073379] pid_max: default: 32768 minimum: 301
[    0.124849] iommu: Default domain type: Translated 
[    0.125568] NetLabel:  unlabeled traffic allowed by default
[    0.133379] PCI: CLS 0 bytes, default 64
[    0.216528] nvme nvme0: 2/0/0 default/read/poll queues
[    0.431052] systemd[1]: systemd 252.23-11.amzn2023 running in system mode (+PAM +AUDIT +SELINUX -APPARMOR +IMA +SMACK +SECCOMP -GCRYPT -GNUTLS +OPENSSL +ACL +BLKID +CURL +ELFUTILS +FIDO2 +IDN2 -IDN -IPTC +KMOD +LIBCRYPTSETUP +LIBFDISK +PCRE2 +PWQUALITY +P11KIT +QRENCODE +TPM2 -BZIP2 -LZ4 +XZ +ZLIB -ZSTD +BPF_FRAMEWORK +XKBCOMMON +UTMP +SYSVINIT default-hierarchy=unified)
[    0.431154] systemd[1]: No hostname configured, using default hostname.
[    0.548026] systemd[1]: Queued start job for default target initrd.target.
[    1.568433] systemd[1]: systemd 252.23-11.amzn2023 running in system mode (+PAM +AUDIT +SELINUX -APPARMOR +IMA +SMACK +SECCOMP -GCRYPT -GNUTLS +OPENSSL +ACL +BLKID +CURL +ELFUTILS +FIDO2 +IDN2 -IDN -IPTC +KMOD +LIBCRYPTSETUP +LIBFDISK +PCRE2 +PWQUALITY +P11KIT +QRENCODE +TPM2 -BZIP2 -LZ4 +XZ +ZLIB -ZSTD +BPF_FRAMEWORK +XKBCOMMON +UTMP +SYSVINIT default-hierarchy=unified)
[    8.672432] bridge: filtering via arp/ip/ip6tables is no longer available by default. Update your scripts to load br_netfilter if you need this.
[  937.043458] vfio-pci 0000:00:06.0: vfio-noiommu device opened by user (echo:38107)
Kernel Console (dmesg)

receiver-console-output.log (PCI/driver events only)

[  230.766108] pci 0000:00:06.0: reg 0x18: [mem 0x00000000-0x000fffff pref]
[  230.767390] pci 0000:00:06.0: enabling Extended Tags
[  230.769194] pci 0000:00:06.0: BAR 2: assigned [mem 0xc0600000-0xc06fffff pref]
[  230.770243] pci 0000:00:06.0: BAR 0: assigned [mem 0xc0508000-0xc050bfff]
[  230.771270] ena 0000:00:06.0: enabling device (0000 -> 0002)
[  230.783695] ena 0000:00:06.0: ENA device version: 0.10
[  230.784484] ena 0000:00:06.0: ENA controller version: 0.0.1 implementation version 1
[  230.883682] ena 0000:00:06.0: ENA Large LLQ is disabled
[  230.895575] ena 0000:00:06.0: Elastic Network Adapter (ENA) found at mem c0508000, mac addr 02:3e:4b:9f:ca:43
[  230.933786] ena 0000:00:06.0 ens6: renamed from eth0
[  231.367588] ena 0000:00:06.0 ens6: Local page cache is disabled for less than 16 channels
[  272.489153] vfio-pci 0000:00:06.0: Adding to iommu group 0
[  272.490490] vfio-pci 0000:00:06.0: Adding kernel taint for vfio-noiommu group on device
[  310.645680] vfio-pci 0000:00:06.0: vfio-noiommu device opened by user (echo:6763)
[  493.106709] vfio-pci 0000:00:06.0: Removing from iommu group 0
[  494.114839] ena 0000:00:06.0: ENA device version: 0.10
[  494.115610] ena 0000:00:06.0: ENA controller version: 0.0.1 implementation version 1
[  494.211969] ena 0000:00:06.0: ENA Large LLQ is disabled
[  494.224624] ena 0000:00:06.0: Elastic Network Adapter (ENA) found at mem c0508000, mac addr 02:3e:4b:9f:ca:43
[  494.272119] ena 0000:00:06.0 ens6: renamed from eth0
[  494.334201] ena 0000:00:06.0 ens6: Local page cache is disabled for less than 16 channels
[  514.066104] vfio-pci 0000:00:06.0: Adding to iommu group 0
[  514.067427] vfio-pci 0000:00:06.0: Adding kernel taint for vfio-noiommu group on device
[  546.124142] vfio-pci 0000:00:06.0: vfio-noiommu device opened by user (echo:10789)
[  627.411182] vfio-pci 0000:00:06.0: Removing from iommu group 0
[  628.421081] ena 0000:00:06.0: ENA device version: 0.10
[  628.421879] ena 0000:00:06.0: ENA controller version: 0.0.1 implementation version 1
[  628.521089] ena 0000:00:06.0: ENA Large LLQ is disabled
[  628.532938] ena 0000:00:06.0: Elastic Network Adapter (ENA) found at mem c0508000, mac addr 02:3e:4b:9f:ca:43
[  628.543061] ena 0000:00:06.0 eth0: Local page cache is disabled for less than 16 channels

sender-console-output.log (PCI/driver events only)

[    4.771423] ena 0000:00:05.0 ens5: Local page cache is disabled for less than 16 channels
[  210.513698] pci 0000:00:06.0: [1d0f:ec20] type 00 class 0x020000
[  210.514767] pci 0000:00:06.0: reg 0x10: [mem 0x00000000-0x00003fff]
[  210.515790] pci 0000:00:06.0: reg 0x18: [mem 0x00000000-0x000fffff pref]
[  210.517051] pci 0000:00:06.0: enabling Extended Tags
[  210.518824] pci 0000:00:06.0: BAR 2: assigned [mem 0xc0600000-0xc06fffff pref]
[  210.519866] pci 0000:00:06.0: BAR 0: assigned [mem 0xc0508000-0xc050bfff]
[  210.520885] ena 0000:00:06.0: enabling device (0000 -> 0002)
[  210.532100] ena 0000:00:06.0: ENA device version: 0.10
[  210.532850] ena 0000:00:06.0: ENA controller version: 0.0.1 implementation version 1
[  210.629384] ena 0000:00:06.0: ENA Large LLQ is disabled
[  210.641891] ena 0000:00:06.0: Elastic Network Adapter (ENA) found at mem c0508000, mac addr 02:cc:32:7d:d7:75
[  210.702185] ena 0000:00:06.0 ens6: renamed from eth0
[  210.980932] ena 0000:00:06.0 ens6: Local page cache is disabled for less than 16 channels
[  266.365532] vfio-pci 0000:00:06.0: Adding to iommu group 0
[  266.366821] vfio-pci 0000:00:06.0: Adding kernel taint for vfio-noiommu group on device
[  327.452819] vfio-pci 0000:00:06.0: vfio-noiommu device opened by user (tokio-rt-worker:7229)
[  328.192704] vfio-pci 0000:00:06.0: vfio-noiommu device opened by user (tokio-rt-worker:7249)
[  329.942712] vfio-pci 0000:00:06.0: vfio-noiommu device opened by user (tokio-rt-worker:7271)
[  331.502662] vfio-pci 0000:00:06.0: vfio-noiommu device opened by user (tokio-rt-worker:7296)
[  377.308620] vfio-pci 0000:00:06.0: Removing from iommu group 0
[  378.319558] ena 0000:00:06.0: ENA device version: 0.10
[  378.320329] ena 0000:00:06.0: ENA controller version: 0.0.1 implementation version 1
[  378.419571] ena 0000:00:06.0: ENA Large LLQ is disabled
[  378.431400] ena 0000:00:06.0: Elastic Network Adapter (ENA) found at mem c0508000, mac addr 02:cc:32:7d:d7:75
[  378.440593] ena 0000:00:06.0 eth0: Local page cache is disabled for less than 16 channels
[  749.958185] vfio-pci 0000:00:06.0: Adding to iommu group 0
[  749.959677] vfio-pci 0000:00:06.0: Adding kernel taint for vfio-noiommu group on device
[  891.924179] vfio-pci 0000:00:06.0: vfio-noiommu device opened by user (tokio-rt-worker:35760)
[  937.043458] vfio-pci 0000:00:06.0: vfio-noiommu device opened by user (echo:38107)

@github-actions

Copy link
Copy Markdown

[Perf] Benchmark Diag: rust-dpdk result

SSM exit: 0

Output (last 30 lines)
=== TRex Benchmark: rust-dpdk ===
Server: localhost, Port: 0
Src: 10.0.1.129 -> Dst: 10.0.1.139 (MAC: 02:ad:c1:93:71:77)
Packet sizes: [64, 512, 1400]
Rate steps (target PPS): [70000, 140000, 350000, 700000]
Duration per step: 30s
Source MAC: 02:a8:38:73:5f:03

--- Packet size: 64B ---
  Target: 70,000 pps ... TX: 70,000 pps, RX: 70,000 pps, Drop: 0.0%, Lat avg: 226.0 us
  Target: 140,000 pps ... TX: 140,000 pps, RX: 139,968 pps, Drop: 0.0229%, Lat avg: 229.0 us
  Target: 350,000 pps ... TX: 350,000 pps, RX: 350,000 pps, Drop: 0.0%, Lat avg: 239.0 us
  Target: 700,000 pps ... TX: 700,000 pps, RX: 663,979 pps, Drop: 5.1458%, Lat avg: 874.0 us

--- Packet size: 512B ---
  Target: 70,000 pps ... TX: 70,000 pps, RX: 70,000 pps, Drop: 0.0%, Lat avg: 227.0 us
  Target: 140,000 pps ... TX: 140,000 pps, RX: 140,000 pps, Drop: 0.0%, Lat avg: 235.0 us
  Target: 350,000 pps ... TX: 350,000 pps, RX: 349,771 pps, Drop: 0.0654%, Lat avg: 246.0 us
  Target: 700,000 pps ... TX: 700,000 pps, RX: 637,236 pps, Drop: 8.9662%, Lat avg: 1065.0 us

--- Packet size: 1400B ---
  Target: 70,000 pps ... TX: 70,000 pps, RX: 70,000 pps, Drop: 0.0%, Lat avg: 230.0 us
  Target: 140,000 pps ... TX: 140,000 pps, RX: 139,994 pps, Drop: 0.0043%, Lat avg: 190.0 us
  Target: 350,000 pps ... TX: 350,000 pps, RX: 349,996 pps, Drop: 0.0013%, Lat avg: 258.0 us
  Target: 700,000 pps ... TX: 700,000 pps, RX: 447,556 pps, Drop: 36.0634%, Lat avg: 3688.0 us

Results written to /tmp/perf-results/rust-dpdk.json
EXIT_CODE=0

@github-actions

Copy link
Copy Markdown

[Perf] Stage: Benchmark (4/5)

Running rust-dpdk-multicore benchmark...
Packet sizes: 64,512,1400 | Duration: 30s/step | Target PPS: 70000,140000,350000,700000

@github-actions

Copy link
Copy Markdown

[Perf] Benchmark Diag: rust-dpdk-multicore preflight

TRex API OK: 2 ports
  Port 0: 02:a8:38:73:5f:03
  Port 1: 02:de:d3:11:07:1b
PREFLIGHT_OK

@github-actions

Copy link
Copy Markdown

[Perf] Benchmark Diag: rust-dpdk-multicore result

SSM exit: 0

Output (last 30 lines)
=== TRex Benchmark: rust-dpdk-multicore ===
Server: localhost, Port: 0
Src: 10.0.1.129 -> Dst: 10.0.1.139 (MAC: 02:ad:c1:93:71:77)
Packet sizes: [64, 512, 1400]
Rate steps (target PPS): [70000, 140000, 350000, 700000]
Duration per step: 30s
Source MAC: 02:a8:38:73:5f:03

--- Packet size: 64B ---
  Target: 70,000 pps ... TX: 70,000 pps, RX: 70,000 pps, Drop: 0.0%, Lat avg: 324.0 us
  Target: 140,000 pps ... TX: 140,000 pps, RX: 140,000 pps, Drop: 0.0%, Lat avg: 296.0 us
  Target: 350,000 pps ... TX: 350,000 pps, RX: 349,567 pps, Drop: 0.1238%, Lat avg: 406.0 us
  Target: 700,000 pps ... TX: 700,000 pps, RX: 545,274 pps, Drop: 22.1037%, Lat avg: 2275.0 us

--- Packet size: 512B ---
  Target: 70,000 pps ... TX: 70,000 pps, RX: 70,000 pps, Drop: 0.0%, Lat avg: 363.0 us
  Target: 140,000 pps ... TX: 140,000 pps, RX: 140,000 pps, Drop: 0.0%, Lat avg: 335.0 us
  Target: 350,000 pps ... TX: 350,000 pps, RX: 342,538 pps, Drop: 2.132%, Lat avg: 2962.0 us
  Target: 700,000 pps ... TX: 700,000 pps, RX: 340,822 pps, Drop: 51.3111%, Lat avg: 3160.0 us

--- Packet size: 1400B ---
  Target: 70,000 pps ... TX: 70,000 pps, RX: 70,000 pps, Drop: 0.0%, Lat avg: 434.0 us
  Target: 140,000 pps ... TX: 140,000 pps, RX: 140,000 pps, Drop: 0.0%, Lat avg: 418.0 us
  Target: 350,000 pps ... TX: 350,000 pps, RX: 218,909 pps, Drop: 37.4547%, Lat avg: 4803.0 us
  Target: 700,000 pps ... TX: 700,000 pps, RX: 218,841 pps, Drop: 68.737%, Lat avg: 6538.0 us

Results written to /tmp/perf-results/rust-dpdk-multicore.json
EXIT_CODE=0

@github-actions

Copy link
Copy Markdown

[Perf] Stage: Benchmark (5/5)

Running native-dpdk benchmark...
Packet sizes: 64,512,1400 | Duration: 30s/step | Target PPS: 70000,140000,350000,700000

@github-actions

Copy link
Copy Markdown

[Perf] Benchmark Diag: native-dpdk preflight

TRex API OK: 2 ports
  Port 0: 02:a8:38:73:5f:03
  Port 1: 02:de:d3:11:07:1b
PREFLIGHT_OK

@github-actions

Copy link
Copy Markdown

[Perf] Benchmark Diag: native-dpdk result

SSM exit: 0

Output (last 30 lines)
=== TRex Benchmark: native-dpdk ===
Server: localhost, Port: 0
Src: 10.0.1.129 -> Dst: 10.0.1.139 (MAC: 02:ad:c1:93:71:77)
Packet sizes: [64, 512, 1400]
Rate steps (target PPS): [70000, 140000, 350000, 700000]
Duration per step: 30s
Source MAC: 02:a8:38:73:5f:03

--- Packet size: 64B ---
  Target: 70,000 pps ... TX: 70,000 pps, RX: 70,000 pps, Drop: 0.0%, Lat avg: 114.0 us
  Target: 140,000 pps ... TX: 140,000 pps, RX: 140,000 pps, Drop: 0.0%, Lat avg: 144.0 us
  Target: 350,000 pps ... TX: 350,000 pps, RX: 350,000 pps, Drop: 0.0%, Lat avg: 128.0 us
  Target: 700,000 pps ... TX: 700,000 pps, RX: 671,555 pps, Drop: 4.0635%, Lat avg: 704.0 us

--- Packet size: 512B ---
  Target: 70,000 pps ... TX: 70,000 pps, RX: 70,000 pps, Drop: 0.0%, Lat avg: 122.0 us
  Target: 140,000 pps ... TX: 140,000 pps, RX: 140,000 pps, Drop: 0.0%, Lat avg: 150.0 us
  Target: 350,000 pps ... TX: 350,000 pps, RX: 350,000 pps, Drop: 0.0%, Lat avg: 112.0 us
  Target: 700,000 pps ... TX: 700,000 pps, RX: 636,515 pps, Drop: 9.0693%, Lat avg: 790.0 us

--- Packet size: 1400B ---
  Target: 70,000 pps ... TX: 70,000 pps, RX: 70,000 pps, Drop: 0.0%, Lat avg: 128.0 us
  Target: 140,000 pps ... TX: 140,000 pps, RX: 140,000 pps, Drop: 0.0%, Lat avg: 102.0 us
  Target: 350,000 pps ... TX: 350,000 pps, RX: 349,997 pps, Drop: 0.0008%, Lat avg: 162.0 us
  Target: 700,000 pps ... TX: 700,000 pps, RX: 447,809 pps, Drop: 36.0273%, Lat avg: 3759.0 us

Results written to /tmp/perf-results/native-dpdk.json
EXIT_CODE=0

@github-actions

Copy link
Copy Markdown

[Perf] Diag: testpmd log

testpmd output (last 30 lines)
=== testpmd stats (last 30 lines) ===
  TX-packets: 99500512   TX-errors: 0          TX-bytes:  57664986562

  Throughput (since last show)
  Rx-pps:       447726          Rx-bps:   5000206928
  Tx-pps:       447725          Tx-bps:   5000196872
  ############################################################################
�[2J�[1;1H
Port statistics ====================================
  ######################## NIC statistics for port 0  ########################
  RX-packets: 103119411  RX-missed: 0          RX-bytes:  62662234982
  RX-errors: 335823
  RX-nombuf:  0         
  TX-packets: 103078442  TX-errors: 0          TX-bytes:  62659776842

  Throughput (since last show)
  Rx-pps:       357766          Rx-bps:   3995532896
  Tx-pps:       357767          Tx-bps:   3995542952
  ############################################################################
�[2J�[1;1H
Port statistics ====================================
  ######################## NIC statistics for port 0  ########################
  RX-packets: 103119412  RX-missed: 0          RX-bytes:  62662235024
  RX-errors: 335823
  RX-nombuf:  0         
  TX-packets: 103078443  TX-errors: 0          TX-bytes:  62659776884

  Throughput (since last show)
  Rx-pps:            0          Rx-bps:           32
  Tx-pps:            0          Tx-bps:           32
  ############################################################################
=== ENA port stats ===
N/A (vfio-pci)

@github-actions

Copy link
Copy Markdown

[Perf] Stage: Results

[04:39:58] INFO Generating markdown summary...

Performance Test Results — c5n.2xlarge

Commit: 6499d516
Timestamp: 2026-03-13T04:39:58.845225+00:00

1400B packets

Config Target PPS TX pps RX pps Drop % Lat Avg (us) Lat Max (us) TX Mbps RX Mbps
native-dpdk 70,000 70,000 70,000 0.00% 128.0 303.0 784.0 784.0
native-dpdk 140,000 140,000 140,000 0.00% 102.0 383.0 1568.0 1568.0
native-dpdk 350,000 350,000 349,997 0.00% 162.0 718.0 3920.0 3920.0
native-dpdk 700,000 700,000 447,809 36.03% 3759.0 4044.0 7840.0 5015.5
rust-dpdk 70,000 70,000 70,000 0.00% 230.0 3067.0 784.0 784.0
rust-dpdk 140,000 140,000 139,994 0.00% 190.0 7425.0 1568.0 1567.9
rust-dpdk 350,000 350,000 349,996 0.00% 258.0 2915.0 3920.0 3919.9
rust-dpdk 700,000 700,000 447,556 36.06% 3688.0 5650.0 7840.0 5012.6
rust-dpdk-multicore 70,000 70,000 70,000 0.00% 434.0 2290.0 784.0 784.0
rust-dpdk-multicore 140,000 140,000 140,000 0.00% 418.0 1857.0 1568.0 1568.0
rust-dpdk-multicore 350,000 350,000 218,909 37.45% 4803.0 7189.0 3920.0 2451.8
rust-dpdk-multicore 700,000 700,000 218,841 68.74% 6538.0 9868.0 7840.0 2451.0
rust-stdlib 70,000 70,000 68,957 1.49% 0.0 0.0 784.0 772.3
rust-stdlib 140,000 140,000 138,976 0.73% 349.0 0.0 1568.0 1556.5
rust-stdlib 350,000 350,000 305,801 12.63% 484.0 0.0 3920.0 3425.0
rust-stdlib 700,000 700,000 302,293 56.82% 0.0 0.0 7840.0 3385.7
plain-rust 70,000 70,000 69,000 1.43% 0.0 0.0 784.0 772.8
plain-rust 140,000 140,000 138,972 0.73% 331.0 0.0 1568.0 1556.5
plain-rust 350,000 350,000 309,927 11.45% 570.0 0.0 3920.0 3471.2
plain-rust 700,000 700,000 294,764 57.89% 0.0 0.0 7840.0 3301.4

512B packets

Config Target PPS TX pps RX pps Drop % Lat Avg (us) Lat Max (us) TX Mbps RX Mbps
native-dpdk 70,000 70,000 70,000 0.00% 122.0 350.0 286.7 286.7
native-dpdk 140,000 140,000 140,000 0.00% 150.0 1981.0 573.4 573.4
native-dpdk 350,000 350,000 350,000 0.00% 112.0 345.0 1433.6 1433.6
native-dpdk 700,000 700,000 636,515 9.07% 790.0 2279.0 2867.2 2607.2
rust-dpdk 70,000 70,000 70,000 0.00% 227.0 2304.0 286.7 286.7
rust-dpdk 140,000 140,000 140,000 0.00% 235.0 2360.0 573.4 573.4
rust-dpdk 350,000 350,000 349,771 0.07% 246.0 14247.0 1433.6 1432.7
rust-dpdk 700,000 700,000 637,236 8.97% 1065.0 3960.0 2867.2 2610.1
rust-dpdk-multicore 70,000 70,000 70,000 0.00% 363.0 3388.0 286.7 286.7
rust-dpdk-multicore 140,000 140,000 140,000 0.00% 335.0 2969.0 573.4 573.4
rust-dpdk-multicore 350,000 350,000 342,538 2.13% 2962.0 5344.0 1433.6 1403.0
rust-dpdk-multicore 700,000 700,000 340,822 51.31% 3160.0 7074.0 2867.2 1396.0
rust-stdlib 70,000 70,000 68,999 1.43% 0.0 0.0 286.7 282.6
rust-stdlib 140,000 140,000 138,981 0.73% 334.0 0.0 573.4 569.3
rust-stdlib 350,000 350,000 313,586 10.40% 0.0 0.0 1433.6 1284.5
rust-stdlib 700,000 700,000 310,174 55.69% 1740.0 0.0 2867.2 1270.5
plain-rust 70,000 70,000 68,997 1.43% 0.0 0.0 286.7 282.6
plain-rust 140,000 140,000 138,995 0.72% 361.0 0.0 573.4 569.3
plain-rust 350,000 350,000 325,244 7.07% 0.0 0.0 1433.6 1332.2
plain-rust 700,000 700,000 319,345 54.38% 0.0 0.0 2867.2 1308.0

64B packets

Config Target PPS TX pps RX pps Drop % Lat Avg (us) Lat Max (us) TX Mbps RX Mbps
native-dpdk 70,000 70,000 70,000 0.00% 114.0 266.0 35.8 35.8
native-dpdk 140,000 140,000 140,000 0.00% 144.0 360.0 71.7 71.7
native-dpdk 350,000 350,000 350,000 0.00% 128.0 612.0 179.2 179.2
native-dpdk 700,000 700,000 671,555 4.06% 704.0 3067.0 358.4 343.8
rust-dpdk 70,000 70,000 70,000 0.00% 226.0 2548.0 35.8 35.8
rust-dpdk 140,000 140,000 139,968 0.02% 229.0 13471.0 71.7 71.7
rust-dpdk 350,000 350,000 350,000 0.00% 239.0 2445.0 179.2 179.2
rust-dpdk 700,000 700,000 663,979 5.15% 874.0 3345.0 358.4 340.0
rust-dpdk-multicore 70,000 70,000 70,000 0.00% 324.0 2988.0 35.8 35.8
rust-dpdk-multicore 140,000 140,000 140,000 0.00% 296.0 2190.0 71.7 71.7
rust-dpdk-multicore 350,000 350,000 349,567 0.12% 406.0 5273.0 179.2 179.0
rust-dpdk-multicore 700,000 700,000 545,274 22.10% 2275.0 4112.0 358.4 279.2
rust-stdlib 70,000 70,000 68,992 1.44% 0.0 0.0 35.8 35.3
rust-stdlib 140,000 140,000 138,904 0.78% 0.0 0.0 71.7 71.1
rust-stdlib 350,000 350,000 329,511 5.85% 0.0 0.0 179.2 168.7
rust-stdlib 700,000 700,000 331,024 52.71% 0.0 0.0 358.4 169.5
plain-rust 70,000 70,000 68,999 1.43% 437.0 0.0 35.8 35.3
plain-rust 140,000 140,000 138,992 0.72% 331.0 0.0 71.7 71.2
plain-rust 350,000 350,000 340,961 2.58% 499.0 0.0 179.2 174.6
plain-rust 700,000 700,000 329,133 52.98% 0.0 0.0 358.4 168.5

Full results artifact

…rings

Two critical fixes for Phase 3 performance:

1. FramePool::free() race condition: Changed from load+store to fetch_add
   for MPSC safety when multiple workers free concurrently. Increased free
   list to 2x capacity to prevent wraparound collisions.

2. True zero-copy: Workers now create AppPacket (FrameRef + payload offset)
   instead of ProcessedPacket (Vec<u8>). Frames stay in pool until
   recv_from() copies payload to user buffer and frees. Eliminates the
   per-packet heap allocation that negated FramePool's benefit.

https://claude.ai/code/session_01AX56ktjxp4ybrKFqAg7mMu
@gspivey

gspivey commented Mar 13, 2026

Copy link
Copy Markdown
Owner Author

Phase 3 Fix: True Zero-Copy Pipeline

The initial Phase 3 benchmark showed a regression because:

  1. FramePool::free() race condition: Multiple workers called free() concurrently using load+store on the head pointer, causing lost frames. Fixed by switching to fetch_add (MPSC-safe). Also increased free list to 2× capacity for wraparound safety.

  2. False zero-copy: Workers still allocated Vec<u8> in ProcessedPacket despite using FramePool. The new AppPacket struct carries a FrameRef + payload_offset + payload_len through the SPSC app ring. recv_from() reads the payload directly from the pool, copies to the user buffer, then frees the frame — eliminating all per-packet heap allocations in the RX→Worker→App path.

Changes

  • frame_pool.rs: Fixed free() race, added AppPacket struct
  • topology.rs: Worker now creates AppPacket (zero-copy) instead of ProcessedPacket (Vec), frames freed by recv_from not worker
  • lib.rs: recv_from_pipeline() reads payload from pool via AppPacket, frees frame after copy

Re-running perf tests: https://github.com/gspivey/dpdk-stdlib-rust/actions/runs/23036730290

@github-actions

Copy link
Copy Markdown

[Perf] Stage: TRex Config OK

  • TX: 0000:00:06.0 MAC: 02:b7:d5:18:17:45
  • RX: 0000:00:07.0 MAC: 02:d8:de:56:a1:8d
  • Gateway MAC: 02:61:87:20:13:ad
    Starting TRex server...

@github-actions

Copy link
Copy Markdown

[Perf] Stage: TRex Started

TRex server running. Beginning benchmarks...

@github-actions

Copy link
Copy Markdown

[Perf] DUT Ready

DUT instance i-0b278652961bd518f SSM working, build complete.

@github-actions

Copy link
Copy Markdown

[Perf] Stage: Benchmark (1/5)

Running rust-stdlib benchmark...
Packet sizes: 64,512,1400 | Duration: 30s/step | Target PPS: 70000,140000,350000,700000

@github-actions

Copy link
Copy Markdown

[Perf] Benchmark Diag: rust-stdlib preflight

TRex API OK: 2 ports
  Port 0: 02:b7:d5:18:17:45
  Port 1: 02:d8:de:56:a1:8d
PREFLIGHT_OK

@github-actions

Copy link
Copy Markdown

[Perf] Benchmark Diag: rust-stdlib result

SSM exit: 0

Output (last 30 lines)
=== TRex Benchmark: rust-stdlib ===
Server: localhost, Port: 0
Src: 10.0.1.219 -> Dst: 10.0.1.168 (MAC: 02:61:87:20:13:ad)
Packet sizes: [64, 512, 1400]
Rate steps (target PPS): [70000, 140000, 350000, 700000]
Duration per step: 30s
Source MAC: 02:b7:d5:18:17:45

--- Packet size: 64B ---
  Target: 70,000 pps ... TX: 70,000 pps, RX: 68,996 pps, Drop: 1.4336%, Lat avg: 579.0 us
  Target: 140,000 pps ... TX: 140,000 pps, RX: 138,981 pps, Drop: 0.7277%, Lat avg: 526.0 us
  Target: 350,000 pps ... TX: 350,000 pps, RX: 192,646 pps, Drop: 44.9582%, Lat avg: 0.0 us
  Target: 700,000 pps ... TX: 700,000 pps, RX: 84,153 pps, Drop: 87.9782%, Lat avg: 0.0 us

--- Packet size: 512B ---
  Target: 70,000 pps ... TX: 70,000 pps, RX: 68,998 pps, Drop: 1.4321%, Lat avg: 0.0 us
  Target: 140,000 pps ... TX: 140,000 pps, RX: 138,289 pps, Drop: 1.2221%, Lat avg: 573.0 us
  Target: 350,000 pps ... TX: 350,000 pps, RX: 174,162 pps, Drop: 50.2395%, Lat avg: 0.0 us
  Target: 700,000 pps ... TX: 700,000 pps, RX: 77,405 pps, Drop: 88.9421%, Lat avg: 0.0 us

--- Packet size: 1400B ---
  Target: 70,000 pps ... TX: 70,000 pps, RX: 68,974 pps, Drop: 1.4658%, Lat avg: 0.0 us
  Target: 140,000 pps ... TX: 140,000 pps, RX: 138,722 pps, Drop: 0.9128%, Lat avg: 440.0 us
  Target: 350,000 pps ... TX: 350,000 pps, RX: 167,655 pps, Drop: 52.0985%, Lat avg: 0.0 us
  Target: 700,000 pps ... TX: 700,000 pps, RX: 133,628 pps, Drop: 80.9102%, Lat avg: 0.0 us

Results written to /tmp/perf-results/rust-stdlib.json
EXIT_CODE=0

@github-actions

Copy link
Copy Markdown

[Perf] Stage: Benchmark (2/5)

Running plain-rust benchmark...
Packet sizes: 64,512,1400 | Duration: 30s/step | Target PPS: 70000,140000,350000,700000

@github-actions

Copy link
Copy Markdown

[Perf] Benchmark Diag: plain-rust preflight

TRex API OK: 2 ports
  Port 0: 02:b7:d5:18:17:45
  Port 1: 02:d8:de:56:a1:8d
PREFLIGHT_OK

@github-actions

Copy link
Copy Markdown

[CI] Stage: Summary

All tests PASSED.

ARP seeding: kernel /proc/net/arp (automatic)

  • tier1-dpdk-echo: 4 tests, 0 failures
  • tier2-kernel-interop: 4 tests, 0 failures
  • tier3-iperf-interop: 1 tests, 0 failures
  • tier3-iperf-interop: 1 tests, 0 failures

@github-actions

Copy link
Copy Markdown

✅ Integration Tests Passed (Run 23077712886)

Branch: 25/merge | Commit: faedaef2

Test Results

  • tier1-dpdk-echo.xml: 4 tests, 0 failures, skipped
  • tier2-kernel-interop.xml: 4 tests, 0 failures, skipped
  • tier3-iperf-sends.xml: 1 tests, 0 failures, skipped
  • tier3-our-app-sends.xml: 1 tests, 0 failures, skipped

Application Logs (last 20 lines)

receiver-echo-server.log

🚀 DPDK-STDLIB Echo Server
Binding to 10.0.1.166:9000
EAL: Detected CPU lcores: 2
EAL: Detected NUMA nodes: 1
EAL: Detected shared linkage of DPDK
EAL: Multi-process socket /var/run/dpdk/rte/mp_socket
EAL: Selected IOVA mode 'PA'
EAL: VFIO support initialized
EAL: Using IOMMU type 8 (No-IOMMU)
EAL: Probe PCI driver: net_ena (1d0f:ec20) device: 0000:00:06.0 (socket -1)
TELEMETRY: No legacy callbacks, legacy socket not created
✅ DPDK UDP socket bound to 10.0.1.166:9000 (MAC: 02:47:41:d2:f6:87)
Using DPDK acceleration (run-to-completion)
✅ Socket created successfully!
📡 Local address: 10.0.1.166:9000
🔄 Echo server running... (Ctrl+C to stop)
Shutting down gracefully...

sender-echo-server.log

🚀 DPDK-STDLIB Echo Server
Binding to 10.0.1.131:9000
EAL: Detected CPU lcores: 2
EAL: Detected NUMA nodes: 1
EAL: Detected shared linkage of DPDK
EAL: Multi-process socket /var/run/dpdk/rte/mp_socket
EAL: Selected IOVA mode 'PA'
EAL: VFIO support initialized
EAL: Using IOMMU type 8 (No-IOMMU)
EAL: Probe PCI driver: net_ena (1d0f:ec20) device: 0000:00:06.0 (socket -1)
TELEMETRY: No legacy callbacks, legacy socket not created
✅ DPDK UDP socket bound to 10.0.1.131:9000 (MAC: 02:5f:bc:c2:be:7d)
Using DPDK acceleration (run-to-completion)
✅ Socket created successfully!
📡 Local address: 10.0.1.131:9000
🔄 Echo server running... (Ctrl+C to stop)
Shutting down gracefully...

sender-test-client.log

EAL: Multi-process socket /var/run/dpdk/rte/mp_socket
EAL: Selected IOVA mode 'PA'
EAL: VFIO support initialized
TELEMETRY: No legacy callbacks, legacy socket not created
DPDK bind failed (Port init failed: Invalid port ID: 0), falling back to tokio
Backend: tokio
Sending packets...
Sent 12 bytes: 'arp-probe #1'
Received 12 bytes from 10.0.1.166:9000: 'arp-probe #1'
Test complete
[2026-03-14T02:05:19Z] INFO: ARP resolution succeeded (got response from peer)
[2026-03-14T02:05:19Z] INFO: Test: udp_send_receive
[2026-03-14T02:05:20Z] INFO: UDP send/receive succeeded
[2026-03-14T02:05:20Z] INFO: Test: echo_roundtrip
[2026-03-14T02:05:21Z] INFO: Echo roundtrip succeeded: 5/5 responses received
[2026-03-14T02:05:21Z] INFO: Test: payload_integrity
[2026-03-14T02:05:21Z] INFO: Response received, checking payload match...
[2026-03-14T02:05:21Z] INFO: Payload integrity verified (found in response)
[2026-03-14T02:05:21Z] INFO: JUnit XML written to: /tmp/test-results/tier2-kernel-interop.xml
[2026-03-14T02:05:21Z] INFO: Tier 2 sender tests complete. Results: /tmp/test-results/tier2-kernel-interop.xml

receiver-test-client-iperf.log

[2026-03-14T02:11:39Z] INFO: iperf-sends: sent 10 packets, received 10 responses
[2026-03-14T02:11:39Z] INFO: iperf-sends: PASS (sent >= 5 packets)
[2026-03-14T02:11:39Z] INFO: JUnit XML written to: /tmp/test-results/tier3-iperf-sends.xml
[2026-03-14T02:11:39Z] INFO: iperf-sends test complete

sender-test-client-iperf.log

Received 30 bytes from 10.0.1.166:9000: 'dpdk-to-kernel-test-payload #3'
Sent 30 bytes: 'dpdk-to-kernel-test-payload #4'
Received 30 bytes from 10.0.1.166:9000: 'dpdk-to-kernel-test-payload #4'
Sent 30 bytes: 'dpdk-to-kernel-test-payload #5'
Received 30 bytes from 10.0.1.166:9000: 'dpdk-to-kernel-test-payload #5'
Sent 30 bytes: 'dpdk-to-kernel-test-payload #6'
Received 30 bytes from 10.0.1.166:9000: 'dpdk-to-kernel-test-payload #6'
Sent 30 bytes: 'dpdk-to-kernel-test-payload #7'
Received 30 bytes from 10.0.1.166:9000: 'dpdk-to-kernel-test-payload #7'
Sent 30 bytes: 'dpdk-to-kernel-test-payload #8'
Received 30 bytes from 10.0.1.166:9000: 'dpdk-to-kernel-test-payload #8'
Sent 30 bytes: 'dpdk-to-kernel-test-payload #9'
Received 30 bytes from 10.0.1.166:9000: 'dpdk-to-kernel-test-payload #9'
Sent 31 bytes: 'dpdk-to-kernel-test-payload #10'
Received 31 bytes from 10.0.1.166:9000: 'dpdk-to-kernel-test-payload #10'
Test complete
[2026-03-14T02:10:36Z] INFO: our-app-sends: sent 10 packets, received 10 responses
[2026-03-14T02:10:36Z] INFO: our-app-sends: PASS (sent >= 5 packets)
[2026-03-14T02:10:36Z] INFO: JUnit XML written to: /tmp/test-results/tier3-our-app-sends.xml
[2026-03-14T02:10:36Z] INFO: our-app-sends test complete
Full Application Logs (last 200 lines each)

receiver-echo-server.log

🚀 DPDK-STDLIB Echo Server
Binding to 10.0.1.166:9000
EAL: Detected CPU lcores: 2
EAL: Detected NUMA nodes: 1
EAL: Detected shared linkage of DPDK
EAL: Multi-process socket /var/run/dpdk/rte/mp_socket
EAL: Selected IOVA mode 'PA'
EAL: VFIO support initialized
EAL: Using IOMMU type 8 (No-IOMMU)
EAL: Probe PCI driver: net_ena (1d0f:ec20) device: 0000:00:06.0 (socket -1)
TELEMETRY: No legacy callbacks, legacy socket not created
✅ DPDK UDP socket bound to 10.0.1.166:9000 (MAC: 02:47:41:d2:f6:87)
Using DPDK acceleration (run-to-completion)
✅ Socket created successfully!
📡 Local address: 10.0.1.166:9000
🔄 Echo server running... (Ctrl+C to stop)
Shutting down gracefully...

sender-echo-server.log

🚀 DPDK-STDLIB Echo Server
Binding to 10.0.1.131:9000
EAL: Detected CPU lcores: 2
EAL: Detected NUMA nodes: 1
EAL: Detected shared linkage of DPDK
EAL: Multi-process socket /var/run/dpdk/rte/mp_socket
EAL: Selected IOVA mode 'PA'
EAL: VFIO support initialized
EAL: Using IOMMU type 8 (No-IOMMU)
EAL: Probe PCI driver: net_ena (1d0f:ec20) device: 0000:00:06.0 (socket -1)
TELEMETRY: No legacy callbacks, legacy socket not created
✅ DPDK UDP socket bound to 10.0.1.131:9000 (MAC: 02:5f:bc:c2:be:7d)
Using DPDK acceleration (run-to-completion)
✅ Socket created successfully!
📡 Local address: 10.0.1.131:9000
🔄 Echo server running... (Ctrl+C to stop)
Shutting down gracefully...

sender-test-client.log

[2026-03-14T02:01:11Z] INFO: Test: arp_resolution
UDP Test Client
Target: 10.0.1.166:9000
Bind address: 10.0.1.131:0
Message: 'arp-probe'
Count: 1
EAL: Detected CPU lcores: 2
EAL: Detected NUMA nodes: 1
EAL: Detected shared linkage of DPDK
EAL: Multi-process socket /var/run/dpdk/rte/mp_socket
EAL: Selected IOVA mode 'PA'
EAL: VFIO support initialized
EAL: Using IOMMU type 8 (No-IOMMU)
EAL: Probe PCI driver: net_ena (1d0f:ec20) device: 0000:00:06.0 (socket -1)
TELEMETRY: No legacy callbacks, legacy socket not created
✅ DPDK UDP socket bound to 10.0.1.131:32768 (MAC: 02:5f:bc:c2:be:7d)
Backend: dpdk
Sending packets...
Sent 12 bytes: 'arp-probe #1'
Received 12 bytes from 10.0.1.166:9000: 'arp-probe #1'
Test complete
[2026-03-14T02:01:13Z] INFO: ARP resolution succeeded (got response from peer)
[2026-03-14T02:01:13Z] INFO: Test: udp_send_receive
[2026-03-14T02:01:15Z] INFO: UDP send/receive succeeded
[2026-03-14T02:01:15Z] INFO: Test: echo_roundtrip
[2026-03-14T02:01:17Z] INFO: Echo roundtrip succeeded: 5/5 responses received
[2026-03-14T02:01:17Z] INFO: Test: payload_integrity
[2026-03-14T02:01:17Z] INFO: Response received, checking payload match...
[2026-03-14T02:01:17Z] INFO: Payload integrity verified (found in response)
[2026-03-14T02:01:17Z] INFO: JUnit XML written to: /tmp/test-results/tier1-dpdk-echo.xml
[2026-03-14T02:01:17Z] INFO: Tier 1 sender tests complete. Results: /tmp/test-results/tier1-dpdk-echo.xml
[2026-03-14T02:05:19Z] INFO: Test: arp_resolution
UDP Test Client
Target: 10.0.1.166:9000
Bind address: 0.0.0.0:0
Message: 'arp-probe'
Count: 1
EAL: Detected CPU lcores: 2
EAL: Detected NUMA nodes: 1
EAL: Detected shared linkage of DPDK
EAL: Multi-process socket /var/run/dpdk/rte/mp_socket
EAL: Selected IOVA mode 'PA'
EAL: VFIO support initialized
TELEMETRY: No legacy callbacks, legacy socket not created
DPDK bind failed (Port init failed: Invalid port ID: 0), falling back to tokio
Backend: tokio
Sending packets...
Sent 12 bytes: 'arp-probe #1'
Received 12 bytes from 10.0.1.166:9000: 'arp-probe #1'
Test complete
[2026-03-14T02:05:19Z] INFO: ARP resolution succeeded (got response from peer)
[2026-03-14T02:05:19Z] INFO: Test: udp_send_receive
[2026-03-14T02:05:20Z] INFO: UDP send/receive succeeded
[2026-03-14T02:05:20Z] INFO: Test: echo_roundtrip
[2026-03-14T02:05:21Z] INFO: Echo roundtrip succeeded: 5/5 responses received
[2026-03-14T02:05:21Z] INFO: Test: payload_integrity
[2026-03-14T02:05:21Z] INFO: Response received, checking payload match...
[2026-03-14T02:05:21Z] INFO: Payload integrity verified (found in response)
[2026-03-14T02:05:21Z] INFO: JUnit XML written to: /tmp/test-results/tier2-kernel-interop.xml
[2026-03-14T02:05:21Z] INFO: Tier 2 sender tests complete. Results: /tmp/test-results/tier2-kernel-interop.xml

receiver-test-client-iperf.log

[2026-03-14T02:11:39Z] INFO: iperf-sends: sent 10 packets, received 10 responses
[2026-03-14T02:11:39Z] INFO: iperf-sends: PASS (sent >= 5 packets)
[2026-03-14T02:11:39Z] INFO: JUnit XML written to: /tmp/test-results/tier3-iperf-sends.xml
[2026-03-14T02:11:39Z] INFO: iperf-sends test complete

sender-test-client-iperf.log

[2026-03-14T02:10:34Z] INFO: Pre-flight: checking DPDK state and ARP cache...
[2026-03-14T02:10:34Z] INFO: Local IP: 10.0.1.131, Peer IP: 10.0.1.166, Port: 9000
[2026-03-14T02:10:34Z] INFO: /proc/net/arp contents:
IP address       HW type     Flags       HW address            Mask     Device
10.0.1.1         0x1         0x2         02:63:92:0c:4e:b9     *        ens5
10.0.1.131       0x1         0x2         02:5f:bc:c2:be:7d     *        ens5
10.0.1.166       0x1         0x2         02:47:41:d2:f6:87     *        ens5
10.0.1.39        0x1         0x2         02:10:f0:c9:a7:df     *        ens5
[2026-03-14T02:10:34Z] INFO: DPDK runtime state:
No /var/run/dpdk/ directory
[2026-03-14T02:10:34Z] INFO: vfio-pci bindings:
0000:00:06.0
bind
module
new_id
remove_id
uevent
unbind
[2026-03-14T02:10:34Z] INFO: Test binary: /opt/dpdk-stdlib/target/release/test-client
-rwxr-xr-x. 2 root root 1858064 Mar 14 01:59 /opt/dpdk-stdlib/target/release/test-client
[2026-03-14T02:10:34Z] INFO: Launching test-client: /opt/dpdk-stdlib/target/release/test-client --target 10.0.1.166 --port 9000 --bind-ip 10.0.1.131 --count 10 --delay 200
[2026-03-14T02:10:36Z] INFO: Test client output: UDP Test Client
Target: 10.0.1.166:9000
Bind address: 10.0.1.131:0
Message: 'dpdk-to-kernel-test-payload'
Count: 10
EAL: Detected CPU lcores: 2
EAL: Detected NUMA nodes: 1
EAL: Detected shared linkage of DPDK
EAL: Multi-process socket /var/run/dpdk/rte/mp_socket
EAL: Selected IOVA mode 'PA'
EAL: VFIO support initialized
EAL: Using IOMMU type 8 (No-IOMMU)
EAL: Probe PCI driver: net_ena (1d0f:ec20) device: 0000:00:06.0 (socket -1)
TELEMETRY: No legacy callbacks, legacy socket not created
✅ DPDK UDP socket bound to 10.0.1.131:32768 (MAC: 02:5f:bc:c2:be:7d)
Backend: dpdk
Sending packets...
Sent 30 bytes: 'dpdk-to-kernel-test-payload #1'
Received 30 bytes from 10.0.1.166:9000: 'dpdk-to-kernel-test-payload #1'
Sent 30 bytes: 'dpdk-to-kernel-test-payload #2'
Received 30 bytes from 10.0.1.166:9000: 'dpdk-to-kernel-test-payload #2'
Sent 30 bytes: 'dpdk-to-kernel-test-payload #3'
Received 30 bytes from 10.0.1.166:9000: 'dpdk-to-kernel-test-payload #3'
Sent 30 bytes: 'dpdk-to-kernel-test-payload #4'
Received 30 bytes from 10.0.1.166:9000: 'dpdk-to-kernel-test-payload #4'
Sent 30 bytes: 'dpdk-to-kernel-test-payload #5'
Received 30 bytes from 10.0.1.166:9000: 'dpdk-to-kernel-test-payload #5'
Sent 30 bytes: 'dpdk-to-kernel-test-payload #6'
Received 30 bytes from 10.0.1.166:9000: 'dpdk-to-kernel-test-payload #6'
Sent 30 bytes: 'dpdk-to-kernel-test-payload #7'
Received 30 bytes from 10.0.1.166:9000: 'dpdk-to-kernel-test-payload #7'
Sent 30 bytes: 'dpdk-to-kernel-test-payload #8'
Received 30 bytes from 10.0.1.166:9000: 'dpdk-to-kernel-test-payload #8'
Sent 30 bytes: 'dpdk-to-kernel-test-payload #9'
Received 30 bytes from 10.0.1.166:9000: 'dpdk-to-kernel-test-payload #9'
Sent 31 bytes: 'dpdk-to-kernel-test-payload #10'
Received 31 bytes from 10.0.1.166:9000: 'dpdk-to-kernel-test-payload #10'
Test complete
[2026-03-14T02:10:36Z] INFO: our-app-sends: sent 10 packets, received 10 responses
[2026-03-14T02:10:36Z] INFO: our-app-sends: PASS (sent >= 5 packets)
[2026-03-14T02:10:36Z] INFO: JUnit XML written to: /tmp/test-results/tier3-our-app-sends.xml
[2026-03-14T02:10:36Z] INFO: our-app-sends test complete
⚠️ SSM Command Failures (receiver-ssm-failure.log)
=== Polling timeout after 30s ===
Status: InProgress
Instance: i-06884fc1842a19064 (receiver)
Command ID: a9aa87cb-177d-4b2b-95e0-f0ad0b8f9afa

=== STDOUT ===


=== STDERR ===


=== Polling timeout after 30s ===
Status: InProgress
Instance: i-06884fc1842a19064 (receiver)
Command ID: 337c5363-336e-4689-8f90-7ca72a1277e2

=== STDOUT ===


=== STDERR ===


=== Polling timeout after 30s ===
Status: InProgress
Instance: i-06884fc1842a19064 (receiver)
Command ID: 27552d0e-a3cf-453c-b37c-78e91671432a

=== STDOUT ===


=== STDERR ===


⚠️ SSM Command Failures (sender-ssm-failure.log)
=== Polling timeout after 30s ===
Status: InProgress
Instance: i-0ff8ba64f92f16346 (sender)
Command ID: 643d1532-2512-46b3-9e2d-1d3a8249387a

=== STDOUT ===


=== STDERR ===


Network & PCI State

receiver-network-interfaces.log

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host noprefixroute 
       valid_lft forever preferred_lft forever
2: ens5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 qdisc mq state UP group default qlen 1000
    link/ether 02:6d:2d:1f:a8:d1 brd ff:ff:ff:ff:ff:ff
    altname enp0s5
    altname eni-0c602d2513ef6c2c2
    altname device-number-0.0
    inet 10.0.1.6/24 metric 512 brd 10.0.1.255 scope global dynamic ens5
       valid_lft 2544sec preferred_lft 2544sec
    inet6 fe80::6d:2dff:fe1f:a8d1/64 scope link proto kernel_ll 
       valid_lft forever preferred_lft forever
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default 
    link/ether 02:42:9f:07:46:76 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever
6: ens6: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 qdisc mq state UP group default qlen 1000
    link/ether 02:47:41:d2:f6:87 brd ff:ff:ff:ff:ff:ff
    altname enp0s6
    altname eni-0ded2dd0e0d51d773
    altname device-number-1.0
    inet 10.0.1.166/24 brd 10.0.1.255 scope global ens6
       valid_lft forever preferred_lft forever
    inet6 fe80::47:41ff:fed2:f687/64 scope link proto kernel_ll 
       valid_lft forever preferred_lft forever

sender-network-interfaces.log

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host noprefixroute 
       valid_lft forever preferred_lft forever
2: ens5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 qdisc mq state UP group default qlen 1000
    link/ether 02:aa:59:cc:af:a3 brd ff:ff:ff:ff:ff:ff
    altname enp0s5
    altname eni-05f05700e54fdaff0
    altname device-number-0.0
    inet 10.0.1.29/24 metric 512 brd 10.0.1.255 scope global dynamic ens5
       valid_lft 2568sec preferred_lft 2568sec
    inet6 fe80::aa:59ff:fecc:afa3/64 scope link proto kernel_ll 
       valid_lft forever preferred_lft forever
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default 
    link/ether 02:42:97:bf:70:c0 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever

receiver-networking-diag-baseline.txt

=== NETWORKING DIAGNOSTICS ===
timestamp: 2026-03-14T02:00:30Z
hostname: ip-10-0-1-6.ec2.internal
kernel: 6.1.163-186.299.amzn2023.x86_64

=== DPDK PORT STATUS ===

Network devices using DPDK-compatible driver
============================================
0000:00:06.0 'Elastic Network Adapter (ENA) ec20' drv=vfio-pci unused=ena

Network devices using kernel driver
===================================
0000:00:05.0 'Elastic Network Adapter (ENA) ec20' if=ens5 drv=ena unused=vfio-pci *Active*

No 'Baseband' devices detected
==============================

No 'Crypto' devices detected
============================

No 'DMA' devices detected
=========================

No 'Eventdev' devices detected
==============================

No 'Mempool' devices detected
=============================

No 'Compress' devices detected
==============================

No 'Misc (rawdev)' devices detected
===================================

No 'Regex' devices detected
===========================

=== IP ADDRESSES ===
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host noprefixroute 
       valid_lft forever preferred_lft forever
2: ens5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 qdisc mq state UP group default qlen 1000
    link/ether 02:6d:2d:1f:a8:d1 brd ff:ff:ff:ff:ff:ff
    altname enp0s5
    altname eni-0c602d2513ef6c2c2
    altname device-number-0.0
    inet 10.0.1.6/24 metric 512 brd 10.0.1.255 scope global dynamic ens5
       valid_lft 3340sec preferred_lft 3340sec
    inet6 fe80::6d:2dff:fe1f:a8d1/64 scope link proto kernel_ll 
       valid_lft forever preferred_lft forever
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default 
    link/ether 02:42:9f:07:46:76 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever

=== ARP TABLE ===
10.0.1.1 dev ens5 lladdr 02:63:92:0c:4e:b9 REACHABLE 
10.0.1.39 dev ens5 lladdr 02:10:f0:c9:a7:df REACHABLE 

=== ROUTE TABLE ===
default via 10.0.1.1 dev ens5 proto dhcp src 10.0.1.6 metric 512 
10.0.0.2 via 10.0.1.1 dev ens5 proto dhcp src 10.0.1.6 metric 512 
10.0.1.0/24 dev ens5 proto kernel scope link src 10.0.1.6 metric 512 
10.0.1.1 dev ens5 proto dhcp scope link src 10.0.1.6 metric 512 
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1 linkdown 

=== IMDS: ENI INFORMATION ===
ENI MACs found: 02:47:41:d2:f6:87/ 02:6d:2d:1f:a8:d1/ 

--- ENI: 02:47:41:d2:f6:87/ ---
  device-number: 1
  local-ipv4s: 10.0.1.166
  subnet-id: subnet-023a870216cfbd8c4
  subnet-cidr: 10.0.1.0/24

--- ENI: 02:6d:2d:1f:a8:d1/ ---
  device-number: 0
  local-ipv4s: 10.0.1.6
  subnet-id: subnet-023a870216cfbd8c4
  subnet-cidr: 10.0.1.0/24


=== GATEWAY ARP TEST ===
Gateway IP: 10.0.1.1
Gateway ARP entry:
10.0.1.1 dev ens5 lladdr 02:63:92:0c:4e:b9 REACHABLE 

arping result:
ARPING 10.0.1.1 from 10.0.1.6 ens5
Unicast reply from 10.0.1.1 [02:63:92:0C:4E:B9]  0.536ms
Sent 1 probes (1 broadcast(s))
Received 1 response(s)

=== HUGEPAGE STATUS ===
AnonHugePages:         0 kB
ShmemHugePages:        0 kB
FileHugePages:         0 kB
HugePages_Total:    1024
HugePages_Free:     1024
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
Hugetlb:         2097152 kB

=== VFIO STATUS ===
total 0
drwxr-xr-x.  2 root root       80 Mar 14 02:00 .
drwxr-xr-x. 14 root root     3100 Mar 14 01:59 ..
crw-------.  1 root root 243,   0 Mar 14 02:00 noiommu-0
crw-rw-rw-.  1 root root  10, 196 Mar 14 01:56 vfio

noiommu mode:
Y

=== DPDK SHARED MEMORY ===
no /var/run/dpdk/ directory (clean state)

=== DPDK-RELATED DMESG (last 30 lines) ===
[    0.067894] x86/fpu: Enabled xstate features 0x2ff, context size is 2568 bytes, using 'compacted' format.
[    0.074116] audit: type=2000 audit(1773453363.689:1): state=initialized audit_enabled=0 res=1
[    0.075550] kprobes: kprobe jump-optimization is enabled. All kprobes are optimized if possible.
[    0.100732] ACPI: Interpreter enabled
[    0.100732] ACPI: Enabled 2 GPEs in block 00 to 0F
[    0.124176] pci 0000:00:05.0: enabling Extended Tags
[    0.155968] SGI XFS with ACLs, security attributes, quota, no debug enabled
[    0.185932] ACPI: \_SB_.LNKD: Enabled at IRQ 11
[    0.277136] IPI shorthand broadcast: enabled
[    0.277197] AES CTR mode by8 optimization enabled
[    2.395292] systemd[1]: Mounting dev-hugepages.mount - Huge Pages File System...
[    2.440311] systemd[1]: Mounted dev-hugepages.mount - Huge Pages File System.
[    2.472526] VFIO - User Level meta-driver version: 0.3
[    3.707493] ena 0000:00:05.0: Elastic Network Adapter (ENA) v2.16.1g
[    3.717484] ena 0000:00:05.0: ENA device version: 0.10
[    3.718248] ena 0000:00:05.0: ENA controller version: 0.0.1 implementation version 1
[    3.865005] ena 0000:00:05.0: ENA Large LLQ is disabled
[    3.877227] ena 0000:00:05.0: Elastic Network Adapter (ENA) found at mem c0500000, mac addr 02:6d:2d:1f:a8:d1
[    3.945141] ena 0000:00:05.0 ens5: renamed from eth0
[    5.069177] ena 0000:00:05.0 ens5: Local page cache is disabled for less than 16 channels
[  190.530365] pci 0000:00:06.0: enabling Extended Tags
[  190.534215] ena 0000:00:06.0: enabling device (0000 -> 0002)
[  190.547450] ena 0000:00:06.0: ENA device version: 0.10
[  190.548239] ena 0000:00:06.0: ENA controller version: 0.0.1 implementation version 1
[  190.644552] ena 0000:00:06.0: ENA Large LLQ is disabled
[  190.656638] ena 0000:00:06.0: Elastic Network Adapter (ENA) found at mem c0508000, mac addr 02:47:41:d2:f6:87
[  190.724526] ena 0000:00:06.0 ens6: renamed from eth0
[  191.071127] ena 0000:00:06.0 ens6: Local page cache is disabled for less than 16 channels
[  252.248491] vfio-pci 0000:00:06.0: Adding to iommu group 0
[  252.249829] vfio-pci 0000:00:06.0: Adding kernel taint for vfio-noiommu group on device

=== DPDK-RELATED PROCESSES ===
no DPDK processes running

=== END DIAGNOSTICS ===

sender-networking-diag-baseline.txt

=== NETWORKING DIAGNOSTICS ===
timestamp: 2026-03-14T02:00:22Z
hostname: ip-10-0-1-29.ec2.internal
kernel: 6.1.163-186.299.amzn2023.x86_64

=== DPDK PORT STATUS ===

Network devices using DPDK-compatible driver
============================================
0000:00:06.0 'Elastic Network Adapter (ENA) ec20' drv=vfio-pci unused=ena

Network devices using kernel driver
===================================
0000:00:05.0 'Elastic Network Adapter (ENA) ec20' if=ens5 drv=ena unused=vfio-pci *Active*

No 'Baseband' devices detected
==============================

No 'Crypto' devices detected
============================

No 'DMA' devices detected
=========================

No 'Eventdev' devices detected
==============================

No 'Mempool' devices detected
=============================

No 'Compress' devices detected
==============================

No 'Misc (rawdev)' devices detected
===================================

No 'Regex' devices detected
===========================

=== IP ADDRESSES ===
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host noprefixroute 
       valid_lft forever preferred_lft forever
2: ens5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 qdisc mq state UP group default qlen 1000
    link/ether 02:aa:59:cc:af:a3 brd ff:ff:ff:ff:ff:ff
    altname enp0s5
    altname eni-05f05700e54fdaff0
    altname device-number-0.0
    inet 10.0.1.29/24 metric 512 brd 10.0.1.255 scope global dynamic ens5
       valid_lft 3348sec preferred_lft 3348sec
    inet6 fe80::aa:59ff:fecc:afa3/64 scope link proto kernel_ll 
       valid_lft forever preferred_lft forever
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default 
    link/ether 02:42:97:bf:70:c0 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever

=== ARP TABLE ===
10.0.1.222 dev ens5 lladdr 02:da:d3:01:99:1f REACHABLE 
10.0.1.1 dev ens5 lladdr 02:63:92:0c:4e:b9 REACHABLE 
10.0.1.39 dev ens5 lladdr 02:10:f0:c9:a7:df REACHABLE 

=== ROUTE TABLE ===
default via 10.0.1.1 dev ens5 proto dhcp src 10.0.1.29 metric 512 
10.0.0.2 via 10.0.1.1 dev ens5 proto dhcp src 10.0.1.29 metric 512 
10.0.1.0/24 dev ens5 proto kernel scope link src 10.0.1.29 metric 512 
10.0.1.1 dev ens5 proto dhcp scope link src 10.0.1.29 metric 512 
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1 linkdown 

=== IMDS: ENI INFORMATION ===
ENI MACs found: 02:5f:bc:c2:be:7d/ 02:aa:59:cc:af:a3/ 

--- ENI: 02:5f:bc:c2:be:7d/ ---
  device-number: 1
  local-ipv4s: 10.0.1.131
  subnet-id: subnet-023a870216cfbd8c4
  subnet-cidr: 10.0.1.0/24

--- ENI: 02:aa:59:cc:af:a3/ ---
  device-number: 0
  local-ipv4s: 10.0.1.29
  subnet-id: subnet-023a870216cfbd8c4
  subnet-cidr: 10.0.1.0/24


=== GATEWAY ARP TEST ===
Gateway IP: 10.0.1.1
Gateway ARP entry:
10.0.1.1 dev ens5 lladdr 02:63:92:0c:4e:b9 REACHABLE 

arping result:
ARPING 10.0.1.1 from 10.0.1.29 ens5
Unicast reply from 10.0.1.1 [02:63:92:0C:4E:B9]  0.532ms
Sent 1 probes (1 broadcast(s))
Received 1 response(s)

=== HUGEPAGE STATUS ===
AnonHugePages:         0 kB
ShmemHugePages:        0 kB
FileHugePages:         0 kB
HugePages_Total:    1024
HugePages_Free:     1024
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
Hugetlb:         2097152 kB

=== VFIO STATUS ===
total 0
drwxr-xr-x.  2 root root       80 Mar 14 02:00 .
drwxr-xr-x. 14 root root     3100 Mar 14 01:59 ..
crw-------.  1 root root 243,   0 Mar 14 02:00 noiommu-0
crw-rw-rw-.  1 root root  10, 196 Mar 14 01:56 vfio

noiommu mode:
Y

=== DPDK SHARED MEMORY ===
no /var/run/dpdk/ directory (clean state)

=== DPDK-RELATED DMESG (last 30 lines) ===
[    0.067176] x86/fpu: Enabled xstate features 0x2ff, context size is 2568 bytes, using 'compacted' format.
[    0.073454] audit: type=2000 audit(1773453363.515:1): state=initialized audit_enabled=0 res=1
[    0.074882] kprobes: kprobe jump-optimization is enabled. All kprobes are optimized if possible.
[    0.099685] ACPI: Interpreter enabled
[    0.099685] ACPI: Enabled 2 GPEs in block 00 to 0F
[    0.123506] pci 0000:00:05.0: enabling Extended Tags
[    0.155718] SGI XFS with ACLs, security attributes, quota, no debug enabled
[    0.186097] ACPI: \_SB_.LNKD: Enabled at IRQ 11
[    0.266818] IPI shorthand broadcast: enabled
[    0.266880] AES CTR mode by8 optimization enabled
[    2.505234] systemd[1]: Mounting dev-hugepages.mount - Huge Pages File System...
[    2.552146] systemd[1]: Mounted dev-hugepages.mount - Huge Pages File System.
[    2.601288] VFIO - User Level meta-driver version: 0.3
[    3.791665] ena 0000:00:05.0: Elastic Network Adapter (ENA) v2.16.1g
[    3.801670] ena 0000:00:05.0: ENA device version: 0.10
[    3.802404] ena 0000:00:05.0: ENA controller version: 0.0.1 implementation version 1
[    3.904997] ena 0000:00:05.0: ENA Large LLQ is disabled
[    3.917049] ena 0000:00:05.0: Elastic Network Adapter (ENA) found at mem c0500000, mac addr 02:aa:59:cc:af:a3
[    3.965367] ena 0000:00:05.0 ens5: renamed from eth0
[    5.463494] ena 0000:00:05.0 ens5: Local page cache is disabled for less than 16 channels
[  210.865220] pci 0000:00:06.0: enabling Extended Tags
[  210.869030] ena 0000:00:06.0: enabling device (0000 -> 0002)
[  210.881630] ena 0000:00:06.0: ENA device version: 0.10
[  210.882417] ena 0000:00:06.0: ENA controller version: 0.0.1 implementation version 1
[  210.974194] ena 0000:00:06.0: ENA Large LLQ is disabled
[  210.986343] ena 0000:00:06.0: Elastic Network Adapter (ENA) found at mem c0508000, mac addr 02:5f:bc:c2:be:7d
[  211.024305] ena 0000:00:06.0 ens6: renamed from eth0
[  211.357279] ena 0000:00:06.0 ens6: Local page cache is disabled for less than 16 channels
[  245.428479] vfio-pci 0000:00:06.0: Adding to iommu group 0
[  245.429780] vfio-pci 0000:00:06.0: Adding kernel taint for vfio-noiommu group on device

=== DPDK-RELATED PROCESSES ===
no DPDK processes running

=== END DIAGNOSTICS ===
⚠️ Crash Diagnostics

receiver-dmesg-crashes.log

[    0.074103] pid_max: default: 32768 minimum: 301
[    0.126390] iommu: Default domain type: Translated 
[    0.127162] NetLabel:  unlabeled traffic allowed by default
[    0.136200] PCI: CLS 0 bytes, default 64
[    0.205645] nvme nvme0: 2/0/0 default/read/poll queues
[    0.442953] systemd[1]: systemd 252.23-11.amzn2023 running in system mode (+PAM +AUDIT +SELINUX -APPARMOR +IMA +SMACK +SECCOMP -GCRYPT -GNUTLS +OPENSSL +ACL +BLKID +CURL +ELFUTILS +FIDO2 +IDN2 -IDN -IPTC +KMOD +LIBCRYPTSETUP +LIBFDISK +PCRE2 +PWQUALITY +P11KIT +QRENCODE +TPM2 -BZIP2 -LZ4 +XZ +ZLIB -ZSTD +BPF_FRAMEWORK +XKBCOMMON +UTMP +SYSVINIT default-hierarchy=unified)
[    0.443045] systemd[1]: No hostname configured, using default hostname.
[    0.538663] systemd[1]: Queued start job for default target initrd.target.
[    1.672192] systemd[1]: systemd 252.23-11.amzn2023 running in system mode (+PAM +AUDIT +SELINUX -APPARMOR +IMA +SMACK +SECCOMP -GCRYPT -GNUTLS +OPENSSL +ACL +BLKID +CURL +ELFUTILS +FIDO2 +IDN2 -IDN -IPTC +KMOD +LIBCRYPTSETUP +LIBFDISK +PCRE2 +PWQUALITY +P11KIT +QRENCODE +TPM2 -BZIP2 -LZ4 +XZ +ZLIB -ZSTD +BPF_FRAMEWORK +XKBCOMMON +UTMP +SYSVINIT default-hierarchy=unified)
[    9.433780] bridge: filtering via arp/ip/ip6tables is no longer available by default. Update your scripts to load br_netfilter if you need this.
[  292.026833] vfio-pci 0000:00:06.0: vfio-noiommu device opened by user (echo:7006)
[  540.136043] vfio-pci 0000:00:06.0: vfio-noiommu device opened by user (echo:11029)

sender-dmesg-crashes.log

[    0.073436] pid_max: default: 32768 minimum: 301
[    0.125659] iommu: Default domain type: Translated 
[    0.126404] NetLabel:  unlabeled traffic allowed by default
[    0.132970] PCI: CLS 0 bytes, default 64
[    0.215431] nvme nvme0: 2/0/0 default/read/poll queues
[    0.433213] systemd[1]: systemd 252.23-11.amzn2023 running in system mode (+PAM +AUDIT +SELINUX -APPARMOR +IMA +SMACK +SECCOMP -GCRYPT -GNUTLS +OPENSSL +ACL +BLKID +CURL +ELFUTILS +FIDO2 +IDN2 -IDN -IPTC +KMOD +LIBCRYPTSETUP +LIBFDISK +PCRE2 +PWQUALITY +P11KIT +QRENCODE +TPM2 -BZIP2 -LZ4 +XZ +ZLIB -ZSTD +BPF_FRAMEWORK +XKBCOMMON +UTMP +SYSVINIT default-hierarchy=unified)
[    0.433306] systemd[1]: No hostname configured, using default hostname.
[    0.528797] systemd[1]: Queued start job for default target initrd.target.
[    1.711388] systemd[1]: systemd 252.23-11.amzn2023 running in system mode (+PAM +AUDIT +SELINUX -APPARMOR +IMA +SMACK +SECCOMP -GCRYPT -GNUTLS +OPENSSL +ACL +BLKID +CURL +ELFUTILS +FIDO2 +IDN2 -IDN -IPTC +KMOD +LIBCRYPTSETUP +LIBFDISK +PCRE2 +PWQUALITY +P11KIT +QRENCODE +TPM2 -BZIP2 -LZ4 +XZ +ZLIB -ZSTD +BPF_FRAMEWORK +XKBCOMMON +UTMP +SYSVINIT default-hierarchy=unified)
[    9.584046] bridge: filtering via arp/ip/ip6tables is no longer available by default. Update your scripts to load br_netfilter if you need this.
[  917.843462] vfio-pci 0000:00:06.0: vfio-noiommu device opened by user (echo:16655)
Kernel Console (dmesg)

receiver-console-output.log (PCI/driver events only)

[  190.530365] pci 0000:00:06.0: enabling Extended Tags
[  190.532176] pci 0000:00:06.0: BAR 2: assigned [mem 0xc0600000-0xc06fffff pref]
[  190.533209] pci 0000:00:06.0: BAR 0: assigned [mem 0xc0508000-0xc050bfff]
[  190.534215] ena 0000:00:06.0: enabling device (0000 -> 0002)
[  190.547450] ena 0000:00:06.0: ENA device version: 0.10
[  190.548239] ena 0000:00:06.0: ENA controller version: 0.0.1 implementation version 1
[  190.644552] ena 0000:00:06.0: ENA Large LLQ is disabled
[  190.656638] ena 0000:00:06.0: Elastic Network Adapter (ENA) found at mem c0508000, mac addr 02:47:41:d2:f6:87
[  190.724526] ena 0000:00:06.0 ens6: renamed from eth0
[  191.071127] ena 0000:00:06.0 ens6: Local page cache is disabled for less than 16 channels
[  252.248491] vfio-pci 0000:00:06.0: Adding to iommu group 0
[  252.249829] vfio-pci 0000:00:06.0: Adding kernel taint for vfio-noiommu group on device
[  292.026833] vfio-pci 0000:00:06.0: vfio-noiommu device opened by user (echo:7006)
[  370.106204] vfio-pci 0000:00:06.0: Removing from iommu group 0
[  371.119629] ena 0000:00:06.0: ENA device version: 0.10
[  371.120414] ena 0000:00:06.0: ENA controller version: 0.0.1 implementation version 1
[  371.221641] ena 0000:00:06.0: ENA Large LLQ is disabled
[  371.234599] ena 0000:00:06.0: Elastic Network Adapter (ENA) found at mem c0508000, mac addr 02:47:41:d2:f6:87
[  371.274026] ena 0000:00:06.0 ens6: renamed from eth0
[  371.359308] ena 0000:00:06.0 ens6: Local page cache is disabled for less than 16 channels
[  391.347944] vfio-pci 0000:00:06.0: Adding to iommu group 0
[  391.349227] vfio-pci 0000:00:06.0: Adding kernel taint for vfio-noiommu group on device
[  540.136043] vfio-pci 0000:00:06.0: vfio-noiommu device opened by user (echo:11029)
[  618.076309] vfio-pci 0000:00:06.0: Removing from iommu group 0
[  619.089197] ena 0000:00:06.0: ENA device version: 0.10
[  619.090007] ena 0000:00:06.0: ENA controller version: 0.0.1 implementation version 1
[  619.183190] ena 0000:00:06.0: ENA Large LLQ is disabled
[  619.195286] ena 0000:00:06.0: Elastic Network Adapter (ENA) found at mem c0508000, mac addr 02:47:41:d2:f6:87
[  619.253236] ena 0000:00:06.0 ens6: renamed from eth0
[  619.295222] ena 0000:00:06.0 ens6: Local page cache is disabled for less than 16 channels

sender-console-output.log (PCI/driver events only)

[  210.861714] pci 0000:00:06.0: [1d0f:ec20] type 00 class 0x020000
[  210.862819] pci 0000:00:06.0: reg 0x10: [mem 0x00000000-0x00003fff]
[  210.863891] pci 0000:00:06.0: reg 0x18: [mem 0x00000000-0x000fffff pref]
[  210.865220] pci 0000:00:06.0: enabling Extended Tags
[  210.866996] pci 0000:00:06.0: BAR 2: assigned [mem 0xc0600000-0xc06fffff pref]
[  210.868032] pci 0000:00:06.0: BAR 0: assigned [mem 0xc0508000-0xc050bfff]
[  210.869030] ena 0000:00:06.0: enabling device (0000 -> 0002)
[  210.881630] ena 0000:00:06.0: ENA device version: 0.10
[  210.882417] ena 0000:00:06.0: ENA controller version: 0.0.1 implementation version 1
[  210.974194] ena 0000:00:06.0: ENA Large LLQ is disabled
[  210.986343] ena 0000:00:06.0: Elastic Network Adapter (ENA) found at mem c0508000, mac addr 02:5f:bc:c2:be:7d
[  211.024305] ena 0000:00:06.0 ens6: renamed from eth0
[  211.357279] ena 0000:00:06.0 ens6: Local page cache is disabled for less than 16 channels
[  245.428479] vfio-pci 0000:00:06.0: Adding to iommu group 0
[  245.429780] vfio-pci 0000:00:06.0: Adding kernel taint for vfio-noiommu group on device
[  309.756224] vfio-pci 0000:00:06.0: vfio-noiommu device opened by user (tokio-rt-worker:6401)
[  310.506035] vfio-pci 0000:00:06.0: vfio-noiommu device opened by user (tokio-rt-worker:6423)
[  312.266121] vfio-pci 0000:00:06.0: vfio-noiommu device opened by user (tokio-rt-worker:6447)
[  313.826101] vfio-pci 0000:00:06.0: vfio-noiommu device opened by user (tokio-rt-worker:6472)
[  359.943360] vfio-pci 0000:00:06.0: Removing from iommu group 0
[  360.953517] ena 0000:00:06.0: ENA device version: 0.10
[  360.954315] ena 0000:00:06.0: ENA controller version: 0.0.1 implementation version 1
[  361.053541] ena 0000:00:06.0: ENA Large LLQ is disabled
[  361.065364] ena 0000:00:06.0: Elastic Network Adapter (ENA) found at mem c0508000, mac addr 02:5f:bc:c2:be:7d
[  361.123555] ena 0000:00:06.0 ens6: renamed from eth0
[  361.175458] ena 0000:00:06.0 ens6: Local page cache is disabled for less than 16 channels
[  639.518449] vfio-pci 0000:00:06.0: Adding to iommu group 0
[  639.519772] vfio-pci 0000:00:06.0: Adding kernel taint for vfio-noiommu group on device
[  870.993683] vfio-pci 0000:00:06.0: vfio-noiommu device opened by user (tokio-rt-worker:15857)
[  917.843462] vfio-pci 0000:00:06.0: vfio-noiommu device opened by user (echo:16655)

@github-actions

Copy link
Copy Markdown

[Perf] Benchmark Diag: plain-rust result

SSM exit: 0

Output (last 30 lines)
=== TRex Benchmark: plain-rust ===
Server: localhost, Port: 0
Src: 10.0.1.219 -> Dst: 10.0.1.168 (MAC: 02:61:87:20:13:ad)
Packet sizes: [64, 512, 1400]
Rate steps (target PPS): [70000, 140000, 350000, 700000]
Duration per step: 30s
Source MAC: 02:b7:d5:18:17:45

--- Packet size: 64B ---
  Target: 70,000 pps ... TX: 70,000 pps, RX: 69,000 pps, Drop: 1.4286%, Lat avg: 384.0 us
  Target: 140,000 pps ... TX: 140,000 pps, RX: 138,990 pps, Drop: 0.7212%, Lat avg: 369.0 us
  Target: 350,000 pps ... TX: 350,000 pps, RX: 332,193 pps, Drop: 5.0877%, Lat avg: 668.0 us
  Target: 700,000 pps ... TX: 700,000 pps, RX: 322,406 pps, Drop: 53.942%, Lat avg: 0.0 us

--- Packet size: 512B ---
  Target: 70,000 pps ... TX: 70,000 pps, RX: 69,000 pps, Drop: 1.4286%, Lat avg: 0.0 us
  Target: 140,000 pps ... TX: 140,000 pps, RX: 138,989 pps, Drop: 0.7219%, Lat avg: 0.0 us
  Target: 350,000 pps ... TX: 350,000 pps, RX: 302,040 pps, Drop: 13.703%, Lat avg: 0.0 us
  Target: 700,000 pps ... TX: 700,000 pps, RX: 297,280 pps, Drop: 57.5314%, Lat avg: 0.0 us

--- Packet size: 1400B ---
  Target: 70,000 pps ... TX: 70,000 pps, RX: 69,000 pps, Drop: 1.4286%, Lat avg: 0.0 us
  Target: 140,000 pps ... TX: 140,000 pps, RX: 138,964 pps, Drop: 0.7402%, Lat avg: 381.0 us
  Target: 350,000 pps ... TX: 350,000 pps, RX: 256,817 pps, Drop: 26.6237%, Lat avg: 487.0 us
  Target: 700,000 pps ... TX: 700,000 pps, RX: 285,432 pps, Drop: 59.2241%, Lat avg: 0.0 us

Results written to /tmp/perf-results/plain-rust.json
EXIT_CODE=0

@github-actions

Copy link
Copy Markdown

[Perf] Stage: Benchmark (3/5)

Running rust-dpdk benchmark...
Packet sizes: 64,512,1400 | Duration: 30s/step | Target PPS: 70000,140000,350000,700000

@github-actions

Copy link
Copy Markdown

[Perf] Benchmark Diag: rust-dpdk preflight

TRex API OK: 2 ports
  Port 0: 02:b7:d5:18:17:45
  Port 1: 02:d8:de:56:a1:8d
PREFLIGHT_OK

@github-actions

Copy link
Copy Markdown

[Perf] Benchmark Diag: rust-dpdk result

SSM exit: 0

Output (last 30 lines)
=== TRex Benchmark: rust-dpdk ===
Server: localhost, Port: 0
Src: 10.0.1.219 -> Dst: 10.0.1.168 (MAC: 02:61:87:20:13:ad)
Packet sizes: [64, 512, 1400]
Rate steps (target PPS): [70000, 140000, 350000, 700000]
Duration per step: 30s
Source MAC: 02:b7:d5:18:17:45

--- Packet size: 64B ---
  Target: 70,000 pps ... TX: 70,000 pps, RX: 70,000 pps, Drop: 0.0%, Lat avg: 245.0 us
  Target: 140,000 pps ... TX: 140,000 pps, RX: 140,000 pps, Drop: 0.0%, Lat avg: 263.0 us
  Target: 350,000 pps ... TX: 350,000 pps, RX: 350,000 pps, Drop: 0.0%, Lat avg: 278.0 us
  Target: 700,000 pps ... TX: 700,000 pps, RX: 595,009 pps, Drop: 14.9988%, Lat avg: 980.0 us

--- Packet size: 512B ---
  Target: 70,000 pps ... TX: 70,000 pps, RX: 70,000 pps, Drop: 0.0%, Lat avg: 258.0 us
  Target: 140,000 pps ... TX: 140,000 pps, RX: 140,000 pps, Drop: 0.0%, Lat avg: 263.0 us
  Target: 350,000 pps ... TX: 350,000 pps, RX: 349,994 pps, Drop: 0.0016%, Lat avg: 301.0 us
  Target: 700,000 pps ... TX: 700,000 pps, RX: 583,424 pps, Drop: 16.6538%, Lat avg: 970.0 us

--- Packet size: 1400B ---
  Target: 70,000 pps ... TX: 70,000 pps, RX: 70,000 pps, Drop: 0.0%, Lat avg: 274.0 us
  Target: 140,000 pps ... TX: 140,000 pps, RX: 140,000 pps, Drop: 0.0%, Lat avg: 268.0 us
  Target: 350,000 pps ... TX: 350,000 pps, RX: 349,995 pps, Drop: 0.0014%, Lat avg: 300.0 us
  Target: 700,000 pps ... TX: 700,000 pps, RX: 447,067 pps, Drop: 36.1333%, Lat avg: 4377.0 us

Results written to /tmp/perf-results/rust-dpdk.json
EXIT_CODE=0

@github-actions

Copy link
Copy Markdown

[Perf] Stage: Benchmark (4/5)

Running rust-dpdk-multicore benchmark...
Packet sizes: 64,512,1400 | Duration: 30s/step | Target PPS: 70000,140000,350000,700000

@github-actions

Copy link
Copy Markdown

[Perf] Benchmark Diag: rust-dpdk-multicore preflight

TRex API OK: 2 ports
  Port 0: 02:b7:d5:18:17:45
  Port 1: 02:d8:de:56:a1:8d
PREFLIGHT_OK

@github-actions

Copy link
Copy Markdown

[Perf] Benchmark Diag: rust-dpdk-multicore result

SSM exit: 0

Output (last 30 lines)
=== TRex Benchmark: rust-dpdk-multicore ===
Server: localhost, Port: 0
Src: 10.0.1.219 -> Dst: 10.0.1.168 (MAC: 02:61:87:20:13:ad)
Packet sizes: [64, 512, 1400]
Rate steps (target PPS): [70000, 140000, 350000, 700000]
Duration per step: 30s
Source MAC: 02:b7:d5:18:17:45

--- Packet size: 64B ---
  Target: 70,000 pps ... TX: 70,000 pps, RX: 69,997 pps, Drop: 0.0038%, Lat avg: 268.0 us
  Target: 140,000 pps ... TX: 140,000 pps, RX: 140,000 pps, Drop: 0.0%, Lat avg: 307.0 us
  Target: 350,000 pps ... TX: 350,000 pps, RX: 347,812 pps, Drop: 0.6251%, Lat avg: 54258.0 us
  Target: 700,000 pps ... TX: 700,000 pps, RX: 311,599 pps, Drop: 55.4859%, Lat avg: 52942.0 us

--- Packet size: 512B ---
  Target: 70,000 pps ... TX: 70,000 pps, RX: 70,000 pps, Drop: 0.0%, Lat avg: 287.0 us
  Target: 140,000 pps ... TX: 140,000 pps, RX: 140,000 pps, Drop: 0.0%, Lat avg: 274.0 us
  Target: 350,000 pps ... TX: 350,000 pps, RX: 245,459 pps, Drop: 29.8687%, Lat avg: 53273.0 us
  Target: 700,000 pps ... TX: 700,000 pps, RX: 229,423 pps, Drop: 67.2253%, Lat avg: 50636.0 us

--- Packet size: 1400B ---
  Target: 70,000 pps ... TX: 70,000 pps, RX: 70,000 pps, Drop: 0.0%, Lat avg: 297.0 us
  Target: 140,000 pps ... TX: 140,000 pps, RX: 140,000 pps, Drop: 0.0%, Lat avg: 300.0 us
  Target: 350,000 pps ... TX: 350,000 pps, RX: 180,571 pps, Drop: 48.4083%, Lat avg: 65360.0 us
  Target: 700,000 pps ... TX: 700,000 pps, RX: 157,085 pps, Drop: 77.5592%, Lat avg: 62682.0 us

Results written to /tmp/perf-results/rust-dpdk-multicore.json
EXIT_CODE=0

@github-actions

Copy link
Copy Markdown

[Perf] Stage: Benchmark (5/5)

Running native-dpdk benchmark...
Packet sizes: 64,512,1400 | Duration: 30s/step | Target PPS: 70000,140000,350000,700000

@github-actions

Copy link
Copy Markdown

[Perf] Benchmark Diag: native-dpdk preflight

TRex API OK: 2 ports
  Port 0: 02:b7:d5:18:17:45
  Port 1: 02:d8:de:56:a1:8d
PREFLIGHT_OK

@github-actions

Copy link
Copy Markdown

[Perf] Benchmark Diag: native-dpdk result

SSM exit: 0

Output (last 30 lines)
=== TRex Benchmark: native-dpdk ===
Server: localhost, Port: 0
Src: 10.0.1.219 -> Dst: 10.0.1.168 (MAC: 02:61:87:20:13:ad)
Packet sizes: [64, 512, 1400]
Rate steps (target PPS): [70000, 140000, 350000, 700000]
Duration per step: 30s
Source MAC: 02:b7:d5:18:17:45

--- Packet size: 64B ---
  Target: 70,000 pps ... TX: 70,000 pps, RX: 70,000 pps, Drop: 0.0%, Lat avg: 141.0 us
  Target: 140,000 pps ... TX: 140,000 pps, RX: 140,000 pps, Drop: 0.0%, Lat avg: 176.0 us
  Target: 350,000 pps ... TX: 350,000 pps, RX: 350,000 pps, Drop: 0.0%, Lat avg: 131.0 us
  Target: 700,000 pps ... TX: 700,000 pps, RX: 588,695 pps, Drop: 15.9007%, Lat avg: 788.0 us

--- Packet size: 512B ---
  Target: 70,000 pps ... TX: 70,000 pps, RX: 70,000 pps, Drop: 0.0%, Lat avg: 150.0 us
  Target: 140,000 pps ... TX: 140,000 pps, RX: 140,000 pps, Drop: 0.0%, Lat avg: 178.0 us
  Target: 350,000 pps ... TX: 350,000 pps, RX: 350,000 pps, Drop: 0.0%, Lat avg: 198.0 us
  Target: 700,000 pps ... TX: 700,000 pps, RX: 594,212 pps, Drop: 15.1125%, Lat avg: 782.0 us

--- Packet size: 1400B ---
  Target: 70,000 pps ... TX: 70,000 pps, RX: 70,000 pps, Drop: 0.0%, Lat avg: 121.0 us
  Target: 140,000 pps ... TX: 140,000 pps, RX: 140,000 pps, Drop: 0.0%, Lat avg: 188.0 us
  Target: 350,000 pps ... TX: 350,000 pps, RX: 350,000 pps, Drop: 0.0%, Lat avg: 165.0 us
  Target: 700,000 pps ... TX: 700,000 pps, RX: 447,792 pps, Drop: 36.0297%, Lat avg: 3902.0 us

Results written to /tmp/perf-results/native-dpdk.json
EXIT_CODE=0

@github-actions

Copy link
Copy Markdown

[Perf] Diag: testpmd log

testpmd output (last 30 lines)
=== testpmd stats (last 30 lines) ===
  TX-packets: 95132002   TX-errors: 0          TX-bytes:  56016274322

  Throughput (since last show)
  Rx-pps:       447725          Rx-bps:   5000201128
  Tx-pps:       447725          Tx-bps:   5000194424
  ############################################################################
�[2J�[1;1H
Port statistics ====================================
  ######################## NIC statistics for port 0  ########################
  RX-packets: 99380307   RX-missed: 0          RX-bytes:  61894280782
  RX-errors: 318287
  RX-nombuf:  0         
  TX-packets: 99321042   TX-errors: 0          TX-bytes:  61864174162

  Throughput (since last show)
  Rx-pps:       418874          Rx-bps:   4677988736
  Tx-pps:       418874          Tx-bps:   4677995432
  ############################################################################
�[2J�[1;1H
Port statistics ====================================
  ######################## NIC statistics for port 0  ########################
  RX-packets: 99380307   RX-missed: 0          RX-bytes:  61894280782
  RX-errors: 318287
  RX-nombuf:  0         
  TX-packets: 99321042   TX-errors: 0          TX-bytes:  61864174162

  Throughput (since last show)
  Rx-pps:            0          Rx-bps:            0
  Tx-pps:            0          Tx-bps:            0
  ############################################################################
=== ENA port stats ===
N/A (vfio-pci)

@github-actions

Copy link
Copy Markdown

[Perf] Stage: Results

[02:47:41] INFO Generating markdown summary...

Performance Test Results — c5n.2xlarge

Commit: 83c7d849
Timestamp: 2026-03-14T02:47:41.060697+00:00

1400B packets

Config Target PPS TX pps RX pps Drop % Lat Avg (us) Lat Max (us) TX Mbps RX Mbps
native-dpdk 70,000 70,000 70,000 0.00% 121.0 486.0 784.0 784.0
native-dpdk 140,000 140,000 140,000 0.00% 188.0 427.0 1568.0 1568.0
native-dpdk 350,000 350,000 350,000 0.00% 165.0 587.0 3920.0 3920.0
native-dpdk 700,000 700,000 447,792 36.03% 3902.0 4374.0 7840.0 5015.3
rust-dpdk 70,000 70,000 70,000 0.00% 274.0 2620.0 784.0 784.0
rust-dpdk 140,000 140,000 140,000 0.00% 268.0 2673.0 1568.0 1568.0
rust-dpdk 350,000 350,000 349,995 0.00% 300.0 3166.0 3920.0 3919.9
rust-dpdk 700,000 700,000 447,067 36.13% 4377.0 5886.0 7840.0 5007.1
rust-dpdk-multicore 70,000 70,000 70,000 0.00% 297.0 2525.0 784.0 784.0
rust-dpdk-multicore 140,000 140,000 140,000 0.00% 300.0 4410.0 1568.0 1568.0
rust-dpdk-multicore 350,000 350,000 180,571 48.41% 65360.0 294228.0 3920.0 2022.4
rust-dpdk-multicore 700,000 700,000 157,085 77.56% 62682.0 250193.0 7840.0 1759.4
rust-stdlib 70,000 70,000 68,974 1.47% 0.0 0.0 784.0 772.5
rust-stdlib 140,000 140,000 138,722 0.91% 440.0 0.0 1568.0 1553.7
rust-stdlib 350,000 350,000 167,655 52.10% 0.0 0.0 3920.0 1877.7
rust-stdlib 700,000 700,000 133,628 80.91% 0.0 0.0 7840.0 1496.6
plain-rust 70,000 70,000 69,000 1.43% 0.0 0.0 784.0 772.8
plain-rust 140,000 140,000 138,964 0.74% 381.0 0.0 1568.0 1556.4
plain-rust 350,000 350,000 256,817 26.62% 487.0 0.0 3920.0 2876.3
plain-rust 700,000 700,000 285,432 59.22% 0.0 0.0 7840.0 3196.8

512B packets

Config Target PPS TX pps RX pps Drop % Lat Avg (us) Lat Max (us) TX Mbps RX Mbps
native-dpdk 70,000 70,000 70,000 0.00% 150.0 405.0 286.7 286.7
native-dpdk 140,000 140,000 140,000 0.00% 178.0 526.0 573.4 573.4
native-dpdk 350,000 350,000 350,000 0.00% 198.0 976.0 1433.6 1433.6
native-dpdk 700,000 700,000 594,212 15.11% 782.0 3746.0 2867.2 2433.9
rust-dpdk 70,000 70,000 70,000 0.00% 258.0 2925.0 286.7 286.7
rust-dpdk 140,000 140,000 140,000 0.00% 263.0 2540.0 573.4 573.4
rust-dpdk 350,000 350,000 349,994 0.00% 301.0 2934.0 1433.6 1433.6
rust-dpdk 700,000 700,000 583,424 16.65% 970.0 3940.0 2867.2 2389.7
rust-dpdk-multicore 70,000 70,000 70,000 0.00% 287.0 2905.0 286.7 286.7
rust-dpdk-multicore 140,000 140,000 140,000 0.00% 274.0 1926.0 573.4 573.4
rust-dpdk-multicore 350,000 350,000 245,459 29.87% 53273.0 164446.0 1433.6 1005.4
rust-dpdk-multicore 700,000 700,000 229,423 67.23% 50636.0 179755.0 2867.2 939.7
rust-stdlib 70,000 70,000 68,998 1.43% 0.0 0.0 286.7 282.6
rust-stdlib 140,000 140,000 138,289 1.22% 573.0 0.0 573.4 566.4
rust-stdlib 350,000 350,000 174,162 50.24% 0.0 0.0 1433.6 713.4
rust-stdlib 700,000 700,000 77,405 88.94% 0.0 0.0 2867.2 317.1
plain-rust 70,000 70,000 69,000 1.43% 0.0 0.0 286.7 282.6
plain-rust 140,000 140,000 138,989 0.72% 0.0 0.0 573.4 569.3
plain-rust 350,000 350,000 302,040 13.70% 0.0 0.0 1433.6 1237.2
plain-rust 700,000 700,000 297,280 57.53% 0.0 0.0 2867.2 1217.7

64B packets

Config Target PPS TX pps RX pps Drop % Lat Avg (us) Lat Max (us) TX Mbps RX Mbps
native-dpdk 70,000 70,000 70,000 0.00% 141.0 407.0 35.8 35.8
native-dpdk 140,000 140,000 140,000 0.00% 176.0 414.0 71.7 71.7
native-dpdk 350,000 350,000 350,000 0.00% 131.0 410.0 179.2 179.2
native-dpdk 700,000 700,000 588,695 15.90% 788.0 2025.0 358.4 301.4
rust-dpdk 70,000 70,000 70,000 0.00% 245.0 2262.0 35.8 35.8
rust-dpdk 140,000 140,000 140,000 0.00% 263.0 2570.0 71.7 71.7
rust-dpdk 350,000 350,000 350,000 0.00% 278.0 2455.0 179.2 179.2
rust-dpdk 700,000 700,000 595,009 15.00% 980.0 2813.0 358.4 304.6
rust-dpdk-multicore 70,000 70,000 69,997 0.00% 268.0 13927.0 35.8 35.8
rust-dpdk-multicore 140,000 140,000 140,000 0.00% 307.0 2668.0 71.7 71.7
rust-dpdk-multicore 350,000 350,000 347,812 0.63% 54258.0 118302.0 179.2 178.1
rust-dpdk-multicore 700,000 700,000 311,599 55.49% 52942.0 128651.0 358.4 159.5
rust-stdlib 70,000 70,000 68,996 1.43% 579.0 0.0 35.8 35.3
rust-stdlib 140,000 140,000 138,981 0.73% 526.0 0.0 71.7 71.2
rust-stdlib 350,000 350,000 192,646 44.96% 0.0 0.0 179.2 98.6
rust-stdlib 700,000 700,000 84,153 87.98% 0.0 0.0 358.4 43.1
plain-rust 70,000 70,000 69,000 1.43% 384.0 0.0 35.8 35.3
plain-rust 140,000 140,000 138,990 0.72% 369.0 0.0 71.7 71.2
plain-rust 350,000 350,000 332,193 5.09% 668.0 0.0 179.2 170.1
plain-rust 700,000 700,000 322,406 53.94% 0.0 0.0 358.4 165.1

Full results artifact

@gspivey
gspivey merged commit 782e320 into main Mar 14, 2026
6 checks passed
@gspivey
gspivey deleted the claude/performance-optimization-phase-3-CHQub branch March 17, 2026 03:25
gspivey pushed a commit that referenced this pull request May 21, 2026
…dmap

Performance test results from GH Actions run 26204734648 show no
regression from the IPv6 outer encap feature:
- rust-dpdk 64B/700K: 699,000 RX (0.1% drop) — identical to Run #18
- rust-dpdk 512B/700K: 699,000 RX (0.1% drop) — identical to Run #18
- NIC instrumentation self-check: OK (zero drift)

README roadmap updated to move 'Encap: IPv6 outer' from Planned to Done.
gspivey pushed a commit that referenced this pull request May 21, 2026
Append performance test results from GH Actions run 26227356354
(Graviton, TRex). No regressions detected — IPv6 fallback path adds
zero overhead to IPv4 traffic.

Mark IPv6 sub-task #2 (UDP over IPv6 checksum) as complete in the
README roadmap.
gspivey pushed a commit that referenced this pull request May 29, 2026
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.
gspivey added a commit that referenced this pull request Jun 16, 2026
## Roadmap Item

`ROADMAP.md` item #25: `dpdk-stdlib-tcp`: Engine — on_command  
Spec: `.kiro/specs/tcp-support/` · tasks 5.18, 5.19

## Changes

Implements `TcpEngine::on_command` for the remaining three command
variants:

### Shutdown (task 5.19)
- **Shutdown::Write / Both**: Flush-before-FIN semantics — drains
tx_ring into send_buf immediately, sets `fin_pending` flag. The
`on_tick` TX drain path transmits all remaining data then emits FIN once
send_buf is empty.
- **Shutdown::Read**: Sets EOF on ConnectionHandle so app-side reads
return 0. No FIN sent.
- State transitions: Established → FinWait1, CloseWait → LastAck.

### Close (task 5.19)
- **linger = None or linger > 0**: Graceful FIN (same as
Shutdown::Write). App-side blocking handled via condvar.
- **linger = Some(Duration::ZERO)**: Send RST immediately, discard all
unsent data, remove TCB, latch ConnectionAborted.

### SetOption (task 5.19)
- Nodelay, Keepalive (enable/disable clears timer), Linger (updates both
TCB and handle), RecvBufSize, SendBufSize, ReuseAddr, Ttl.
- ReadTimeout/WriteTimeout/Nonblocking are app-side only (no engine
action needed).

### Infrastructure
- `send_fin()` helper: builds FIN+ACK frame, advances snd_nxt,
transitions state, arms RTO.
- `fin_pending` handling in `on_tick`: after TX drain completes with no
unsent data remaining, emit FIN via `send_fin()`.

## Tests Added

28 new unit tests covering:
- Shutdown with empty/pending send_buf, Read/Write/Both variants
- FIN sequence number consumption and RTO arming
- Close with default/non-zero/zero linger
- RST on linger=0 discards pending data
- SetOption for all engine-relevant variants
- Flush-before-FIN integration (data segment + FIN in correct order)
- Edge cases: nonexistent key, shutdown in SYN_SENT

## Test Results

All 192 dpdk-stdlib-tcp tests pass. Full workspace builds and all tests
pass.

---------

Co-authored-by: Agent Router <agent@agent-router.dev>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants