Skip to content

simplify topology: single rx_queues knob replaces rx_queues × workers_per_queue - #26

Merged
gspivey merged 1 commit into
mainfrom
claude/simplify-rss-queue-U5Yrs
Mar 25, 2026
Merged

gspivey merged 1 commit into
mainfrom
claude/simplify-rss-queue-U5Yrs

Conversation

@gspivey

@gspivey gspivey commented Mar 25, 2026

Copy link
Copy Markdown
Owner

Summary

  • Remove workers_per_queue from TopologyConfig, TopologyPlan, builder API, env vars, and CLI
  • rx_queues is now the single knob: each RSS queue gets exactly 1 processing thread
  • RTC preserved: when rx_queues <= 1 (or under stubs), no pipeline threads are spawned
  • Simplified auto-detection: rx_queues = min(lcores - 1, nic_max), RTC when ≤ 1 available
vCPUs Old (rx_q × workers) New (rx_queues) Threads
2 1×0 (RTC) 1 (RTC) 0
4 1×2 3 3
8 7×1 7 7
16 7×1 15 15

Net: -246 lines added, +139 lines (107 lines deleted). All 212 tests pass.

Test plan

  • cargo build — clean compile
  • cargo test — all 212 tests pass (148 dpdk-udp, 51 dpdk, 8 dpdk-tokio, 3 dpdk-sys, 2 signal)
  • Integration tests on real DPDK instance (if networking code touched)

https://claude.ai/code/session_01AX8ikLeQqd8DpPXdjAg97d

…e knob

The topology previously had two dimensions: rx_queues × workers_per_queue.
This collapses it to one: rx_queues. Each RSS queue gets exactly 1
processing thread. When rx_queues <= 1, the socket runs in
run-to-completion mode (no pipeline threads).

Auto-detection: available = lcores - 1 (reserve app thread).
If available <= 1 → RTC. Otherwise rx_queues = min(available, nic_max).

Changes:
- Remove workers_per_queue from TopologyConfig, TopologyPlan, builder API
- Remove DPDK_WORKERS_PER_QUEUE env var support
- Remove auto_detect_workers() helper
- Simplify auto_detect_queues(): direct mapping of available lcores
- Pipeline threads = rx_queues total (1 RX dispatcher + rx_queues-1 workers)
- Remove --workers CLI arg from echo app
- Update all tests and documentation

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

Copy link
Copy Markdown

[CI] Stage: Deploy

Infrastructure ready.

  • Sender: i-023a7e54751947ad6 (DPDK ENI: 10.0.1.240)
  • Receiver: i-0ef5d7f443f8f7cfd (DPDK ENI: 10.0.1.76)
  • Both instances SSM-ready.

@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 23520693963)

Branch: 26/merge | Commit: 234dd55c

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.76: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.76:9000 (MAC: 02:45:18:a9:b6:d5)
Using DPDK acceleration (run-to-completion)
✅ Socket created successfully!
📡 Local address: 10.0.1.76:9000
🔄 Echo server running... (Ctrl+C to stop)
Shutting down gracefully...

sender-echo-server.log

🚀 DPDK-STDLIB Echo Server
Binding to 10.0.1.240: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.240:9000 (MAC: 02:dc:d2:cc:f0:47)
Using DPDK acceleration (run-to-completion)
✅ Socket created successfully!
📡 Local address: 10.0.1.240: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.76:9000: 'arp-probe #1'
Test complete
[2026-03-25T01:55:17Z] INFO: ARP resolution succeeded (got response from peer)
[2026-03-25T01:55:17Z] INFO: Test: udp_send_receive
[2026-03-25T01:55:18Z] INFO: UDP send/receive succeeded
[2026-03-25T01:55:18Z] INFO: Test: echo_roundtrip
[2026-03-25T01:55:19Z] INFO: Echo roundtrip succeeded: 5/5 responses received
[2026-03-25T01:55:19Z] INFO: Test: payload_integrity
[2026-03-25T01:55:19Z] INFO: Response received, checking payload match...
[2026-03-25T01:55:19Z] INFO: Payload integrity verified (found in response)
[2026-03-25T01:55:19Z] INFO: JUnit XML written to: /tmp/test-results/tier2-kernel-interop.xml
[2026-03-25T01:55:19Z] INFO: Tier 2 sender tests complete. Results: /tmp/test-results/tier2-kernel-interop.xml

receiver-test-client-iperf.log

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

sender-test-client-iperf.log

Received 30 bytes from 10.0.1.76:9000: 'dpdk-to-kernel-test-payload #3'
Sent 30 bytes: 'dpdk-to-kernel-test-payload #4'
Received 30 bytes from 10.0.1.76:9000: 'dpdk-to-kernel-test-payload #4'
Sent 30 bytes: 'dpdk-to-kernel-test-payload #5'
Received 30 bytes from 10.0.1.76:9000: 'dpdk-to-kernel-test-payload #5'
Sent 30 bytes: 'dpdk-to-kernel-test-payload #6'
Received 30 bytes from 10.0.1.76:9000: 'dpdk-to-kernel-test-payload #6'
Sent 30 bytes: 'dpdk-to-kernel-test-payload #7'
Received 30 bytes from 10.0.1.76:9000: 'dpdk-to-kernel-test-payload #7'
Sent 30 bytes: 'dpdk-to-kernel-test-payload #8'
Received 30 bytes from 10.0.1.76:9000: 'dpdk-to-kernel-test-payload #8'
Sent 30 bytes: 'dpdk-to-kernel-test-payload #9'
Received 30 bytes from 10.0.1.76:9000: 'dpdk-to-kernel-test-payload #9'
Sent 31 bytes: 'dpdk-to-kernel-test-payload #10'
Received 31 bytes from 10.0.1.76:9000: 'dpdk-to-kernel-test-payload #10'
Test complete
[2026-03-25T02:01:28Z] INFO: our-app-sends: sent 10 packets, received 10 responses
[2026-03-25T02:01:28Z] INFO: our-app-sends: PASS (sent >= 5 packets)
[2026-03-25T02:01:28Z] INFO: JUnit XML written to: /tmp/test-results/tier3-our-app-sends.xml
[2026-03-25T02:01:28Z] 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.76: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.76:9000 (MAC: 02:45:18:a9:b6:d5)
Using DPDK acceleration (run-to-completion)
✅ Socket created successfully!
📡 Local address: 10.0.1.76:9000
🔄 Echo server running... (Ctrl+C to stop)
Shutting down gracefully...

sender-echo-server.log

🚀 DPDK-STDLIB Echo Server
Binding to 10.0.1.240: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.240:9000 (MAC: 02:dc:d2:cc:f0:47)
Using DPDK acceleration (run-to-completion)
✅ Socket created successfully!
📡 Local address: 10.0.1.240:9000
🔄 Echo server running... (Ctrl+C to stop)
Shutting down gracefully...

sender-test-client.log

[2026-03-25T01:48:01Z] INFO: Test: arp_resolution
UDP Test Client
Target: 10.0.1.76:9000
Bind address: 10.0.1.240: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.240:32768 (MAC: 02:dc:d2:cc:f0:47)
Backend: dpdk
Sending packets...
Sent 12 bytes: 'arp-probe #1'
Received 12 bytes from 10.0.1.76:9000: 'arp-probe #1'
Test complete
[2026-03-25T01:48:03Z] INFO: ARP resolution succeeded (got response from peer)
[2026-03-25T01:48:03Z] INFO: Test: udp_send_receive
[2026-03-25T01:48:05Z] INFO: UDP send/receive succeeded
[2026-03-25T01:48:05Z] INFO: Test: echo_roundtrip
[2026-03-25T01:48:06Z] INFO: Echo roundtrip succeeded: 5/5 responses received
[2026-03-25T01:48:06Z] INFO: Test: payload_integrity
[2026-03-25T01:48:07Z] INFO: Response received, checking payload match...
[2026-03-25T01:48:07Z] INFO: Payload integrity verified (found in response)
[2026-03-25T01:48:07Z] INFO: JUnit XML written to: /tmp/test-results/tier1-dpdk-echo.xml
[2026-03-25T01:48:07Z] INFO: Tier 1 sender tests complete. Results: /tmp/test-results/tier1-dpdk-echo.xml
[2026-03-25T01:55:17Z] INFO: Test: arp_resolution
UDP Test Client
Target: 10.0.1.76: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.76:9000: 'arp-probe #1'
Test complete
[2026-03-25T01:55:17Z] INFO: ARP resolution succeeded (got response from peer)
[2026-03-25T01:55:17Z] INFO: Test: udp_send_receive
[2026-03-25T01:55:18Z] INFO: UDP send/receive succeeded
[2026-03-25T01:55:18Z] INFO: Test: echo_roundtrip
[2026-03-25T01:55:19Z] INFO: Echo roundtrip succeeded: 5/5 responses received
[2026-03-25T01:55:19Z] INFO: Test: payload_integrity
[2026-03-25T01:55:19Z] INFO: Response received, checking payload match...
[2026-03-25T01:55:19Z] INFO: Payload integrity verified (found in response)
[2026-03-25T01:55:19Z] INFO: JUnit XML written to: /tmp/test-results/tier2-kernel-interop.xml
[2026-03-25T01:55:19Z] INFO: Tier 2 sender tests complete. Results: /tmp/test-results/tier2-kernel-interop.xml

receiver-test-client-iperf.log

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

sender-test-client-iperf.log

[2026-03-25T02:01:25Z] INFO: Pre-flight: checking DPDK state and ARP cache...
[2026-03-25T02:01:25Z] INFO: Local IP: 10.0.1.240, Peer IP: 10.0.1.76, Port: 9000
[2026-03-25T02:01:25Z] INFO: /proc/net/arp contents:
IP address       HW type     Flags       HW address            Mask     Device
10.0.1.156       0x1         0x2         02:c3:0a:21:48:cb     *        ens5
10.0.1.1         0x1         0x2         02:94:0b:16:ad:e7     *        ens5
10.0.1.240       0x1         0x2         02:dc:d2:cc:f0:47     *        ens5
10.0.1.76        0x1         0x2         02:45:18:a9:b6:d5     *        ens5
[2026-03-25T02:01:25Z] INFO: DPDK runtime state:
No /var/run/dpdk/ directory
[2026-03-25T02:01:25Z] INFO: vfio-pci bindings:
0000:00:06.0
bind
module
new_id
remove_id
uevent
unbind
[2026-03-25T02:01:25Z] INFO: Test binary: /opt/dpdk-stdlib/target/release/test-client
-rwxr-xr-x. 2 root root 1858056 Mar 25 01:45 /opt/dpdk-stdlib/target/release/test-client
[2026-03-25T02:01:25Z] INFO: Launching test-client: /opt/dpdk-stdlib/target/release/test-client --target 10.0.1.76 --port 9000 --bind-ip 10.0.1.240 --count 10 --delay 200
[2026-03-25T02:01:28Z] INFO: Test client output: UDP Test Client
Target: 10.0.1.76:9000
Bind address: 10.0.1.240: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.240:32768 (MAC: 02:dc:d2:cc:f0:47)
Backend: dpdk
Sending packets...
Sent 30 bytes: 'dpdk-to-kernel-test-payload #1'
Received 30 bytes from 10.0.1.76:9000: 'dpdk-to-kernel-test-payload #1'
Sent 30 bytes: 'dpdk-to-kernel-test-payload #2'
Received 30 bytes from 10.0.1.76:9000: 'dpdk-to-kernel-test-payload #2'
Sent 30 bytes: 'dpdk-to-kernel-test-payload #3'
Received 30 bytes from 10.0.1.76:9000: 'dpdk-to-kernel-test-payload #3'
Sent 30 bytes: 'dpdk-to-kernel-test-payload #4'
Received 30 bytes from 10.0.1.76:9000: 'dpdk-to-kernel-test-payload #4'
Sent 30 bytes: 'dpdk-to-kernel-test-payload #5'
Received 30 bytes from 10.0.1.76:9000: 'dpdk-to-kernel-test-payload #5'
Sent 30 bytes: 'dpdk-to-kernel-test-payload #6'
Received 30 bytes from 10.0.1.76:9000: 'dpdk-to-kernel-test-payload #6'
Sent 30 bytes: 'dpdk-to-kernel-test-payload #7'
Received 30 bytes from 10.0.1.76:9000: 'dpdk-to-kernel-test-payload #7'
Sent 30 bytes: 'dpdk-to-kernel-test-payload #8'
Received 30 bytes from 10.0.1.76:9000: 'dpdk-to-kernel-test-payload #8'
Sent 30 bytes: 'dpdk-to-kernel-test-payload #9'
Received 30 bytes from 10.0.1.76:9000: 'dpdk-to-kernel-test-payload #9'
Sent 31 bytes: 'dpdk-to-kernel-test-payload #10'
Received 31 bytes from 10.0.1.76:9000: 'dpdk-to-kernel-test-payload #10'
Test complete
[2026-03-25T02:01:28Z] INFO: our-app-sends: sent 10 packets, received 10 responses
[2026-03-25T02:01:28Z] INFO: our-app-sends: PASS (sent >= 5 packets)
[2026-03-25T02:01:28Z] INFO: JUnit XML written to: /tmp/test-results/tier3-our-app-sends.xml
[2026-03-25T02:01:28Z] INFO: our-app-sends test complete
⚠️ SSM Command Failures (receiver-ssm-failure.log)
=== Polling timeout after 30s ===
Status: InProgress
Instance: i-0ef5d7f443f8f7cfd (receiver)
Command ID: b80e54d7-5e0a-4490-8fcf-39016768e2d3

=== STDOUT ===


=== STDERR ===


=== Polling timeout after 30s ===
Status: InProgress
Instance: i-0ef5d7f443f8f7cfd (receiver)
Command ID: 9a69d763-b37f-49f7-ae6b-aac26e1a3063

=== STDOUT ===


=== STDERR ===


=== Polling timeout after 30s ===
Status: InProgress
Instance: i-0ef5d7f443f8f7cfd (receiver)
Command ID: 82faa2b8-fef9-4fdd-9d71-221b586c199a

=== STDOUT ===


=== STDERR ===


⚠️ SSM Command Failures (sender-ssm-failure.log)
=== Polling timeout after 30s ===
Status: InProgress
Instance: i-023a7e54751947ad6 (sender)
Command ID: 6771ceda-1cfe-4cc2-a4e9-716bc224172e

=== 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:3f:f4:3f:65:c3 brd ff:ff:ff:ff:ff:ff
    altname enp0s5
    altname eni-0f94bb1f201473c51
    altname device-number-0.0
    inet 10.0.1.241/24 metric 512 brd 10.0.1.255 scope global dynamic ens5
       valid_lft 2192sec preferred_lft 2192sec
    inet6 fe80::3f:f4ff:fe3f:65c3/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:b3:b4:65:96 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:45:18:a9:b6:d5 brd ff:ff:ff:ff:ff:ff
    altname enp0s6
    altname eni-0eefa8d8f02bc4be6
    altname device-number-1.0
    inet 10.0.1.76/24 brd 10.0.1.255 scope global ens6
       valid_lft forever preferred_lft forever
    inet6 fe80::45:18ff:fea9:b6d5/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:5a:88:7e:6d:81 brd ff:ff:ff:ff:ff:ff
    altname enp0s5
    altname eni-08d2141c8d434c953
    altname device-number-0.0
    inet 10.0.1.105/24 metric 512 brd 10.0.1.255 scope global dynamic ens5
       valid_lft 2216sec preferred_lft 2216sec
    inet6 fe80::5a:88ff:fe7e:6d81/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:15:35:74:34 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-25T01:47:19Z
hostname: ip-10-0-1-241.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:3f:f4:3f:65:c3 brd ff:ff:ff:ff:ff:ff
    altname enp0s5
    altname eni-0f94bb1f201473c51
    altname device-number-0.0
    inet 10.0.1.241/24 metric 512 brd 10.0.1.255 scope global dynamic ens5
       valid_lft 3229sec preferred_lft 3229sec
    inet6 fe80::3f:f4ff:fe3f:65c3/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:b3:b4:65:96 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.156 dev ens5 lladdr 02:c3:0a:21:48:cb REACHABLE 
10.0.1.214 dev ens5 lladdr 02:18:27:66:ba:7f REACHABLE 
10.0.1.1 dev ens5 lladdr 02:94:0b:16:ad:e7 REACHABLE 

=== ROUTE TABLE ===
default via 10.0.1.1 dev ens5 proto dhcp src 10.0.1.241 metric 512 
10.0.0.2 via 10.0.1.1 dev ens5 proto dhcp src 10.0.1.241 metric 512 
10.0.1.0/24 dev ens5 proto kernel scope link src 10.0.1.241 metric 512 
10.0.1.1 dev ens5 proto dhcp scope link src 10.0.1.241 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:3f:f4:3f:65:c3/ 02:45:18:a9:b6:d5/ 

--- ENI: 02:3f:f4:3f:65:c3/ ---
  device-number: 0
  local-ipv4s: 10.0.1.241
  subnet-id: subnet-0c6f8324218a285db
  subnet-cidr: 10.0.1.0/24

--- ENI: 02:45:18:a9:b6:d5/ ---
  device-number: 1
  local-ipv4s: 10.0.1.76
  subnet-id: subnet-0c6f8324218a285db
  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:94:0b:16:ad:e7 REACHABLE 

arping result:
ARPING 10.0.1.1 from 10.0.1.241 ens5
Unicast reply from 10.0.1.1 [02:94:0B:16:AD:E7]  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 25 01:47 .
drwxr-xr-x. 14 root root     3100 Mar 25 01:46 ..
crw-------.  1 root root 243,   0 Mar 25 01:47 noiommu-0
crw-rw-rw-.  1 root root  10, 196 Mar 25 01:41 vfio

noiommu mode:
Y

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

=== DPDK-RELATED DMESG (last 30 lines) ===
[    0.067004] x86/fpu: Enabled xstate features 0x2ff, context size is 2568 bytes, using 'compacted' format.
[    0.073289] audit: type=2000 audit(1774402850.206:1): state=initialized audit_enabled=0 res=1
[    0.074711] kprobes: kprobe jump-optimization is enabled. All kprobes are optimized if possible.
[    0.099257] ACPI: Interpreter enabled
[    0.099257] ACPI: Enabled 2 GPEs in block 00 to 0F
[    0.123204] pci 0000:00:05.0: enabling Extended Tags
[    0.155812] SGI XFS with ACLs, security attributes, quota, no debug enabled
[    0.186548] ACPI: \_SB_.LNKD: Enabled at IRQ 11
[    0.265029] IPI shorthand broadcast: enabled
[    0.265097] AES CTR mode by8 optimization enabled
[   11.395148] systemd[1]: Mounting dev-hugepages.mount - Huge Pages File System...
[   11.438697] systemd[1]: Mounted dev-hugepages.mount - Huge Pages File System.
[   11.539181] VFIO - User Level meta-driver version: 0.3
[   13.173884] ena 0000:00:05.0: Elastic Network Adapter (ENA) v2.16.1g
[   13.185060] ena 0000:00:05.0: ENA device version: 0.10
[   13.185808] ena 0000:00:05.0: ENA controller version: 0.0.1 implementation version 1
[   13.284960] ena 0000:00:05.0: ENA Large LLQ is disabled
[   13.296832] ena 0000:00:05.0: Elastic Network Adapter (ENA) found at mem c0500000, mac addr 02:3f:f4:3f:65:c3
[   13.465563] ena 0000:00:05.0 ens5: renamed from eth0
[   18.005759] ena 0000:00:05.0 ens5: Local page cache is disabled for less than 16 channels
[  330.512687] pci 0000:00:06.0: enabling Extended Tags
[  330.516431] ena 0000:00:06.0: enabling device (0000 -> 0002)
[  330.529024] ena 0000:00:06.0: ENA device version: 0.10
[  330.529791] ena 0000:00:06.0: ENA controller version: 0.0.1 implementation version 1
[  330.626451] ena 0000:00:06.0: ENA Large LLQ is disabled
[  330.639164] ena 0000:00:06.0: Elastic Network Adapter (ENA) found at mem c0508000, mac addr 02:45:18:a9:b6:d5
[  330.691480] ena 0000:00:06.0 ens6: renamed from eth0
[  331.010841] ena 0000:00:06.0 ens6: Local page cache is disabled for less than 16 channels
[  375.206100] vfio-pci 0000:00:06.0: Adding to iommu group 0
[  375.207444] 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-25T01:47:11Z
hostname: ip-10-0-1-105.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:5a:88:7e:6d:81 brd ff:ff:ff:ff:ff:ff
    altname enp0s5
    altname eni-08d2141c8d434c953
    altname device-number-0.0
    inet 10.0.1.105/24 metric 512 brd 10.0.1.255 scope global dynamic ens5
       valid_lft 3238sec preferred_lft 3238sec
    inet6 fe80::5a:88ff:fe7e:6d81/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:15:35:74:34 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.214 dev ens5 lladdr 02:18:27:66:ba:7f STALE 
10.0.1.156 dev ens5 lladdr 02:c3:0a:21:48:cb REACHABLE 
10.0.1.1 dev ens5 lladdr 02:94:0b:16:ad:e7 REACHABLE 

=== ROUTE TABLE ===
default via 10.0.1.1 dev ens5 proto dhcp src 10.0.1.105 metric 512 
10.0.0.2 via 10.0.1.1 dev ens5 proto dhcp src 10.0.1.105 metric 512 
10.0.1.0/24 dev ens5 proto kernel scope link src 10.0.1.105 metric 512 
10.0.1.1 dev ens5 proto dhcp scope link src 10.0.1.105 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:5a:88:7e:6d:81/ 02:dc:d2:cc:f0:47/ 

--- ENI: 02:5a:88:7e:6d:81/ ---
  device-number: 0
  local-ipv4s: 10.0.1.105
  subnet-id: subnet-0c6f8324218a285db
  subnet-cidr: 10.0.1.0/24

--- ENI: 02:dc:d2:cc:f0:47/ ---
  device-number: 1
  local-ipv4s: 10.0.1.240
  subnet-id: subnet-0c6f8324218a285db
  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:94:0b:16:ad:e7 REACHABLE 

arping result:
ARPING 10.0.1.1 from 10.0.1.105 ens5
Unicast reply from 10.0.1.1 [02:94:0B:16:AD:E7]  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 25 01:46 .
drwxr-xr-x. 14 root root     3100 Mar 25 01:46 ..
crw-------.  1 root root 243,   0 Mar 25 01:46 noiommu-0
crw-rw-rw-.  1 root root  10, 196 Mar 25 01:41 vfio

noiommu mode:
Y

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

=== DPDK-RELATED DMESG (last 30 lines) ===
[    0.067878] x86/fpu: Enabled xstate features 0x2ff, context size is 2568 bytes, using 'compacted' format.
[    0.074111] audit: type=2000 audit(1774402850.208:1): state=initialized audit_enabled=0 res=1
[    0.075584] kprobes: kprobe jump-optimization is enabled. All kprobes are optimized if possible.
[    0.100393] ACPI: Interpreter enabled
[    0.100393] ACPI: Enabled 2 GPEs in block 00 to 0F
[    0.124153] pci 0000:00:05.0: enabling Extended Tags
[    0.156757] SGI XFS with ACLs, security attributes, quota, no debug enabled
[    0.187566] ACPI: \_SB_.LNKD: Enabled at IRQ 11
[    0.265199] IPI shorthand broadcast: enabled
[    0.265264] AES CTR mode by8 optimization enabled
[   11.395154] systemd[1]: Mounting dev-hugepages.mount - Huge Pages File System...
[   11.428889] systemd[1]: Mounted dev-hugepages.mount - Huge Pages File System.
[   11.533212] VFIO - User Level meta-driver version: 0.3
[   13.179779] ena 0000:00:05.0: Elastic Network Adapter (ENA) v2.16.1g
[   13.191019] ena 0000:00:05.0: ENA device version: 0.10
[   13.191811] ena 0000:00:05.0: ENA controller version: 0.0.1 implementation version 1
[   13.293037] ena 0000:00:05.0: ENA Large LLQ is disabled
[   13.305925] ena 0000:00:05.0: Elastic Network Adapter (ENA) found at mem c0500000, mac addr 02:5a:88:7e:6d:81
[   13.475352] ena 0000:00:05.0 ens5: renamed from eth0
[   18.006868] ena 0000:00:05.0 ens5: Local page cache is disabled for less than 16 channels
[  309.739076] pci 0000:00:06.0: enabling Extended Tags
[  309.742987] ena 0000:00:06.0: enabling device (0000 -> 0002)
[  309.755668] ena 0000:00:06.0: ENA device version: 0.10
[  309.756454] ena 0000:00:06.0: ENA controller version: 0.0.1 implementation version 1
[  309.855664] ena 0000:00:06.0: ENA Large LLQ is disabled
[  309.867480] ena 0000:00:06.0: Elastic Network Adapter (ENA) found at mem c0508000, mac addr 02:dc:d2:cc:f0:47
[  309.935660] ena 0000:00:06.0 ens6: renamed from eth0
[  310.263092] ena 0000:00:06.0 ens6: Local page cache is disabled for less than 16 channels
[  367.769157] vfio-pci 0000:00:06.0: Adding to iommu group 0
[  367.770478] 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.073273] pid_max: default: 32768 minimum: 301
[    0.125310] iommu: Default domain type: Translated 
[    0.126049] NetLabel:  unlabeled traffic allowed by default
[    0.134503] PCI: CLS 0 bytes, default 64
[    0.205756] nvme nvme0: 2/0/0 default/read/poll queues
[    0.430155] 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.430249] systemd[1]: No hostname configured, using default hostname.
[    0.528148] systemd[1]: Queued start job for default target initrd.target.
[    7.518926] 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)
[   25.963265] bridge: filtering via arp/ip/ip6tables is no longer available by default. Update your scripts to load br_netfilter if you need this.
[  420.683274] vfio-pci 0000:00:06.0: vfio-noiommu device opened by user (echo:6112)
[  851.040537] vfio-pci 0000:00:06.0: vfio-noiommu device opened by user (echo:25899)

sender-dmesg-crashes.log

[    0.074090] pid_max: default: 32768 minimum: 301
[    0.126247] iommu: Default domain type: Translated 
[    0.126963] NetLabel:  unlabeled traffic allowed by default
[    0.134090] PCI: CLS 0 bytes, default 64
[    0.218726] nvme nvme0: 2/0/0 default/read/poll queues
[    0.430689] 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.430781] systemd[1]: No hostname configured, using default hostname.
[    0.527723] systemd[1]: Queued start job for default target initrd.target.
[    7.519381] 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)
[   26.040140] bridge: filtering via arp/ip/ip6tables is no longer available by default. Update your scripts to load br_netfilter if you need this.
[ 1282.847989] vfio-pci 0000:00:06.0: vfio-noiommu device opened by user (echo:21264)
Kernel Console (dmesg)

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

[  330.511465] pci 0000:00:06.0: reg 0x18: [mem 0x00000000-0x000fffff pref]
[  330.512687] pci 0000:00:06.0: enabling Extended Tags
[  330.514414] pci 0000:00:06.0: BAR 2: assigned [mem 0xc0600000-0xc06fffff pref]
[  330.515438] pci 0000:00:06.0: BAR 0: assigned [mem 0xc0508000-0xc050bfff]
[  330.516431] ena 0000:00:06.0: enabling device (0000 -> 0002)
[  330.529024] ena 0000:00:06.0: ENA device version: 0.10
[  330.529791] ena 0000:00:06.0: ENA controller version: 0.0.1 implementation version 1
[  330.626451] ena 0000:00:06.0: ENA Large LLQ is disabled
[  330.639164] ena 0000:00:06.0: Elastic Network Adapter (ENA) found at mem c0508000, mac addr 02:45:18:a9:b6:d5
[  330.691480] ena 0000:00:06.0 ens6: renamed from eth0
[  331.010841] ena 0000:00:06.0 ens6: Local page cache is disabled for less than 16 channels
[  375.206100] vfio-pci 0000:00:06.0: Adding to iommu group 0
[  375.207444] vfio-pci 0000:00:06.0: Adding kernel taint for vfio-noiommu group on device
[  420.683274] vfio-pci 0000:00:06.0: vfio-noiommu device opened by user (echo:6112)
[  493.559292] vfio-pci 0000:00:06.0: Removing from iommu group 0
[  494.570338] ena 0000:00:06.0: ENA device version: 0.10
[  494.571117] ena 0000:00:06.0: ENA controller version: 0.0.1 implementation version 1
[  494.670326] ena 0000:00:06.0: ENA Large LLQ is disabled
[  494.682179] ena 0000:00:06.0: Elastic Network Adapter (ENA) found at mem c0508000, mac addr 02:45:18:a9:b6:d5
[  494.692579] ena 0000:00:06.0 eth0: Local page cache is disabled for less than 16 channels
[  618.053895] vfio-pci 0000:00:06.0: Adding to iommu group 0
[  618.055200] vfio-pci 0000:00:06.0: Adding kernel taint for vfio-noiommu group on device
[  851.040537] vfio-pci 0000:00:06.0: vfio-noiommu device opened by user (echo:25899)
[  929.223783] vfio-pci 0000:00:06.0: Removing from iommu group 0
[  930.236549] ena 0000:00:06.0: ENA device version: 0.10
[  930.237309] ena 0000:00:06.0: ENA controller version: 0.0.1 implementation version 1
[  930.337522] ena 0000:00:06.0: ENA Large LLQ is disabled
[  930.349347] ena 0000:00:06.0: Elastic Network Adapter (ENA) found at mem c0508000, mac addr 02:45:18:a9:b6:d5
[  930.397642] ena 0000:00:06.0 ens6: renamed from eth0
[  930.493617] ena 0000:00:06.0 ens6: Local page cache is disabled for less than 16 channels

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

[  309.735579] pci 0000:00:06.0: [1d0f:ec20] type 00 class 0x020000
[  309.736701] pci 0000:00:06.0: reg 0x10: [mem 0x00000000-0x00003fff]
[  309.737771] pci 0000:00:06.0: reg 0x18: [mem 0x00000000-0x000fffff pref]
[  309.739076] pci 0000:00:06.0: enabling Extended Tags
[  309.740869] pci 0000:00:06.0: BAR 2: assigned [mem 0xc0600000-0xc06fffff pref]
[  309.741947] pci 0000:00:06.0: BAR 0: assigned [mem 0xc0508000-0xc050bfff]
[  309.742987] ena 0000:00:06.0: enabling device (0000 -> 0002)
[  309.755668] ena 0000:00:06.0: ENA device version: 0.10
[  309.756454] ena 0000:00:06.0: ENA controller version: 0.0.1 implementation version 1
[  309.855664] ena 0000:00:06.0: ENA Large LLQ is disabled
[  309.867480] ena 0000:00:06.0: Elastic Network Adapter (ENA) found at mem c0508000, mac addr 02:dc:d2:cc:f0:47
[  309.935660] ena 0000:00:06.0 ens6: renamed from eth0
[  310.263092] ena 0000:00:06.0 ens6: Local page cache is disabled for less than 16 channels
[  367.769157] vfio-pci 0000:00:06.0: Adding to iommu group 0
[  367.770478] vfio-pci 0000:00:06.0: Adding kernel taint for vfio-noiommu group on device
[  432.926965] vfio-pci 0000:00:06.0: vfio-noiommu device opened by user (tokio-rt-worker:7289)
[  433.686871] vfio-pci 0000:00:06.0: vfio-noiommu device opened by user (tokio-rt-worker:7310)
[  435.436846] vfio-pci 0000:00:06.0: vfio-noiommu device opened by user (tokio-rt-worker:7334)
[  436.996799] vfio-pci 0000:00:06.0: vfio-noiommu device opened by user (tokio-rt-worker:7359)
[  483.348336] vfio-pci 0000:00:06.0: Removing from iommu group 0
[  484.361751] ena 0000:00:06.0: ENA device version: 0.10
[  484.362542] ena 0000:00:06.0: ENA controller version: 0.0.1 implementation version 1
[  484.463780] ena 0000:00:06.0: ENA Large LLQ is disabled
[  484.475792] ena 0000:00:06.0: Elastic Network Adapter (ENA) found at mem c0508000, mac addr 02:dc:d2:cc:f0:47
[  484.533818] ena 0000:00:06.0 ens6: renamed from eth0
[  484.565479] ena 0000:00:06.0 ens6: Local page cache is disabled for less than 16 channels
[  950.482463] vfio-pci 0000:00:06.0: Adding to iommu group 0
[  950.483791] vfio-pci 0000:00:06.0: Adding kernel taint for vfio-noiommu group on device
[ 1236.028523] vfio-pci 0000:00:06.0: vfio-noiommu device opened by user (tokio-rt-worker:20703)
[ 1282.847989] vfio-pci 0000:00:06.0: vfio-noiommu device opened by user (echo:21264)

@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-0492a86a0adf70572 (10.0.1.97)
  • DUT: i-06bcc675dd5444111 (10.0.1.76)

@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:0d:de:0d:5a:6b
  • RX: 0000:00:07.0 MAC: 02:10:45:a3:09:07
  • Gateway MAC: 02:b1:8e:e1:76:03
    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-06bcc675dd5444111 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:0d:de:0d:5a:6b
  Port 1: 02:10:45:a3:09:07
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.97 -> Dst: 10.0.1.76 (MAC: 02:b1:8e:e1:76:03)
Packet sizes: [64, 512, 1400]
Rate steps (target PPS): [70000, 140000, 350000, 700000]
Duration per step: 30s
Source MAC: 02:0d:de:0d:5a:6b

--- Packet size: 64B ---
  Target: 70,000 pps ... TX: 70,000 pps, RX: 68,994 pps, Drop: 1.4371%, Lat avg: 399.0 us
  Target: 140,000 pps ... TX: 140,000 pps, RX: 138,944 pps, Drop: 0.7546%, Lat avg: 0.0 us
  Target: 350,000 pps ... TX: 350,000 pps, RX: 185,634 pps, Drop: 46.9618%, Lat avg: 0.0 us
  Target: 700,000 pps ... TX: 700,000 pps, RX: 56,566 pps, Drop: 91.9191%, Lat avg: 0.0 us

--- Packet size: 512B ---
  Target: 70,000 pps ... TX: 70,000 pps, RX: 68,991 pps, Drop: 1.4416%, Lat avg: 573.0 us
  Target: 140,000 pps ... TX: 140,000 pps, RX: 138,658 pps, Drop: 0.9588%, Lat avg: 385.0 us
  Target: 350,000 pps ... TX: 350,000 pps, RX: 170,744 pps, Drop: 51.216%, Lat avg: 0.0 us
  Target: 700,000 pps ... TX: 700,000 pps, RX: 50,422 pps, Drop: 92.7969%, Lat avg: 0.0 us

--- Packet size: 1400B ---
  Target: 70,000 pps ... TX: 70,000 pps, RX: 68,999 pps, Drop: 1.4308%, Lat avg: 0.0 us
  Target: 140,000 pps ... TX: 140,000 pps, RX: 138,836 pps, Drop: 0.8314%, Lat avg: 0.0 us
  Target: 350,000 pps ... TX: 350,000 pps, RX: 159,106 pps, Drop: 54.5413%, Lat avg: 0.0 us
  Target: 700,000 pps ... TX: 700,000 pps, RX: 130,404 pps, Drop: 81.3709%, 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:0d:de:0d:5a:6b
  Port 1: 02:10:45:a3:09:07
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.97 -> Dst: 10.0.1.76 (MAC: 02:b1:8e:e1:76:03)
Packet sizes: [64, 512, 1400]
Rate steps (target PPS): [70000, 140000, 350000, 700000]
Duration per step: 30s
Source MAC: 02:0d:de:0d:5a:6b

--- Packet size: 64B ---
  Target: 70,000 pps ... TX: 70,000 pps, RX: 69,000 pps, Drop: 1.4285%, Lat avg: 515.0 us
  Target: 140,000 pps ... TX: 140,000 pps, RX: 138,997 pps, Drop: 0.7165%, Lat avg: 0.0 us
  Target: 350,000 pps ... TX: 350,000 pps, RX: 329,984 pps, Drop: 5.7188%, Lat avg: 711.0 us
  Target: 700,000 pps ... TX: 700,000 pps, RX: 316,155 pps, Drop: 54.835%, Lat avg: 1348.0 us

--- Packet size: 512B ---
  Target: 70,000 pps ... TX: 70,000 pps, RX: 69,000 pps, Drop: 1.4285%, Lat avg: 414.0 us
  Target: 140,000 pps ... TX: 140,000 pps, RX: 138,991 pps, Drop: 0.7205%, Lat avg: 0.0 us
  Target: 350,000 pps ... TX: 350,000 pps, RX: 229,515 pps, Drop: 34.4243%, Lat avg: 0.0 us
  Target: 700,000 pps ... TX: 700,000 pps, RX: 289,467 pps, Drop: 58.6476%, 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: 505.0 us
  Target: 140,000 pps ... TX: 140,000 pps, RX: 138,930 pps, Drop: 0.7645%, Lat avg: 0.0 us
  Target: 350,000 pps ... TX: 350,000 pps, RX: 245,723 pps, Drop: 29.7934%, Lat avg: 0.0 us
  Target: 700,000 pps ... TX: 700,000 pps, RX: 290,857 pps, Drop: 58.449%, 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:0d:de:0d:5a:6b
  Port 1: 02:10:45:a3:09:07
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.97 -> Dst: 10.0.1.76 (MAC: 02:b1:8e:e1:76:03)
Packet sizes: [64, 512, 1400]
Rate steps (target PPS): [70000, 140000, 350000, 700000]
Duration per step: 30s
Source MAC: 02:0d:de:0d:5a:6b

--- Packet size: 64B ---
  Target: 70,000 pps ... TX: 70,000 pps, RX: 70,000 pps, Drop: 0.0%, Lat avg: 204.0 us
  Target: 140,000 pps ... TX: 140,000 pps, RX: 140,000 pps, Drop: 0.0%, Lat avg: 237.0 us
  Target: 350,000 pps ... TX: 350,000 pps, RX: 349,928 pps, Drop: 0.0207%, Lat avg: 238.0 us
  Target: 700,000 pps ... TX: 700,000 pps, RX: 642,575 pps, Drop: 8.2035%, Lat avg: 857.0 us

--- Packet size: 512B ---
  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: 140,000 pps, Drop: 0.0%, Lat avg: 218.0 us
  Target: 350,000 pps ... TX: 350,000 pps, RX: 349,995 pps, Drop: 0.0014%, Lat avg: 252.0 us
  Target: 700,000 pps ... TX: 700,000 pps, RX: 610,918 pps, Drop: 12.726%, Lat avg: 894.0 us

--- Packet size: 1400B ---
  Target: 70,000 pps ... TX: 70,000 pps, RX: 70,000 pps, Drop: 0.0%, Lat avg: 243.0 us
  Target: 140,000 pps ... TX: 140,000 pps, RX: 140,000 pps, Drop: 0.0%, Lat avg: 251.0 us
  Target: 350,000 pps ... TX: 350,000 pps, RX: 350,000 pps, Drop: 0.0001%, Lat avg: 267.0 us
  Target: 700,000 pps ... TX: 700,000 pps, RX: 447,674 pps, Drop: 36.0466%, Lat avg: 4023.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:0d:de:0d:5a:6b
  Port 1: 02:10:45:a3:09:07
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.97 -> Dst: 10.0.1.76 (MAC: 02:b1:8e:e1:76:03)
Packet sizes: [64, 512, 1400]
Rate steps (target PPS): [70000, 140000, 350000, 700000]
Duration per step: 30s
Source MAC: 02:0d:de:0d:5a:6b

--- Packet size: 64B ---
  Target: 70,000 pps ... TX: 70,000 pps, RX: 0 pps, Drop: 100.0%, Lat avg: 0.0 us
  Target: 140,000 pps ... TX: 140,000 pps, RX: 0 pps, Drop: 100.0%, Lat avg: 0.0 us
  Target: 350,000 pps ... TX: 350,000 pps, RX: 0 pps, Drop: 100.0%, Lat avg: 0.0 us
  Target: 700,000 pps ... TX: 700,000 pps, RX: 0 pps, Drop: 100.0%, Lat avg: 0.0 us

--- Packet size: 512B ---
  Target: 70,000 pps ... TX: 70,000 pps, RX: 0 pps, Drop: 100.0%, Lat avg: 0.0 us
  Target: 140,000 pps ... TX: 140,000 pps, RX: 0 pps, Drop: 100.0%, Lat avg: 0.0 us
  Target: 350,000 pps ... TX: 350,000 pps, RX: 0 pps, Drop: 100.0%, Lat avg: 0.0 us
  Target: 700,000 pps ... TX: 700,000 pps, RX: 0 pps, Drop: 100.0%, Lat avg: 0.0 us

--- Packet size: 1400B ---
  Target: 70,000 pps ... TX: 70,000 pps, RX: 0 pps, Drop: 100.0%, Lat avg: 0.0 us
  Target: 140,000 pps ... TX: 140,000 pps, RX: 0 pps, Drop: 100.0%, Lat avg: 0.0 us
  Target: 350,000 pps ... TX: 350,000 pps, RX: 0 pps, Drop: 100.0%, Lat avg: 0.0 us
  Target: 700,000 pps ... TX: 700,000 pps, RX: 0 pps, Drop: 100.0%, Lat avg: 0.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:0d:de:0d:5a:6b
  Port 1: 02:10:45:a3:09:07
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.97 -> Dst: 10.0.1.76 (MAC: 02:b1:8e:e1:76:03)
Packet sizes: [64, 512, 1400]
Rate steps (target PPS): [70000, 140000, 350000, 700000]
Duration per step: 30s
Source MAC: 02:0d:de:0d:5a:6b

--- Packet size: 64B ---
  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: 106.0 us
  Target: 350,000 pps ... TX: 350,000 pps, RX: 350,000 pps, Drop: 0.0%, Lat avg: 143.0 us
  Target: 700,000 pps ... TX: 700,000 pps, RX: 612,546 pps, Drop: 12.4934%, Lat avg: 783.0 us

--- Packet size: 512B ---
  Target: 70,000 pps ... TX: 70,000 pps, RX: 70,000 pps, Drop: 0.0%, Lat avg: 127.0 us
  Target: 140,000 pps ... TX: 140,000 pps, RX: 140,000 pps, Drop: 0.0%, Lat avg: 153.0 us
  Target: 350,000 pps ... TX: 350,000 pps, RX: 350,000 pps, Drop: 0.0%, Lat avg: 156.0 us
  Target: 700,000 pps ... TX: 700,000 pps, RX: 597,723 pps, Drop: 14.611%, Lat avg: 803.0 us

--- Packet size: 1400B ---
  Target: 70,000 pps ... TX: 70,000 pps, RX: 70,000 pps, Drop: 0.0%, Lat avg: 125.0 us
  Target: 140,000 pps ... TX: 140,000 pps, RX: 140,000 pps, Drop: 0.0%, Lat avg: 119.0 us
  Target: 350,000 pps ... TX: 350,000 pps, RX: 349,935 pps, Drop: 0.0185%, Lat avg: 129.0 us
  Target: 700,000 pps ... TX: 700,000 pps, RX: 447,776 pps, Drop: 36.032%, Lat avg: 3728.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: 100328138  TX-errors: 0          TX-bytes:  55990865852

  Throughput (since last show)
  Rx-pps:       447724          Rx-bps:   5000191312
  Tx-pps:       447724          Tx-bps:   5000191312
  ############################################################################
�[2J�[1;1H
Port statistics ====================================
  ######################## NIC statistics for port 0  ########################
  RX-packets: 104805698  RX-missed: 0          RX-bytes:  62241538258
  RX-errors: 343192
  RX-nombuf:  0         
  TX-packets: 104805691  TX-errors: 0          TX-bytes:  62241528486

  Throughput (since last show)
  Rx-pps:       447725          Rx-bps:   5000195608
  Tx-pps:       447724          Tx-bps:   5000187792
  ############################################################################
�[2J�[1;1H
Port statistics ====================================
  ######################## NIC statistics for port 0  ########################
  RX-packets: 105833673  RX-missed: 0          RX-bytes:  63676591358
  RX-errors: 344317
  RX-nombuf:  0         
  TX-packets: 105833673  TX-errors: 0          TX-bytes:  63676591358

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

@github-actions

Copy link
Copy Markdown

[Perf] Stage: Results

[03:52:03] INFO Generating markdown summary...

Performance Test Results — c5n.2xlarge

Commit: 8949d082
Timestamp: 2026-03-25T03:52:03.008741+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% 125.0 289.0 784.0 784.0
native-dpdk 140,000 140,000 140,000 0.00% 119.0 1944.0 1568.0 1568.0
native-dpdk 350,000 350,000 349,935 0.02% 129.0 12781.0 3920.0 3919.3
native-dpdk 700,000 700,000 447,776 36.03% 3728.0 4978.0 7840.0 5015.1
rust-dpdk 70,000 70,000 70,000 0.00% 243.0 3107.0 784.0 784.0
rust-dpdk 140,000 140,000 140,000 0.00% 251.0 3146.0 1568.0 1568.0
rust-dpdk 350,000 350,000 350,000 0.00% 267.0 2769.0 3920.0 3920.0
rust-dpdk 700,000 700,000 447,674 36.05% 4023.0 5302.0 7840.0 5013.9
rust-dpdk-multicore 70,000 70,000 0 100.00% 0.0 0.0 784.0 0.0
rust-dpdk-multicore 140,000 140,000 0 100.00% 0.0 0.0 1568.0 0.0
rust-dpdk-multicore 350,000 350,000 0 100.00% 0.0 0.0 3920.0 0.0
rust-dpdk-multicore 700,000 700,000 0 100.00% 0.0 0.0 7840.0 0.0
rust-stdlib 70,000 70,000 68,999 1.43% 0.0 0.0 784.0 772.8
rust-stdlib 140,000 140,000 138,836 0.83% 0.0 0.0 1568.0 1555.0
rust-stdlib 350,000 350,000 159,106 54.54% 0.0 0.0 3920.0 1782.0
rust-stdlib 700,000 700,000 130,404 81.37% 0.0 0.0 7840.0 1460.5
plain-rust 70,000 70,000 69,000 1.43% 505.0 0.0 784.0 772.8
plain-rust 140,000 140,000 138,930 0.76% 0.0 0.0 1568.0 1556.0
plain-rust 350,000 350,000 245,723 29.79% 0.0 0.0 3920.0 2752.1
plain-rust 700,000 700,000 290,857 58.45% 0.0 0.0 7840.0 3257.6

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% 127.0 1685.0 286.7 286.7
native-dpdk 140,000 140,000 140,000 0.00% 153.0 281.0 573.4 573.4
native-dpdk 350,000 350,000 350,000 0.00% 156.0 1869.0 1433.6 1433.6
native-dpdk 700,000 700,000 597,723 14.61% 803.0 1808.0 2867.2 2448.3
rust-dpdk 70,000 70,000 70,000 0.00% 226.0 5806.0 286.7 286.7
rust-dpdk 140,000 140,000 140,000 0.00% 218.0 2538.0 573.4 573.4
rust-dpdk 350,000 350,000 349,995 0.00% 252.0 2845.0 1433.6 1433.6
rust-dpdk 700,000 700,000 610,918 12.73% 894.0 2191.0 2867.2 2502.3
rust-dpdk-multicore 70,000 70,000 0 100.00% 0.0 0.0 286.7 0.0
rust-dpdk-multicore 140,000 140,000 0 100.00% 0.0 0.0 573.4 0.0
rust-dpdk-multicore 350,000 350,000 0 100.00% 0.0 0.0 1433.6 0.0
rust-dpdk-multicore 700,000 700,000 0 100.00% 0.0 0.0 2867.2 0.0
rust-stdlib 70,000 70,000 68,991 1.44% 573.0 0.0 286.7 282.6
rust-stdlib 140,000 140,000 138,658 0.96% 385.0 0.0 573.4 567.9
rust-stdlib 350,000 350,000 170,744 51.22% 0.0 0.0 1433.6 699.4
rust-stdlib 700,000 700,000 50,422 92.80% 0.0 0.0 2867.2 206.5
plain-rust 70,000 70,000 69,000 1.43% 414.0 0.0 286.7 282.6
plain-rust 140,000 140,000 138,991 0.72% 0.0 0.0 573.4 569.3
plain-rust 350,000 350,000 229,515 34.42% 0.0 0.0 1433.6 940.1
plain-rust 700,000 700,000 289,467 58.65% 0.0 0.0 2867.2 1185.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% 122.0 1149.0 35.8 35.8
native-dpdk 140,000 140,000 140,000 0.00% 106.0 1083.0 71.7 71.7
native-dpdk 350,000 350,000 350,000 0.00% 143.0 1534.0 179.2 179.2
native-dpdk 700,000 700,000 612,546 12.49% 783.0 1924.0 358.4 313.6
rust-dpdk 70,000 70,000 70,000 0.00% 204.0 2872.0 35.8 35.8
rust-dpdk 140,000 140,000 140,000 0.00% 237.0 3073.0 71.7 71.7
rust-dpdk 350,000 350,000 349,928 0.02% 238.0 8474.0 179.2 179.2
rust-dpdk 700,000 700,000 642,575 8.20% 857.0 1222.0 358.4 329.0
rust-dpdk-multicore 70,000 70,000 0 100.00% 0.0 0.0 35.8 0.0
rust-dpdk-multicore 140,000 140,000 0 100.00% 0.0 0.0 71.7 0.0
rust-dpdk-multicore 350,000 350,000 0 100.00% 0.0 0.0 179.2 0.0
rust-dpdk-multicore 700,000 700,000 0 100.00% 0.0 0.0 358.4 0.0
rust-stdlib 70,000 70,000 68,994 1.44% 399.0 0.0 35.8 35.3
rust-stdlib 140,000 140,000 138,944 0.75% 0.0 0.0 71.7 71.1
rust-stdlib 350,000 350,000 185,634 46.96% 0.0 0.0 179.2 95.0
rust-stdlib 700,000 700,000 56,566 91.92% 0.0 0.0 358.4 29.0
plain-rust 70,000 70,000 69,000 1.43% 515.0 0.0 35.8 35.3
plain-rust 140,000 140,000 138,997 0.72% 0.0 0.0 71.7 71.2
plain-rust 350,000 350,000 329,984 5.72% 711.0 0.0 179.2 168.9
plain-rust 700,000 700,000 316,155 54.84% 1348.0 0.0 358.4 161.9

Full results artifact

@gspivey
gspivey merged commit 9a526fc into main Mar 25, 2026
6 checks passed
gspivey pushed a commit that referenced this pull request Mar 25, 2026
…m defaults

- README: replace "10-100x" claim with actual measured ~2x PPS improvement,
  remove multi-core pipeline section (experimental), fix stale --dpdk flag
- echo app: rewrite to mirror plain-echo (65 lines vs 282), demonstrating
  the drop-in replacement story (only difference is the import line)
- plain-echo: add signal handling and read timeout to match echo structure
- perf-test-log: add Run #4 entry for topology simplification PR #26
- perf-tests: remove rust-dpdk-multicore from default configs (experimental)

https://claude.ai/code/session_013kEK2d9wyTRWwmoAB4VBco
gspivey pushed a commit that referenced this pull request Mar 25, 2026
PR #26 did have a full perf run (GH Actions 23522716883). Key findings:
- rust-dpdk single-core matches native-dpdk at 700K/1400B (both 36% drop)
- rust-dpdk-multicore 100% broken (--workers flag removed by simplification)
- DPDK delivers ~2x throughput of kernel sockets at 64B/700K saturation

https://claude.ai/code/session_013kEK2d9wyTRWwmoAB4VBco
@gspivey
gspivey deleted the claude/simplify-rss-queue-U5Yrs branch April 15, 2026 06:34
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 pushed a commit that referenced this pull request Jun 2, 2026
Performance test results from GH Actions run 26815657085:
- rust-dpdk at 700K PPS 64B: 689,799 RX (1.46% drop)
- native-dpdk at 700K PPS 64B: 688,347 RX (1.66% drop)
- No regression vs Run #26

Synthetic CPU-only IPv6 vs IPv4 comparison confirms expected
~28% TX overhead at 64B due to larger headers and mandatory
UDP checksum. RX performance equivalent.

Marks IPv6 roadmap tasks 3 and 9 as complete.
gspivey pushed a commit that referenced this pull request Jun 16, 2026
- Append Run #30 results to docs/perf-test-log.md (no regressions)
- Mark ROADMAP item 26 as complete with PR #90
- Mark tasks 6.1, 6.2, 6.3 as complete in tasks.md
gspivey added a commit that referenced this pull request Jun 16, 2026
## ROADMAP Item #26: `dpdk-stdlib-tcp` Engine property tests

Implements tasks 6.1, 6.2, 6.3 from `.kiro/specs/tcp-support/tasks.md`.

### Tests Added

15 property-based tests in `dpdk-stdlib-tcp/tests/engine_props.rs`
covering:

**Task 6.1 — Engine state machine properties:**
- Property 11: Timer-driven segment generation (RTO retransmit + persist
probe)
- Property 12: TIME_WAIT/FIN_WAIT_2 cleanup (TCB freed after timeout)
- Property 13: Resource limit enforcement (max_tcbs + backlog exceeded →
RST)
- Property 14: RST validation per RFC 5961 (exact seq aborts, in-window
challenges, out-of-window drops)

**Task 6.2 — Congestion control properties:**
- Property 15: Flight-size invariant (unacked ≤ min(cwnd, rwnd))
- Property 16: Slow-start cwnd growth (MSS per ACK)
- Property 17: Initial window formula (RFC 6928)
- Property 18: Fast retransmit formula (NewReno: ssthresh + cwnd)
- Property 22: Partial ACK in recovery (deflate cwnd, stay in recovery)
- Property 25: Persist-never-aborts (indefinite probing without
TimedOut)

All tests use proptest with ≥100 cases per property. `cargo build &&
cargo test` passes with 0 failures.

### Tradeoffs
- Properties 8, 9, 10, 21, 23 already exist in earlier PRs
(engine_handshake_props.rs, established_props.rs, ooo_reorder_props.rs).
This PR adds the remaining properties.
- Tests exercise the engine directly via MockClock rather than through
the full socket API, enabling deterministic timer testing.

---------

Co-authored-by: Agent Router <agent@agent-router.dev>
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