Skip to content

feat: add always-on performance instrumentation (Phase 1) - #23

Merged
gspivey merged 5 commits into
mainfrom
claude/performance-optimization-phase-one-7mAY5
Mar 12, 2026
Merged

gspivey merged 5 commits into
mainfrom
claude/performance-optimization-phase-one-7mAY5

Conversation

@gspivey

@gspivey gspivey commented Mar 12, 2026

Copy link
Copy Markdown
Owner

Summary

  • New dpdk-udp/src/perf.rs module with lock-free PerfCounters (cache-line aligned AtomicU64), LatencySampler (1-in-1000 sampling with percentile computation), PerfReporter (background thread emitting structured key=value log lines), and PerfSnapshot API
  • Wired into all hot paths: send_to_addr (TX counters, ARP hit/miss), recv_from_inline (RX burst stats, latency sampling), process_frame_zerocopy (RX packet/byte/ARP/ICMP/parse-fail counters), multi-core rx_loop (burst stats, ring drop counters), worker_loop (idle polls, packets processed, app ring failures)
  • UdpSocket API additions: perf_counters(), enable_perf_reporting(interval), disable_perf_reporting(), perf_snapshot(), latency_sampler()
  • Echo app: --perf-interval <seconds> flag to enable runtime performance reporting

Design decisions

  • All hot-path counters use fetch_add(1, Relaxed) — the cheapest atomic operation with no memory fence
  • PerfCounters is #[repr(align(64))] to prevent false sharing across cores
  • Latency sampler uses AtomicU64 ring buffer with 1-in-1000 sampling rate (~350 clock reads/sec at 350K PPS — negligible overhead)
  • Reporter thread diffs counter snapshots to compute per-second rates
  • Output format: [PERF] interval=10s rx_pps=... tx_pps=... lat_avg_us=... lat_p99_us=...

Test plan

  • 12 unit tests: concurrent counter increment, percentile accuracy, reporter lifecycle, rate computation
  • All 193 existing tests pass (cargo test)
  • Integration tests (CI)
  • Performance benchmark with instrumentation enabled — verify < 1% throughput regression (P1.9)

https://claude.ai/code/session_016N4yPU5RzaxmK1Vtu4Hr6y

Implement high-performance, lock-free instrumentation for DPDK UDP sockets
to provide visibility into packet processing performance before optimization.

New dpdk-udp/src/perf.rs module:
- PerfCounters: cache-line aligned AtomicU64 counters for RX/TX packets,
  bytes, drops, ARP/ICMP handling, ring utilization, and worker stats
- LatencySampler: fixed-size ring buffer with 1-in-N sampling for
  percentile tracking (p50/p95/p99/p99.9) with < 1% overhead
- PerfReporter: background thread emitting structured key=value log
  lines to stderr at configurable intervals
- PerfSnapshot: programmatic API for reading perf data

Wired into hot paths:
- send_to_addr: tx_packets, tx_bytes, tx_failures, arp_cache_hits/misses
- recv_from_inline: rx_bursts, rx_burst_sum, rx_packets, rx_bytes,
  rx_arp_handled, rx_icmp_handled, rx_drops_parse_fail
- Latency sampling at rx_burst return → recv_from return
- Multi-core topology: rx_drops_ring_full, worker_idle_polls,
  worker_packets_processed, app_ring_enqueue_fail

UdpSocket API additions:
- perf_counters() / perf_counters_arc()
- enable_perf_reporting(interval) / disable_perf_reporting()
- perf_snapshot()
- latency_sampler()

Echo app: --perf-interval <seconds> flag for runtime reporting.

12 unit tests covering concurrent counters, percentile accuracy,
reporter lifecycle, and rate computation.

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

Copy link
Copy Markdown

[CI] Stage: Deploy

Infrastructure ready.

  • Sender: i-01a88cf5368097dd8 (DPDK ENI: 10.0.1.135)
  • Receiver: i-0e1de7a30f471e58c (DPDK ENI: 10.0.1.242)
  • 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 22986576346)

Branch: claude/performance-optimization-phase-one-7mAY5 | Commit: b1e00ee2

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

receiver-echo-server.log

🚀 DPDK-STDLIB Echo Server
Binding to 10.0.1.242: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.242:9000 (MAC: 02:b3:e5:20:13:93)
Using DPDK acceleration (run-to-completion)
✅ Socket created successfully!
📡 Local address: 10.0.1.242:9000
🔄 Echo server running... (Ctrl+C to stop)
Shutting down gracefully...

sender-echo-server.log

🚀 DPDK-STDLIB Echo Server
Binding to 10.0.1.135: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.135:9000 (MAC: 02:ea:d6:89:70:79)
Using DPDK acceleration (run-to-completion)
✅ Socket created successfully!
📡 Local address: 10.0.1.135:9000
🔄 Echo server running... (Ctrl+C to stop)
Shutting down gracefully...

sender-test-client.log

Test complete
[2026-03-12T04:43:43Z] INFO: ARP resolution succeeded (got response from peer)
[2026-03-12T04:43:43Z] INFO: Test: udp_send_receive
[2026-03-12T04:43:44Z] INFO: UDP send/receive succeeded
[2026-03-12T04:43:44Z] INFO: Test: echo_roundtrip
[2026-03-12T04:43:46Z] INFO: Echo roundtrip succeeded: 5/5 responses received
[2026-03-12T04:43:46Z] INFO: Test: payload_integrity
[2026-03-12T04:43:47Z] INFO: Response received, checking payload match...
[2026-03-12T04:43:47Z] INFO: Payload integrity verified (found in response)
[2026-03-12T04:43:47Z] INFO: JUnit XML written to: /tmp/test-results/tier1-dpdk-echo.xml
[2026-03-12T04:43:47Z] INFO: Tier 1 sender tests complete. Results: /tmp/test-results/tier1-dpdk-echo.xml
[2026-03-12T04:50:58Z] INFO: Test: arp_resolution
UDP Test Client
Target: 10.0.1.242: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.242:9000: 'arp-probe #1'
Test complete
[2026-03-12T04:50:58Z] INFO: ARP resolution succeeded (got response from peer)
[2026-03-12T04:50:58Z] INFO: Test: udp_send_receive
[2026-03-12T04:50:59Z] INFO: UDP send/receive succeeded
[2026-03-12T04:50:59Z] INFO: Test: echo_roundtrip
[2026-03-12T04:51:00Z] INFO: Echo roundtrip succeeded: 5/5 responses received
[2026-03-12T04:51:00Z] INFO: Test: payload_integrity
[2026-03-12T04:51:00Z] INFO: Response received, checking payload match...
[2026-03-12T04:51:00Z] INFO: Payload integrity verified (found in response)
[2026-03-12T04:51:00Z] INFO: JUnit XML written to: /tmp/test-results/tier2-kernel-interop.xml
[2026-03-12T04:51:00Z] INFO: Tier 2 sender tests complete. Results: /tmp/test-results/tier2-kernel-interop.xml

receiver-test-client-iperf.log

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

sender-test-client-iperf.log

Bind address: 10.0.1.135: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.135:32768 (MAC: 02:ea:d6:89:70:79)
Backend: dpdk
Sending packets...
Sent 30 bytes: 'dpdk-to-kernel-test-payload #1'
Received 30 bytes from 10.0.1.242:9000: 'dpdk-to-kernel-test-payload #1'
Sent 30 bytes: 'dpdk-to-kernel-test-payload #2'
Received 30 bytes from 10.0.1.242:9000: 'dpdk-to-kernel-test-payload #2'
Sent 30 bytes: 'dpdk-to-kernel-test-payload #3'
Received 30 bytes from 10.0.1.242:9000: 'dpdk-to-kernel-test-payload #3'
Sent 30 bytes: 'dpdk-to-kernel-test-payload #4'
Received 30 bytes from 10.0.1.242:9000: 'dpdk-to-kernel-test-payload #4'
Sent 30 bytes: 'dpdk-to-kernel-test-payload #5'
Received 30 bytes from 10.0.1.242:9000: 'dpdk-to-kernel-test-payload #5'
Sent 30 bytes: 'dpdk-to-kernel-test-payload #6'
Received 30 bytes from 10.0.1.242:9000: 'dpdk-to-kernel-test-payload #6'
Sent 30 bytes: 'dpdk-to-kernel-test-payload #7'
Received 30 bytes from 10.0.1.242:9000: 'dpdk-to-kernel-test-payload #7'
Sent 30 bytes: 'dpdk-to-kernel-test-payload #8'
Received 30 bytes from 10.0.1.242:9000: 'dpdk-to-kernel-test-payload #8'
Sent 30 bytes: 'dpdk-to-kernel-test-payload #9'
Received 30 bytes from 10.0.1.242:9000: 'dpdk-to-kernel-test-payload #9'
Sent 31 bytes: 'dpdk-to-kernel-test-payload #10'
Received 31 bytes from 10.0.1.242:9000: 'dpdk-to-kernel-test-payload #10'
Test complete
[2026-03-12T04:55:05Z] INFO: our-app-sends: sent 10 packets, received 10 responses
[2026-03-12T04:55:05Z] INFO: our-app-sends: PASS (sent >= 5 packets)
[2026-03-12T04:55:05Z] INFO: JUnit XML written to: /tmp/test-results/tier3-our-app-sends.xml
[2026-03-12T04:55:05Z] INFO: our-app-sends test complete
⚠️ SSM Command Failures (receiver-ssm-failure.log)
=== Polling timeout after 30s ===
Status: InProgress
Instance: i-0e1de7a30f471e58c (receiver)
Command ID: e84a7df9-415f-4a68-a4ed-9fc45ad592e6

=== STDOUT ===


=== STDERR ===


=== Polling timeout after 30s ===
Status: InProgress
Instance: i-0e1de7a30f471e58c (receiver)
Command ID: 98cf86fb-9660-4ac9-97b4-be3733c0d0dc

=== STDOUT ===


=== STDERR ===


=== Polling timeout after 30s ===
Status: InProgress
Instance: i-0e1de7a30f471e58c (receiver)
Command ID: 157bda05-c624-4c3c-bfa1-35bb4e2d0388

=== STDOUT ===


=== STDERR ===


⚠️ SSM Command Failures (sender-ssm-failure.log)
=== Polling timeout after 30s ===
Status: InProgress
Instance: i-01a88cf5368097dd8 (sender)
Command ID: 84a89a14-9a0a-4ec4-a712-8df907f94385

=== 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:7b:33:1e:a9:0d brd ff:ff:ff:ff:ff:ff
    altname enp0s5
    altname eni-0b64a6681d92cb05a
    altname device-number-0.0
    inet 10.0.1.52/24 metric 512 brd 10.0.1.255 scope global dynamic ens5
       valid_lft 2395sec preferred_lft 2395sec
    inet6 fe80::7b:33ff:fe1e:a90d/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:70:b1:4f:35 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:b3:e5:20:13:93 brd ff:ff:ff:ff:ff:ff
    altname enp0s6
    altname ens6
    inet 10.0.1.242/24 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::b3:e5ff:fe20:1393/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:03:66:c5:74:dd brd ff:ff:ff:ff:ff:ff
    altname enp0s5
    altname eni-0707c8529698a9766
    altname device-number-0.0
    inet 10.0.1.182/24 metric 512 brd 10.0.1.255 scope global dynamic ens5
       valid_lft 2418sec preferred_lft 2418sec
    inet6 fe80::3:66ff:fec5:74dd/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:17:8a:33:47 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-12T04:43:01Z
hostname: ip-10-0-1-52.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:7b:33:1e:a9:0d brd ff:ff:ff:ff:ff:ff
    altname enp0s5
    altname eni-0b64a6681d92cb05a
    altname device-number-0.0
    inet 10.0.1.52/24 metric 512 brd 10.0.1.255 scope global dynamic ens5
       valid_lft 3304sec preferred_lft 3304sec
    inet6 fe80::7b:33ff:fe1e:a90d/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:70:b1:4f:35 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.7 dev ens5 lladdr 02:18:12:57:79:3f REACHABLE 
10.0.1.1 dev ens5 lladdr 02:d9:7f:e7:dd:8d REACHABLE 
10.0.1.28 dev ens5 lladdr 02:01:48:4b:58:29 DELAY 

=== ROUTE TABLE ===
default via 10.0.1.1 dev ens5 proto dhcp src 10.0.1.52 metric 512 
10.0.0.2 via 10.0.1.1 dev ens5 proto dhcp src 10.0.1.52 metric 512 
10.0.1.0/24 dev ens5 proto kernel scope link src 10.0.1.52 metric 512 
10.0.1.1 dev ens5 proto dhcp scope link src 10.0.1.52 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:7b:33:1e:a9:0d/ 02:b3:e5:20:13:93/ 

--- ENI: 02:7b:33:1e:a9:0d/ ---
  device-number: 0
  local-ipv4s: 10.0.1.52
  subnet-id: subnet-06a7139da8cb83649
  subnet-cidr: 10.0.1.0/24

--- ENI: 02:b3:e5:20:13:93/ ---
  device-number: 1
  local-ipv4s: 10.0.1.242
  subnet-id: subnet-06a7139da8cb83649
  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:d9:7f:e7:dd:8d REACHABLE 

arping result:
ARPING 10.0.1.1 from 10.0.1.52 ens5
Unicast reply from 10.0.1.1 [02:D9:7F:E7:DD:8D]  0.542ms
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 12 04:42 .
drwxr-xr-x. 14 root root     3100 Mar 12 04:42 ..
crw-------.  1 root root 243,   0 Mar 12 04:42 noiommu-0
crw-rw-rw-.  1 root root  10, 196 Mar 12 04:38 vfio

noiommu mode:
Y

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

=== DPDK-RELATED DMESG (last 30 lines) ===
[    0.069132] x86/fpu: Enabled xstate features 0x2ff, context size is 2568 bytes, using 'compacted' format.
[    0.076279] audit: type=2000 audit(1773290279.450:1): state=initialized audit_enabled=0 res=1
[    0.076945] kprobes: kprobe jump-optimization is enabled. All kprobes are optimized if possible.
[    0.102237] ACPI: Interpreter enabled
[    0.102237] ACPI: Enabled 2 GPEs in block 00 to 0F
[    0.125549] pci 0000:00:05.0: enabling Extended Tags
[    0.156990] SGI XFS with ACLs, security attributes, quota, no debug enabled
[    0.186992] ACPI: \_SB_.LNKD: Enabled at IRQ 11
[    0.276407] IPI shorthand broadcast: enabled
[    0.276470] AES CTR mode by8 optimization enabled
[    2.395194] systemd[1]: Mounting dev-hugepages.mount - Huge Pages File System...
[    2.437234] systemd[1]: Mounted dev-hugepages.mount - Huge Pages File System.
[    2.486241] VFIO - User Level meta-driver version: 0.3
[    3.658462] ena 0000:00:05.0: Elastic Network Adapter (ENA) v2.16.1g
[    3.665254] ena 0000:00:05.0: ENA device version: 0.10
[    3.666008] ena 0000:00:05.0: ENA controller version: 0.0.1 implementation version 1
[    3.764991] ena 0000:00:05.0: ENA Large LLQ is disabled
[    3.777251] ena 0000:00:05.0: Elastic Network Adapter (ENA) found at mem c0500000, mac addr 02:7b:33:1e:a9:0d
[    3.855276] ena 0000:00:05.0 ens5: renamed from eth0
[    5.379152] ena 0000:00:05.0 ens5: Local page cache is disabled for less than 16 channels
[  251.019069] pci 0000:00:06.0: enabling Extended Tags
[  251.022896] ena 0000:00:06.0: enabling device (0000 -> 0002)
[  251.033567] ena 0000:00:06.0: ENA device version: 0.10
[  251.034321] ena 0000:00:06.0: ENA controller version: 0.0.1 implementation version 1
[  251.133552] ena 0000:00:06.0: ENA Large LLQ is disabled
[  251.145816] ena 0000:00:06.0: Elastic Network Adapter (ENA) found at mem c0508000, mac addr 02:b3:e5:20:13:93
[  251.193620] ena 0000:00:06.0 ens6: renamed from eth0
[  251.505842] ena 0000:00:06.0 ens6: Local page cache is disabled for less than 16 channels
[  288.629161] vfio-pci 0000:00:06.0: Adding to iommu group 0
[  288.630603] 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-12T04:42:53Z
hostname: ip-10-0-1-182.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:03:66:c5:74:dd brd ff:ff:ff:ff:ff:ff
    altname enp0s5
    altname eni-0707c8529698a9766
    altname device-number-0.0
    inet 10.0.1.182/24 metric 512 brd 10.0.1.255 scope global dynamic ens5
       valid_lft 3312sec preferred_lft 3312sec
    inet6 fe80::3:66ff:fec5:74dd/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:17:8a:33:47 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:d9:7f:e7:dd:8d REACHABLE 
10.0.1.7 dev ens5 lladdr 02:18:12:57:79:3f REACHABLE 
10.0.1.28 dev ens5 lladdr 02:01:48:4b:58:29 STALE 

=== ROUTE TABLE ===
default via 10.0.1.1 dev ens5 proto dhcp src 10.0.1.182 metric 512 
10.0.0.2 via 10.0.1.1 dev ens5 proto dhcp src 10.0.1.182 metric 512 
10.0.1.0/24 dev ens5 proto kernel scope link src 10.0.1.182 metric 512 
10.0.1.1 dev ens5 proto dhcp scope link src 10.0.1.182 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:03:66:c5:74:dd/ 02:ea:d6:89:70:79/ 

--- ENI: 02:03:66:c5:74:dd/ ---
  device-number: 0
  local-ipv4s: 10.0.1.182
  subnet-id: subnet-06a7139da8cb83649
  subnet-cidr: 10.0.1.0/24

--- ENI: 02:ea:d6:89:70:79/ ---
  device-number: 1
  local-ipv4s: 10.0.1.135
  subnet-id: subnet-06a7139da8cb83649
  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:d9:7f:e7:dd:8d REACHABLE 

arping result:
ARPING 10.0.1.1 from 10.0.1.182 ens5
Unicast reply from 10.0.1.1 [02:D9:7F:E7:DD:8D]  0.545ms
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 12 04:42 .
drwxr-xr-x. 14 root root     3100 Mar 12 04:41 ..
crw-------.  1 root root 243,   0 Mar 12 04:42 noiommu-0
crw-rw-rw-.  1 root root  10, 196 Mar 12 04:38 vfio

noiommu mode:
Y

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

=== DPDK-RELATED DMESG (last 30 lines) ===
[    0.065429] x86/fpu: Enabled xstate features 0x2ff, context size is 2568 bytes, using 'compacted' format.
[    0.071764] audit: type=2000 audit(1773290279.703:1): state=initialized audit_enabled=0 res=1
[    0.073171] kprobes: kprobe jump-optimization is enabled. All kprobes are optimized if possible.
[    0.097903] ACPI: Interpreter enabled
[    0.097903] ACPI: Enabled 2 GPEs in block 00 to 0F
[    0.121816] pci 0000:00:05.0: enabling Extended Tags
[    0.146916] SGI XFS with ACLs, security attributes, quota, no debug enabled
[    0.181318] ACPI: \_SB_.LNKD: Enabled at IRQ 11
[    0.262009] IPI shorthand broadcast: enabled
[    0.262071] AES CTR mode by8 optimization enabled
[    2.515168] systemd[1]: Mounting dev-hugepages.mount - Huge Pages File System...
[    2.557525] systemd[1]: Mounted dev-hugepages.mount - Huge Pages File System.
[    2.606040] VFIO - User Level meta-driver version: 0.3
[    3.623792] ena 0000:00:05.0: Elastic Network Adapter (ENA) v2.16.1g
[    3.645763] ena 0000:00:05.0: ENA device version: 0.10
[    3.646505] ena 0000:00:05.0: ENA controller version: 0.0.1 implementation version 1
[    3.770123] ena 0000:00:05.0: ENA Large LLQ is disabled
[    3.783085] ena 0000:00:05.0: Elastic Network Adapter (ENA) found at mem c0500000, mac addr 02:03:66:c5:74:dd
[    3.825063] ena 0000:00:05.0 ens5: renamed from eth0
[    5.014182] ena 0000:00:05.0 ens5: Local page cache is disabled for less than 16 channels
[  211.081659] pci 0000:00:06.0: enabling Extended Tags
[  211.085467] ena 0000:00:06.0: enabling device (0000 -> 0002)
[  211.094849] ena 0000:00:06.0: ENA device version: 0.10
[  211.095585] ena 0000:00:06.0: ENA controller version: 0.0.1 implementation version 1
[  211.194895] ena 0000:00:06.0: ENA Large LLQ is disabled
[  211.206996] ena 0000:00:06.0: Elastic Network Adapter (ENA) found at mem c0508000, mac addr 02:ea:d6:89:70:79
[  211.264865] ena 0000:00:06.0 ens6: renamed from eth0
[  211.563234] ena 0000:00:06.0 ens6: Local page cache is disabled for less than 16 channels
[  281.259105] vfio-pci 0000:00:06.0: Adding to iommu group 0
[  281.260385] 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.075483] pid_max: default: 32768 minimum: 301
[    0.127754] iommu: Default domain type: Translated 
[    0.128519] NetLabel:  unlabeled traffic allowed by default
[    0.135483] PCI: CLS 0 bytes, default 64
[    0.209111] nvme nvme0: 2/0/0 default/read/poll queues
[    0.444112] 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.444219] systemd[1]: No hostname configured, using default hostname.
[    0.550065] systemd[1]: Queued start job for default target initrd.target.
[    1.701856] 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.657125] bridge: filtering via arp/ip/ip6tables is no longer available by default. Update your scripts to load br_netfilter if you need this.
[  327.205718] vfio-pci 0000:00:06.0: vfio-noiommu device opened by user (echo:6672)
[  763.103187] vfio-pci 0000:00:06.0: vfio-noiommu device opened by user (echo:22412)

sender-dmesg-crashes.log

[    0.071744] pid_max: default: 32768 minimum: 301
[    0.123915] iommu: Default domain type: Translated 
[    0.124648] NetLabel:  unlabeled traffic allowed by default
[    0.131744] PCI: CLS 0 bytes, default 64
[    0.197966] nvme nvme0: 2/0/0 default/read/poll queues
[    0.427483] 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.427582] systemd[1]: No hostname configured, using default hostname.
[    0.527135] systemd[1]: Queued start job for default target initrd.target.
[    1.736300] 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.354746] bridge: filtering via arp/ip/ip6tables is no longer available by default. Update your scripts to load br_netfilter if you need this.
[ 1069.176533] vfio-pci 0000:00:06.0: vfio-noiommu device opened by user (echo:44161)
Kernel Console (dmesg)

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

[  251.016825] pci 0000:00:06.0: reg 0x10: [mem 0x00000000-0x00003fff]
[  251.017833] pci 0000:00:06.0: reg 0x18: [mem 0x00000000-0x000fffff pref]
[  251.019069] pci 0000:00:06.0: enabling Extended Tags
[  251.020849] pci 0000:00:06.0: BAR 2: assigned [mem 0xc0600000-0xc06fffff pref]
[  251.021890] pci 0000:00:06.0: BAR 0: assigned [mem 0xc0508000-0xc050bfff]
[  251.022896] ena 0000:00:06.0: enabling device (0000 -> 0002)
[  251.033567] ena 0000:00:06.0: ENA device version: 0.10
[  251.034321] ena 0000:00:06.0: ENA controller version: 0.0.1 implementation version 1
[  251.133552] ena 0000:00:06.0: ENA Large LLQ is disabled
[  251.145816] ena 0000:00:06.0: Elastic Network Adapter (ENA) found at mem c0508000, mac addr 02:b3:e5:20:13:93
[  251.193620] ena 0000:00:06.0 ens6: renamed from eth0
[  251.505842] ena 0000:00:06.0 ens6: Local page cache is disabled for less than 16 channels
[  288.629161] vfio-pci 0000:00:06.0: Adding to iommu group 0
[  288.630603] vfio-pci 0000:00:06.0: Adding kernel taint for vfio-noiommu group on device
[  327.205718] vfio-pci 0000:00:06.0: vfio-noiommu device opened by user (echo:6672)
[  505.608150] vfio-pci 0000:00:06.0: Removing from iommu group 0
[  506.621459] ena 0000:00:06.0: ENA device version: 0.10
[  506.622218] ena 0000:00:06.0: ENA controller version: 0.0.1 implementation version 1
[  506.722103] ena 0000:00:06.0: ENA Large LLQ is disabled
[  506.734256] ena 0000:00:06.0: Elastic Network Adapter (ENA) found at mem c0508000, mac addr 02:b3:e5:20:13:93
[  506.743882] ena 0000:00:06.0 eth0: Local page cache is disabled for less than 16 channels
[  634.636259] vfio-pci 0000:00:06.0: Adding to iommu group 0
[  634.637519] vfio-pci 0000:00:06.0: Adding kernel taint for vfio-noiommu group on device
[  763.103187] vfio-pci 0000:00:06.0: vfio-noiommu device opened by user (echo:22412)
[  840.147554] vfio-pci 0000:00:06.0: Removing from iommu group 0
[  841.160143] ena 0000:00:06.0: ENA device version: 0.10
[  841.160899] ena 0000:00:06.0: ENA controller version: 0.0.1 implementation version 1
[  841.256523] ena 0000:00:06.0: ENA Large LLQ is disabled
[  841.269485] ena 0000:00:06.0: Elastic Network Adapter (ENA) found at mem c0508000, mac addr 02:b3:e5:20:13:93
[  841.280476] ena 0000:00:06.0 eth0: Local page cache is disabled for less than 16 channels

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

[    5.014182] ena 0000:00:05.0 ens5: Local page cache is disabled for less than 16 channels
[  211.078398] pci 0000:00:06.0: [1d0f:ec20] type 00 class 0x020000
[  211.079445] pci 0000:00:06.0: reg 0x10: [mem 0x00000000-0x00003fff]
[  211.080437] pci 0000:00:06.0: reg 0x18: [mem 0x00000000-0x000fffff pref]
[  211.081659] pci 0000:00:06.0: enabling Extended Tags
[  211.083434] pci 0000:00:06.0: BAR 2: assigned [mem 0xc0600000-0xc06fffff pref]
[  211.084450] pci 0000:00:06.0: BAR 0: assigned [mem 0xc0508000-0xc050bfff]
[  211.085467] ena 0000:00:06.0: enabling device (0000 -> 0002)
[  211.094849] ena 0000:00:06.0: ENA device version: 0.10
[  211.095585] ena 0000:00:06.0: ENA controller version: 0.0.1 implementation version 1
[  211.194895] ena 0000:00:06.0: ENA Large LLQ is disabled
[  211.206996] ena 0000:00:06.0: Elastic Network Adapter (ENA) found at mem c0508000, mac addr 02:ea:d6:89:70:79
[  211.264865] ena 0000:00:06.0 ens6: renamed from eth0
[  211.563234] ena 0000:00:06.0 ens6: Local page cache is disabled for less than 16 channels
[  281.259105] vfio-pci 0000:00:06.0: Adding to iommu group 0
[  281.260385] vfio-pci 0000:00:06.0: Adding kernel taint for vfio-noiommu group on device
[  342.947261] vfio-pci 0000:00:06.0: vfio-noiommu device opened by user (tokio-rt-worker:7224)
[  343.707135] vfio-pci 0000:00:06.0: vfio-noiommu device opened by user (tokio-rt-worker:7246)
[  345.457164] vfio-pci 0000:00:06.0: vfio-noiommu device opened by user (tokio-rt-worker:7270)
[  347.007165] vfio-pci 0000:00:06.0: vfio-noiommu device opened by user (tokio-rt-worker:7293)
[  393.615105] vfio-pci 0000:00:06.0: Removing from iommu group 0
[  394.624673] ena 0000:00:06.0: ENA device version: 0.10
[  394.625414] ena 0000:00:06.0: ENA controller version: 0.0.1 implementation version 1
[  394.724670] ena 0000:00:06.0: ENA Large LLQ is disabled
[  394.736794] ena 0000:00:06.0: Elastic Network Adapter (ENA) found at mem c0508000, mac addr 02:ea:d6:89:70:79
[  394.747019] ena 0000:00:06.0 eth0: Local page cache is disabled for less than 16 channels
[  872.957975] vfio-pci 0000:00:06.0: Adding to iommu group 0
[  872.959239] vfio-pci 0000:00:06.0: Adding kernel taint for vfio-noiommu group on device
[ 1023.186675] vfio-pci 0000:00:06.0: vfio-noiommu device opened by user (tokio-rt-worker:41638)
[ 1069.176533] vfio-pci 0000:00:06.0: vfio-noiommu device opened by user (echo:44161)

@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

@gspivey

gspivey commented Mar 12, 2026

Copy link
Copy Markdown
Owner Author

Instrumentation Metrics

Integration Tests: ✅ All Passed (Run #22986576346)

  • tier1-dpdk-echo: 4/4 passed
  • tier2-kernel-interop: 4/4 passed
  • tier3-iperf-sends: 1/1 passed
  • tier3-our-app-sends: 1/1 passed

Phase 1 Implementation Summary

New module dpdk-udp/src/perf.rs (477 lines):

Component Description Hot-path cost
PerfCounters 22 AtomicU64 counters, #[repr(align(64))] fetch_add(1, Relaxed) per event — ~1ns
LatencySampler 1024-slot AtomicU64 ring, 1:1000 sampling ~20ns per sampled packet (Instant::now)
PerfReporter Background thread, configurable interval Zero hot-path cost
PerfSnapshot Programmatic API On-demand only

Counters wired into hot paths:

Path Counters
send_to_addr tx_packets, tx_bytes, tx_failures, tx_ring_enqueue_fail, arp_cache_hits/misses
recv_from_inline rx_bursts, rx_burst_sum, latency sampling
process_frame_zerocopy rx_packets, rx_bytes, rx_arp_handled, rx_icmp_handled, rx_drops_parse_fail
rx_loop (multi-core) rx_bursts, rx_burst_sum, rx_arp_handled, rx_icmp_handled, rx_drops_ring_full
worker_loop (multi-core) worker_packets_processed, worker_idle_polls, rx_packets, rx_bytes, app_ring_enqueue_fail

Echo app: --perf-interval <seconds> enables structured [PERF] output to stderr.

Unit tests: 12 tests covering concurrent counters, percentile accuracy, reporter lifecycle.

Performance test run: https://github.com/gspivey/dpdk-stdlib-rust/actions/runs/22987432396

@github-actions

Copy link
Copy Markdown

[Perf] Stage: Instances Ready

  • TRex: i-04d627a4d6bc7332b (10.0.1.197)
  • DUT: i-0b93c68fa07dd2965 (10.0.1.244)

@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:ea:df:eb:81:b9
  • RX: 0000:00:07.0 MAC: 02:7c:7d:26:f2:5b
  • Gateway MAC: 02:af:b8:08:b2:dd
    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-0b93c68fa07dd2965 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:ea:df:eb:81:b9
  Port 1: 02:7c:7d:26:f2:5b
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.197 -> Dst: 10.0.1.244 (MAC: 02:af:b8:08:b2:dd)
Packet sizes: [64, 512, 1400]
Rate steps (target PPS): [70000, 140000, 350000, 700000]
Duration per step: 30s
Source MAC: 02:ea:df:eb:81:b9

--- Packet size: 64B ---
  Target: 70,000 pps ... TX: 70,000 pps, RX: 68,993 pps, Drop: 1.4393%, Lat avg: 431.0 us
  Target: 140,000 pps ... TX: 140,000 pps, RX: 138,946 pps, Drop: 0.7531%, Lat avg: 0.0 us
  Target: 350,000 pps ... TX: 350,000 pps, RX: 324,830 pps, Drop: 7.1915%, Lat avg: 0.0 us
  Target: 700,000 pps ... TX: 700,000 pps, RX: 321,455 pps, Drop: 54.0779%, Lat avg: 0.0 us

--- Packet size: 512B ---
  Target: 70,000 pps ... TX: 70,000 pps, RX: 68,964 pps, Drop: 1.48%, Lat avg: 522.0 us
  Target: 140,000 pps ... TX: 140,000 pps, RX: 138,975 pps, Drop: 0.7322%, Lat avg: 648.0 us
  Target: 350,000 pps ... TX: 350,000 pps, RX: 297,187 pps, Drop: 15.0895%, Lat avg: 0.0 us
  Target: 700,000 pps ... TX: 700,000 pps, RX: 294,884 pps, Drop: 57.8737%, Lat avg: 1345.0 us

--- Packet size: 1400B ---
  Target: 70,000 pps ... TX: 70,000 pps, RX: 68,977 pps, Drop: 1.4621%, Lat avg: 535.0 us
  Target: 140,000 pps ... TX: 140,000 pps, RX: 138,874 pps, Drop: 0.8041%, Lat avg: 0.0 us
  Target: 350,000 pps ... TX: 350,000 pps, RX: 280,864 pps, Drop: 19.7532%, Lat avg: 547.0 us
  Target: 700,000 pps ... TX: 700,000 pps, RX: 282,075 pps, Drop: 59.7036%, 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:ea:df:eb:81:b9
  Port 1: 02:7c:7d:26:f2:5b
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.197 -> Dst: 10.0.1.244 (MAC: 02:af:b8:08:b2:dd)
Packet sizes: [64, 512, 1400]
Rate steps (target PPS): [70000, 140000, 350000, 700000]
Duration per step: 30s
Source MAC: 02:ea:df:eb:81:b9

--- Packet size: 64B ---
  Target: 70,000 pps ... TX: 70,000 pps, RX: 68,999 pps, Drop: 1.4306%, Lat avg: 489.0 us
  Target: 140,000 pps ... TX: 140,000 pps, RX: 138,942 pps, Drop: 0.756%, Lat avg: 0.0 us
  Target: 350,000 pps ... TX: 350,000 pps, RX: 328,923 pps, Drop: 6.0219%, Lat avg: 0.0 us
  Target: 700,000 pps ... TX: 700,000 pps, RX: 328,662 pps, Drop: 53.0483%, Lat avg: 0.0 us

--- Packet size: 512B ---
  Target: 70,000 pps ... TX: 70,000 pps, RX: 68,974 pps, Drop: 1.466%, Lat avg: 0.0 us
  Target: 140,000 pps ... TX: 140,000 pps, RX: 138,985 pps, Drop: 0.7249%, Lat avg: 0.0 us
  Target: 350,000 pps ... TX: 350,000 pps, RX: 267,988 pps, Drop: 23.432%, Lat avg: 0.0 us
  Target: 700,000 pps ... TX: 700,000 pps, RX: 298,479 pps, Drop: 57.3602%, Lat avg: 0.0 us

--- Packet size: 1400B ---
  Target: 70,000 pps ... TX: 70,000 pps, RX: 68,996 pps, Drop: 1.4341%, Lat avg: 0.0 us
  Target: 140,000 pps ... TX: 140,000 pps, RX: 138,898 pps, Drop: 0.7871%, Lat avg: 0.0 us
  Target: 350,000 pps ... TX: 350,000 pps, RX: 273,085 pps, Drop: 21.9758%, Lat avg: 0.0 us
  Target: 700,000 pps ... TX: 700,000 pps, RX: 275,944 pps, Drop: 60.5794%, 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:ea:df:eb:81:b9
  Port 1: 02:7c:7d:26:f2:5b
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.197 -> Dst: 10.0.1.244 (MAC: 02:af:b8:08:b2:dd)
Packet sizes: [64, 512, 1400]
Rate steps (target PPS): [70000, 140000, 350000, 700000]
Duration per step: 30s
Source MAC: 02:ea:df:eb:81:b9

--- Packet size: 64B ---
  Target: 70,000 pps ... TX: 70,000 pps, RX: 70,000 pps, Drop: 0.0%, Lat avg: 217.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: 350,000 pps, Drop: 0.0%, Lat avg: 253.0 us
  Target: 700,000 pps ... TX: 700,000 pps, RX: 634,487 pps, Drop: 9.3589%, Lat avg: 918.0 us

--- Packet size: 512B ---
  Target: 70,000 pps ... TX: 70,000 pps, RX: 69,996 pps, Drop: 0.0055%, Lat avg: 284.0 us
  Target: 140,000 pps ... TX: 140,000 pps, RX: 140,000 pps, Drop: 0.0%, Lat avg: 206.0 us
  Target: 350,000 pps ... TX: 350,000 pps, RX: 349,998 pps, Drop: 0.0004%, Lat avg: 233.0 us
  Target: 700,000 pps ... TX: 700,000 pps, RX: 631,317 pps, Drop: 9.8119%, Lat avg: 973.0 us

--- Packet size: 1400B ---
  Target: 70,000 pps ... TX: 70,000 pps, RX: 70,000 pps, Drop: 0.0%, Lat avg: 247.0 us
  Target: 140,000 pps ... TX: 140,000 pps, RX: 140,000 pps, Drop: 0.0%, Lat avg: 191.0 us
  Target: 350,000 pps ... TX: 350,000 pps, RX: 349,474 pps, Drop: 0.1502%, Lat avg: 284.0 us
  Target: 700,000 pps ... TX: 700,000 pps, RX: 446,997 pps, Drop: 36.1433%, Lat avg: 4057.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:ea:df:eb:81:b9
  Port 1: 02:7c:7d:26:f2:5b
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.197 -> Dst: 10.0.1.244 (MAC: 02:af:b8:08:b2:dd)
Packet sizes: [64, 512, 1400]
Rate steps (target PPS): [70000, 140000, 350000, 700000]
Duration per step: 30s
Source MAC: 02:ea:df:eb:81:b9

--- Packet size: 64B ---
  Target: 70,000 pps ... TX: 70,000 pps, RX: 70,000 pps, Drop: 0.0%, Lat avg: 710.0 us
  Target: 140,000 pps ... TX: 140,000 pps, RX: 140,000 pps, Drop: 0.0%, Lat avg: 770.0 us
  Target: 350,000 pps ... TX: 350,000 pps, RX: 317,769 pps, Drop: 9.2088%, Lat avg: 4071.0 us
  Target: 700,000 pps ... TX: 700,000 pps, RX: 320,954 pps, Drop: 54.1495%, Lat avg: 4362.0 us

--- Packet size: 512B ---
  Target: 70,000 pps ... TX: 70,000 pps, RX: 69,932 pps, Drop: 0.0977%, Lat avg: 754.0 us
  Target: 140,000 pps ... TX: 140,000 pps, RX: 140,000 pps, Drop: 0.0%, Lat avg: 780.0 us
  Target: 350,000 pps ... TX: 350,000 pps, RX: 225,164 pps, Drop: 35.6675%, Lat avg: 21846.0 us
  Target: 700,000 pps ... TX: 700,000 pps, RX: 224,422 pps, Drop: 67.9397%, Lat avg: 21049.0 us

--- Packet size: 1400B ---
  Target: 70,000 pps ... TX: 70,000 pps, RX: 70,000 pps, Drop: 0.0%, Lat avg: 816.0 us
  Target: 140,000 pps ... TX: 140,000 pps, RX: 100,751 pps, Drop: 28.0349%, Lat avg: 45565.0 us
  Target: 350,000 pps ... TX: 350,000 pps, RX: 85,699 pps, Drop: 75.5146%, Lat avg: 64856.0 us
  Target: 700,000 pps ... TX: 700,000 pps, RX: 85,025 pps, Drop: 87.8536%, Lat avg: 72759.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:ea:df:eb:81:b9
  Port 1: 02:7c:7d:26:f2:5b
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.197 -> Dst: 10.0.1.244 (MAC: 02:af:b8:08:b2:dd)
Packet sizes: [64, 512, 1400]
Rate steps (target PPS): [70000, 140000, 350000, 700000]
Duration per step: 30s
Source MAC: 02:ea:df:eb:81:b9

--- Packet size: 64B ---
  Target: 70,000 pps ... TX: 70,000 pps, RX: 69,971 pps, Drop: 0.0418%, Lat avg: 252.0 us
  Target: 140,000 pps ... TX: 140,000 pps, RX: 140,000 pps, Drop: 0.0%, Lat avg: 145.0 us
  Target: 350,000 pps ... TX: 350,000 pps, RX: 349,822 pps, Drop: 0.0507%, Lat avg: 140.0 us
  Target: 700,000 pps ... TX: 700,000 pps, RX: 638,935 pps, Drop: 8.7235%, Lat avg: 741.0 us

--- Packet size: 512B ---
  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: 139.0 us
  Target: 350,000 pps ... TX: 350,000 pps, RX: 350,000 pps, Drop: 0.0%, Lat avg: 113.0 us
  Target: 700,000 pps ... TX: 700,000 pps, RX: 636,185 pps, Drop: 9.1164%, Lat avg: 763.0 us

--- Packet size: 1400B ---
  Target: 70,000 pps ... TX: 70,000 pps, RX: 70,000 pps, Drop: 0.0%, Lat avg: 91.0 us
  Target: 140,000 pps ... TX: 140,000 pps, RX: 140,000 pps, Drop: 0.0%, Lat avg: 160.0 us
  Target: 350,000 pps ... TX: 350,000 pps, RX: 350,000 pps, Drop: 0.0%, Lat avg: 161.0 us
  Target: 700,000 pps ... TX: 700,000 pps, RX: 447,794 pps, Drop: 36.0295%, Lat avg: 3750.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: 95736131   TX-errors: 0          TX-bytes:  53730868030

  Throughput (since last show)
  Rx-pps:       447729          Rx-bps:   5000243040
  Tx-pps:       447729          Tx-bps:   5000245272
  ############################################################################
�[2J�[1;1H
Port statistics ====================================
  ######################## NIC statistics for port 0  ########################
  RX-packets: 100213731  RX-missed: 0          RX-bytes:  59981597630
  RX-errors: 323365
  RX-nombuf:  0         
  TX-packets: 100213724  TX-errors: 0          TX-bytes:  59981587858

  Throughput (since last show)
  Rx-pps:       447730          Rx-bps:   5000250376
  Tx-pps:       447729          Tx-bps:   5000247024
  ############################################################################
�[2J�[1;1H
Port statistics ====================================
  ######################## NIC statistics for port 0  ########################
  RX-packets: 102085237  RX-missed: 0          RX-bytes:  62594220006
  RX-errors: 325056
  RX-nombuf:  0         
  TX-packets: 102085237  TX-errors: 0          TX-bytes:  62594220006

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

@github-actions

Copy link
Copy Markdown

[Perf] Stage: Results

[05:59:13] INFO Generating markdown summary...

Performance Test Results — c5n.2xlarge

Commit: b1e00ee2
Timestamp: 2026-03-12T05:59:13.753326+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% 91.0 326.0 784.0 784.0
native-dpdk 140,000 140,000 140,000 0.00% 160.0 360.0 1568.0 1568.0
native-dpdk 350,000 350,000 350,000 0.00% 161.0 453.0 3920.0 3920.0
native-dpdk 700,000 700,000 447,794 36.03% 3750.0 3930.0 7840.0 5015.3
rust-dpdk 70,000 70,000 70,000 0.00% 247.0 2806.0 784.0 784.0
rust-dpdk 140,000 140,000 140,000 0.00% 191.0 2359.0 1568.0 1568.0
rust-dpdk 350,000 350,000 349,474 0.15% 284.0 3385.0 3920.0 3914.1
rust-dpdk 700,000 700,000 446,997 36.14% 4057.0 5908.0 7840.0 5006.4
rust-dpdk-multicore 70,000 70,000 70,000 0.00% 816.0 1765.0 784.0 784.0
rust-dpdk-multicore 140,000 140,000 100,751 28.03% 45565.0 149282.0 1568.0 1128.4
rust-dpdk-multicore 350,000 350,000 85,699 75.51% 64856.0 166928.0 3920.0 959.8
rust-dpdk-multicore 700,000 700,000 85,025 87.85% 72759.0 162408.0 7840.0 952.3
rust-stdlib 70,000 70,000 68,977 1.46% 535.0 0.0 784.0 772.5
rust-stdlib 140,000 140,000 138,874 0.80% 0.0 0.0 1568.0 1555.4
rust-stdlib 350,000 350,000 280,864 19.75% 547.0 0.0 3920.0 3145.7
rust-stdlib 700,000 700,000 282,075 59.70% 0.0 0.0 7840.0 3159.2
plain-rust 70,000 70,000 68,996 1.43% 0.0 0.0 784.0 772.8
plain-rust 140,000 140,000 138,898 0.79% 0.0 0.0 1568.0 1555.7
plain-rust 350,000 350,000 273,085 21.98% 0.0 0.0 3920.0 3058.6
plain-rust 700,000 700,000 275,944 60.58% 0.0 0.0 7840.0 3090.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% 125.0 309.0 286.7 286.7
native-dpdk 140,000 140,000 140,000 0.00% 139.0 378.0 573.4 573.4
native-dpdk 350,000 350,000 350,000 0.00% 113.0 412.0 1433.6 1433.6
native-dpdk 700,000 700,000 636,185 9.12% 763.0 1798.0 2867.2 2605.8
rust-dpdk 70,000 70,000 69,996 0.01% 284.0 14508.0 286.7 286.7
rust-dpdk 140,000 140,000 140,000 0.00% 206.0 2391.0 573.4 573.4
rust-dpdk 350,000 350,000 349,998 0.00% 233.0 2709.0 1433.6 1433.6
rust-dpdk 700,000 700,000 631,317 9.81% 973.0 2358.0 2867.2 2585.9
rust-dpdk-multicore 70,000 70,000 69,932 0.10% 754.0 63884.0 286.7 286.4
rust-dpdk-multicore 140,000 140,000 140,000 0.00% 780.0 1617.0 573.4 573.4
rust-dpdk-multicore 350,000 350,000 225,164 35.67% 21846.0 125540.0 1433.6 922.3
rust-dpdk-multicore 700,000 700,000 224,422 67.94% 21049.0 30586.0 2867.2 919.2
rust-stdlib 70,000 70,000 68,964 1.48% 522.0 0.0 286.7 282.5
rust-stdlib 140,000 140,000 138,975 0.73% 648.0 0.0 573.4 569.2
rust-stdlib 350,000 350,000 297,187 15.09% 0.0 0.0 1433.6 1217.3
rust-stdlib 700,000 700,000 294,884 57.87% 1345.0 0.0 2867.2 1207.8
plain-rust 70,000 70,000 68,974 1.47% 0.0 0.0 286.7 282.5
plain-rust 140,000 140,000 138,985 0.72% 0.0 0.0 573.4 569.3
plain-rust 350,000 350,000 267,988 23.43% 0.0 0.0 1433.6 1097.7
plain-rust 700,000 700,000 298,479 57.36% 0.0 0.0 2867.2 1222.6

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 69,971 0.04% 252.0 64247.0 35.8 35.8
native-dpdk 140,000 140,000 140,000 0.00% 145.0 405.0 71.7 71.7
native-dpdk 350,000 350,000 349,822 0.05% 140.0 4328.0 179.2 179.1
native-dpdk 700,000 700,000 638,935 8.72% 741.0 1187.0 358.4 327.1
rust-dpdk 70,000 70,000 70,000 0.00% 217.0 2503.0 35.8 35.8
rust-dpdk 140,000 140,000 140,000 0.00% 235.0 3214.0 71.7 71.7
rust-dpdk 350,000 350,000 350,000 0.00% 253.0 1634.0 179.2 179.2
rust-dpdk 700,000 700,000 634,487 9.36% 918.0 3965.0 358.4 324.9
rust-dpdk-multicore 70,000 70,000 70,000 0.00% 710.0 1345.0 35.8 35.8
rust-dpdk-multicore 140,000 140,000 140,000 0.00% 770.0 1570.0 71.7 71.7
rust-dpdk-multicore 350,000 350,000 317,769 9.21% 4071.0 7180.0 179.2 162.7
rust-dpdk-multicore 700,000 700,000 320,954 54.15% 4362.0 8879.0 358.4 164.3
rust-stdlib 70,000 70,000 68,993 1.44% 431.0 0.0 35.8 35.3
rust-stdlib 140,000 140,000 138,946 0.75% 0.0 0.0 71.7 71.1
rust-stdlib 350,000 350,000 324,830 7.19% 0.0 0.0 179.2 166.3
rust-stdlib 700,000 700,000 321,455 54.08% 0.0 0.0 358.4 164.6
plain-rust 70,000 70,000 68,999 1.43% 489.0 0.0 35.8 35.3
plain-rust 140,000 140,000 138,942 0.76% 0.0 0.0 71.7 71.1
plain-rust 350,000 350,000 328,923 6.02% 0.0 0.0 179.2 168.4
plain-rust 700,000 700,000 328,662 53.05% 0.0 0.0 358.4 168.3

Full results artifact

@gspivey

gspivey commented Mar 12, 2026

Copy link
Copy Markdown
Owner Author

Performance Test Results (Run #22987432396) — All Passed ✅

Key Results: rust-dpdk single-core (1400B) — with instrumentation enabled

Target PPS RX PPS Drop % Lat Avg (us) Lat Max (us)
70,000 70,000 0.00% 247 2,806
140,000 140,000 0.00% 191 2,359
350,000 349,474 0.15% 284 3,385
700,000 446,997 36.14% 4,057 5,908

Comparison: native-dpdk baseline (1400B)

Target PPS RX PPS Drop % Lat Avg (us) Lat Max (us)
70,000 70,000 0.00% 91 326
140,000 140,000 0.00% 160 360
350,000 350,000 0.00% 161 453
700,000 447,794 36.03% 3,750 3,930

rust-dpdk-multicore (1400B) — confirms known performance gap (Phase 2/3 target)

Target PPS RX PPS Drop % Lat Avg (us) Lat Max (us)
70,000 70,000 0.00% 816 1,765
140,000 100,751 28.03% 45,565 149,282
350,000 85,699 75.51% 64,856 166,928
700,000 85,025 87.85% 72,759 162,408

Analysis

Single-core (rust-dpdk) with instrumentation: Performance is consistent with pre-instrumentation baseline. At 350K PPS the drop rate is 0.15% with 284us avg latency — instrumentation overhead is not measurable at this scale. The ~2x latency gap vs native-dpdk (284us vs 161us) is the pre-existing gap that Phase 2 (mutex elimination, ARP fast-path) will address.

Multi-core: Confirms the severe degradation documented in requirements (75% drop at 350K PPS, 166ms max latency). This is the target for Phase 3 (slab pool, per-worker SPSC, worker-direct TX).

No regressions introduced by instrumentation.

- Add `perf-counters` cargo feature (default=on) to dpdk-udp: all hot-path
  counter increments compile to no-ops with `--no-default-features`, eliminating
  instrumentation overhead for latency-critical deployments
- Fix TX ring full backpressure in multicore mode:
  - Increase ring capacity from 4096 to 16384 slots
  - Increase TX drain batch from 32 to 256 frames per cycle
  - Add second TX drain pass after RX processing to halve echo latency
- Auto-enable perf reporting (10s interval) when multicore pipeline starts
- Pass --perf-interval 10 to multicore echo server in perf tests
- Show last 20 lines of app logs inline in CI PR comments (not hidden in
  collapsible), with full 200-line log in expandable section below

https://claude.ai/code/session_016N4yPU5RzaxmK1Vtu4Hr6y
@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:93:c5:54:af:83
  Port 1: 02:fb:51:03:7d:31
PREFLIGHT_OK

@github-actions

Copy link
Copy Markdown

[Perf] Benchmark Diag: native-dpdk result

SSM exit: 1

Output (last 30 lines)

@github-actions

Copy link
Copy Markdown

[Perf] Diag: testpmd log

testpmd output (last 30 lines)
(failed)

@github-actions

Copy link
Copy Markdown

[Perf] Stage: Results

[15:11:12] INFO Generating markdown summary...

Performance Test Results — c5n.2xlarge

Commit: 148d2410
Timestamp: 2026-03-12T15:11:12.956457+00:00

1400B packets

Config Target PPS TX pps RX pps Drop % Lat Avg (us) Lat Max (us) TX Mbps RX Mbps
rust-dpdk 70,000 70,000 70,000 0.00% 215.0 2028.0 784.0 784.0
rust-dpdk 140,000 140,000 139,986 0.01% 260.0 9720.0 1568.0 1567.8
rust-dpdk 350,000 350,000 349,980 0.01% 283.0 2952.0 3920.0 3919.8
rust-dpdk 700,000 700,000 447,699 36.04% 3963.0 5363.0 7840.0 5014.2
rust-dpdk-multicore 70,000 70,000 70,000 0.00% 823.0 1520.0 784.0 784.0
rust-dpdk-multicore 140,000 140,000 136,900 2.21% 3461.0 109904.0 1568.0 1533.3
rust-dpdk-multicore 350,000 350,000 125,019 64.28% 40955.0 188535.0 3920.0 1400.2
rust-dpdk-multicore 700,000 700,000 121,763 82.61% 52819.0 165827.0 7840.0 1363.8
rust-stdlib 70,000 70,000 68,973 1.47% 0.0 0.0 784.0 772.5
rust-stdlib 140,000 140,000 138,967 0.74% 0.0 0.0 1568.0 1556.4
rust-stdlib 350,000 350,000 285,543 18.42% 617.0 0.0 3920.0 3198.1
rust-stdlib 700,000 700,000 286,619 59.05% 0.0 0.0 7840.0 3210.1
plain-rust 70,000 70,000 68,996 1.43% 0.0 0.0 784.0 772.8
plain-rust 140,000 140,000 138,985 0.73% 383.0 0.0 1568.0 1556.6
plain-rust 350,000 350,000 265,377 24.18% 0.0 0.0 3920.0 2972.2
plain-rust 700,000 700,000 264,977 62.15% 0.0 0.0 7840.0 2967.7

512B packets

Config Target PPS TX pps RX pps Drop % Lat Avg (us) Lat Max (us) TX Mbps RX Mbps
rust-dpdk 70,000 70,000 70,000 0.00% 240.0 10126.0 286.7 286.7
rust-dpdk 140,000 140,000 140,000 0.00% 248.0 2440.0 573.4 573.4
rust-dpdk 350,000 350,000 350,000 0.00% 278.0 2054.0 1433.6 1433.6
rust-dpdk 700,000 700,000 609,591 12.92% 1131.0 4420.0 2867.2 2496.9
rust-dpdk-multicore 70,000 70,000 70,000 0.00% 777.0 1284.0 286.7 286.7
rust-dpdk-multicore 140,000 140,000 140,000 0.00% 821.0 1778.0 573.4 573.4
rust-dpdk-multicore 350,000 350,000 159,028 54.56% 32047.0 152193.0 1433.6 651.4
rust-dpdk-multicore 700,000 700,000 165,231 76.40% 45265.0 169395.0 2867.2 676.8
rust-stdlib 70,000 70,000 68,991 1.44% 0.0 0.0 286.7 282.6
rust-stdlib 140,000 140,000 138,978 0.73% 0.0 0.0 573.4 569.3
rust-stdlib 350,000 350,000 297,414 15.02% 0.0 0.0 1433.6 1218.2
rust-stdlib 700,000 700,000 297,374 57.52% 0.0 0.0 2867.2 1218.0
plain-rust 70,000 70,000 69,000 1.43% 482.0 0.0 286.7 282.6
plain-rust 140,000 140,000 138,988 0.72% 613.0 0.0 573.4 569.3
plain-rust 350,000 350,000 248,188 29.09% 0.0 0.0 1433.6 1016.6
plain-rust 700,000 700,000 246,922 64.73% 0.0 0.0 2867.2 1011.4

64B packets

Config Target PPS TX pps RX pps Drop % Lat Avg (us) Lat Max (us) TX Mbps RX Mbps
rust-dpdk 70,000 70,000 70,000 0.00% 200.0 3386.0 35.8 35.8
rust-dpdk 140,000 140,000 140,000 0.00% 246.0 2539.0 71.7 71.7
rust-dpdk 350,000 350,000 350,000 0.00% 284.0 2657.0 179.2 179.2
rust-dpdk 700,000 700,000 637,643 8.91% 922.0 2790.0 358.4 326.5
rust-dpdk-multicore 70,000 70,000 70,000 0.00% 755.0 1224.0 35.8 35.8
rust-dpdk-multicore 140,000 140,000 140,000 0.00% 782.0 1620.0 71.7 71.7
rust-dpdk-multicore 350,000 350,000 343,684 1.80% 3166.0 6974.0 179.2 176.0
rust-dpdk-multicore 700,000 700,000 345,553 50.64% 3514.0 5233.0 358.4 176.9
rust-stdlib 70,000 70,000 68,998 1.43% 514.0 0.0 35.8 35.3
rust-stdlib 140,000 140,000 138,929 0.77% 324.0 0.0 71.7 71.1
rust-stdlib 350,000 350,000 322,043 7.99% 0.0 0.0 179.2 164.9
rust-stdlib 700,000 700,000 322,035 54.00% 0.0 0.0 358.4 164.9
plain-rust 70,000 70,000 68,999 1.43% 0.0 0.0 35.8 35.3
plain-rust 140,000 140,000 138,992 0.72% 395.0 0.0 71.7 71.2
plain-rust 350,000 350,000 261,891 25.17% 0.0 0.0 179.2 134.1
plain-rust 700,000 700,000 263,638 62.34% 0.0 0.0 358.4 135.0

Failed Configs

  • native-dpdk

Full results artifact

@github-actions

Copy link
Copy Markdown

Performance Test Failure (Run 23004302078)

Branch: claude/performance-optimization-phase-one-7mAY5 | Commit: 148d2410

failure-summary.json

{
  "failed_step": "perf-test",
  "error": "Script exited with code 1",
  "exit_code": 2,
  "timestamp": "2026-03-12T15:12:06.671314Z",
  "trex_instance_id": "i-0508af5e670703c34",
  "dut_instance_id": "i-0b73305cbeed90a2c",
  "commit": "148d2410a310ac0b118c165c81a3f944f6df404c",
  "run_url": "https://github.com/gspivey/dpdk-stdlib-rust/actions/runs/23004302078"
}```

<details><summary>dut-environment.txt</summary>

=== System Info ===
Hostname: ip-10-0-1-31.ec2.internal
Instance type: c5n.2xlarge
AZ: us-east-1a
Kernel: 6.1.163-186.299.amzn2023.x86_64
CPUs: 8
Memory: 20Gi
Hugepages: HugePages_Total: 1024
=== PCI Devices ===
00:05.0 Ethernet controller: Amazon.com, Inc. Elastic Network Adapter (ENA)
00:06.0 Ethernet controller: Amazon.com, Inc. Elastic Network Adapter (ENA)
=== DPDK Bind Status ===

Network devices using kernel driver

0000:00:05.0 'Elastic Network Adapter (ENA) ec20' if=ens5 drv=ena unused=vfio-pci Active
0000:00:06.0 'Elastic Network Adapter (ENA) ec20' if=ens6 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

=== Network Interfaces ===
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:be:2e:5a:da:27 brd ff:ff:ff:ff:ff:ff
altname enp0s5
altname eni-01973d09dba5a2125
altname device-number-0.0
inet 10.0.1.31/24 metric 512 brd 10.0.1.255 scope global dynamic ens5
valid_lft 3226sec preferred_lft 3226sec
inet6 fe80::be:2eff:fe5a:da27/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:de:e3:7d:7f 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
4: ens6: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 qdisc mq state UP group default qlen 1000
link/ether 02:d6:4c:12:ca:d7 brd ff:ff:ff:ff:ff:ff
altname enp0s6
altname eni-0ee25b777120a96ba
altname device-number-1.0
inet 10.0.1.218/24 metric 513 brd 10.0.1.255 scope global dynamic ens6
valid_lft 3557sec preferred_lft 3557sec
inet6 fe80::d6:4cff:fe12:cad7/64 scope link proto kernel_ll
valid_lft forever preferred_lft forever
=== Loaded Modules ===
ena 200704 0
vfio_pci 16384 0
vfio_pci_core 81920 1 vfio_pci
vfio_virqfd 16384 1 vfio_pci_core
vfio_iommu_type1 49152 0
vfio 49152 3 vfio_pci_core,vfio_iommu_type1,vfio_pci
irqbypass 16384 1 vfio_pci_core
uio 32768 0
=== NUMA Info ===
numactl not available

</details>

<details><summary>trex-environment.txt</summary>

=== System Info ===
Hostname: ip-10-0-1-17.ec2.internal
Instance type: c5n.2xlarge
AZ: us-east-1a
Kernel: 6.1.163-186.299.amzn2023.x86_64
CPUs: 8
Memory: 20Gi
Hugepages: HugePages_Total: 1024
=== PCI Devices ===
00:05.0 Ethernet controller: Amazon.com, Inc. Elastic Network Adapter (ENA)
00:06.0 Ethernet controller: Amazon.com, Inc. Elastic Network Adapter (ENA)
00:07.0 Ethernet controller: Amazon.com, Inc. Elastic Network Adapter (ENA)
=== DPDK Bind Status ===
devbind not available
=== Network Interfaces ===
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:2d:4d:ac:7b:71 brd ff:ff:ff:ff:ff:ff
altname enp0s5
altname eni-0d18cace6fae47663
altname device-number-0.0
inet 10.0.1.17/24 metric 512 brd 10.0.1.255 scope global dynamic ens5
valid_lft 3231sec preferred_lft 3231sec
inet6 fe80::2d:4dff:feac:7b71/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:3a:8d:b6:95 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
4: ens7: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 qdisc mq state UP group default qlen 1000
link/ether 02:fb:51:03:7d:31 brd ff:ff:ff:ff:ff:ff
altname enp0s7
altname eni-060f4be8e185bd1a5
altname device-number-2.0
inet 10.0.1.205/24 metric 514 brd 10.0.1.255 scope global dynamic ens7
valid_lft 3520sec preferred_lft 3520sec
inet6 fe80::fb:51ff:fe03:7d31/64 scope link proto kernel_ll
valid_lft forever preferred_lft forever
5: ens6: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 qdisc mq state UP group default qlen 1000
link/ether 02:93:c5:54:af:83 brd ff:ff:ff:ff:ff:ff
altname enp0s6
altname eni-0480404789e9d1d19
altname device-number-1.0
inet 10.0.1.74/24 metric 513 brd 10.0.1.255 scope global dynamic ens6
valid_lft 3520sec preferred_lft 3520sec
inet6 fe80::93:c5ff:fe54:af83/64 scope link proto kernel_ll
valid_lft forever preferred_lft forever
=== Loaded Modules ===
ena 200704 0
vfio_pci 16384 0
vfio_pci_core 81920 1 vfio_pci
vfio_virqfd 16384 1 vfio_pci_core
vfio_iommu_type1 49152 0
vfio 49152 3 vfio_pci_core,vfio_iommu_type1,vfio_pci
irqbypass 16384 1 vfio_pci_core
=== NUMA Info ===
available: 1 nodes (0)
node 0 cpus: 0 1 2 3 4 5 6 7
node 0 size: 20534 MB
node 0 free: 17303 MB
node distances:
node 0
0: 10

</details>

### Application Logs (last 20 lines)

**dut-native-dpdk-app.log**

(failed)

**dut-plain-rust-app.log**

plain-echo listening on 10.0.1.218:9000

**dut-rust-dpdk-app.log**

Send error: tx queue full
Send error: tx queue full
Send error: tx queue full
Send error: tx queue full
Send error: tx queue full
Send error: tx queue full
Send error: tx queue full
Send error: tx queue full
Send error: tx queue full
Send error: tx queue full
Send error: tx queue full
Send error: tx queue full
Send error: tx queue full
Send error: tx queue full
Send error: tx queue full
Send error: tx queue full
Send error: tx queue full
Send error: tx queue full
Send error: tx queue full
Send error: tx queue full

**dut-rust-dpdk-multicore-app.log**

Send error: TX ring full
Send error: TX ring full
Send error: TX ring full
Send error: TX ring full
Send error: TX ring full
[PERF] interval=10s rx_pps=111361 rx_bps=419977976 tx_pps=107842 tx_bps=406860406 rx_drops=0 tx_fails=29668 lat_avg_us=0 lat_p50_us=0 lat_p95_us=0 lat_p99_us=0 lat_max_us=0 arp_hits=1108101 arp_misses=0 ring_drops=36682 worker_idle_pct=98.9 burst_avg=5.8
[PERF] interval=10s rx_pps=70003 rx_bps=758268928 tx_pps=69999 tx_bps=758231016 rx_drops=0 tx_fails=0 lat_avg_us=0 lat_p50_us=0 lat_p95_us=0 lat_p99_us=0 lat_max_us=0 arp_hits=700000 arp_misses=0 ring_drops=0 worker_idle_pct=99.3 burst_avg=6.7
[PERF] interval=10s rx_pps=69996 rx_bps=758195017 tx_pps=69999 tx_bps=758232929 rx_drops=0 tx_fails=0 lat_avg_us=0 lat_p50_us=0 lat_p95_us=0 lat_p99_us=0 lat_max_us=0 arp_hits=700000 arp_misses=0 ring_drops=0 worker_idle_pct=99.3 burst_avg=6.3
[PERF] interval=10s rx_pps=69320 rx_bps=750876135 tx_pps=69320 tx_bps=750876135 rx_drops=0 tx_fails=0 lat_avg_us=0 lat_p50_us=0 lat_p95_us=0 lat_p99_us=0 lat_max_us=0 arp_hits=693210 arp_misses=0 ring_drops=0 worker_idle_pct=99.3 burst_avg=6.1
[PERF] interval=10s rx_pps=84453 rx_bps=914799630 tx_pps=84450 tx_bps=914764968 rx_drops=0 tx_fails=0 lat_avg_us=0 lat_p50_us=0 lat_p95_us=0 lat_p99_us=0 lat_max_us=0 arp_hits=844513 arp_misses=0 ring_drops=0 worker_idle_pct=99.2 burst_avg=14.9
[PERF] interval=10s rx_pps=136700 rx_bps=1480736792 tx_pps=136700 tx_bps=1480736792 rx_drops=0 tx_fails=0 lat_avg_us=0 lat_p50_us=0 lat_p95_us=0 lat_p99_us=0 lat_max_us=0 arp_hits=1367018 arp_misses=0 ring_drops=0 worker_idle_pct=98.5 burst_avg=14.4
[PERF] interval=10s rx_pps=137894 rx_bps=1493666758 tx_pps=137897 tx_bps=1493701420 rx_drops=0 tx_fails=0 lat_avg_us=0 lat_p50_us=0 lat_p95_us=0 lat_p99_us=0 lat_max_us=0 arp_hits=1378987 arp_misses=0 ring_drops=0 worker_idle_pct=98.5 burst_avg=14.7
[PERF] interval=10s rx_pps=78032 rx_bps=845243246 tx_pps=77978 tx_bps=844659409 rx_drops=0 tx_fails=0 lat_avg_us=0 lat_p50_us=0 lat_p95_us=0 lat_p99_us=0 lat_max_us=0 arp_hits=779792 arp_misses=0 ring_drops=0 worker_idle_pct=99.2 burst_avg=11.8
[PERF] interval=10s rx_pps=128956 rx_bps=1396846100 tx_pps=129009 tx_bps=1397425604 rx_drops=0 tx_fails=0 lat_avg_us=0 lat_p50_us=0 lat_p95_us=0 lat_p99_us=0 lat_max_us=0 arp_hits=1290105 arp_misses=0 ring_drops=0 worker_idle_pct=98.5 burst_avg=10.2
[PERF] interval=10s rx_pps=134199 rx_bps=1453638566 tx_pps=134199 tx_bps=1453642899 rx_drops=0 tx_fails=0 lat_avg_us=0 lat_p50_us=0 lat_p95_us=0 lat_p99_us=0 lat_max_us=0 arp_hits=1342005 arp_misses=0 ring_drops=0 worker_idle_pct=98.4 burst_avg=9.9
[PERF] interval=10s rx_pps=103832 rx_bps=1124710949 tx_pps=103832 tx_bps=1124710949 rx_drops=0 tx_fails=0 lat_avg_us=0 lat_p50_us=0 lat_p95_us=0 lat_p99_us=0 lat_max_us=0 arp_hits=1038335 arp_misses=0 ring_drops=0 worker_idle_pct=98.8 burst_avg=8.6
[PERF] interval=10s rx_pps=104762 rx_bps=1134786380 tx_pps=104754 tx_bps=1134699725 rx_drops=0 tx_fails=0 lat_avg_us=0 lat_p50_us=0 lat_p95_us=0 lat_p99_us=0 lat_max_us=0 arp_hits=1047557 arp_misses=0 ring_drops=0 worker_idle_pct=98.8 burst_avg=9.1
[PERF] interval=10s rx_pps=131733 rx_bps=1426926448 tx_pps=131741 tx_bps=1427013103 rx_drops=0 tx_fails=0 lat_avg_us=0 lat_p50_us=0 lat_p95_us=0 lat_p99_us=0 lat_max_us=0 arp_hits=1317421 arp_misses=0 ring_drops=0 worker_idle_pct=98.4 burst_avg=8.6
[PERF] interval=10s rx_pps=133142 rx_bps=1442194786 tx_pps=133142 tx_bps=1442194786 rx_drops=0 tx_fails=0 lat_avg_us=0 lat_p50_us=0 lat_p95_us=0 lat_p99_us=0 lat_max_us=0 arp_hits=1331436 arp_misses=0 ring_drops=0 worker_idle_pct=98.4 burst_avg=9.0
[PERF] interval=10s rx_pps=28039 rx_bps=303721363 tx_pps=28039 tx_bps=303721363 rx_drops=0 tx_fails=0 lat_avg_us=0 lat_p50_us=0 lat_p95_us=0 lat_p99_us=0 lat_max_us=0 arp_hits=280396 arp_misses=0 ring_drops=0 worker_idle_pct=99.7 burst_avg=9.8

**dut-rust-stdlib-app.log**

🚀 DPDK-STDLIB Echo Server
Binding to 10.0.1.218:9000
EAL: Detected CPU lcores: 8
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 failed (Port init failed: Invalid port ID: 0), falling back to standard networking
Using standard networking
✅ Socket created successfully!
📡 Local address: 10.0.1.218:9000
🔄 Echo server running... (Ctrl+C to stop)


<details><summary>Full Application Logs (last 200 lines each)</summary>

#### dut-native-dpdk-app.log

(failed)

#### dut-plain-rust-app.log

plain-echo listening on 10.0.1.218:9000

#### dut-rust-dpdk-app.log

Send error: tx queue full
Send error: tx queue full
Send error: tx queue full
Send error: tx queue full
Send error: tx queue full
Send error: tx queue full
Send error: tx queue full
Send error: tx queue full
Send error: tx queue full
Send error: tx queue full
Send error: tx queue full
Send error: tx queue full
Send error: tx queue full
Send error: tx queue full
Send error: tx queue full
Send error: tx queue full
Send error: tx queue full
Send error: tx queue full
Send error: tx queue full
Send error: tx queue full
Send error: tx queue full
Send error: tx queue full
Send error: tx queue full
Send error: tx queue full
Send error: tx queue full
Send error: tx queue full
Send error: tx queue full
Send error: tx queue full
Send error: tx queue full
Send error: tx queue full
Send error: tx queue full
Send error: tx queue full
Send error: tx queue full
Send error: tx queue full
Send error: tx queue full
Send error: tx queue full
Send error: tx queue full
Send error: tx queue full
Send error: tx queue full
Send error: tx queue full
Send error: tx queue full
Send error: tx queue full
Send error: tx queue full
Send error: tx queue full
Send error: tx queue full
Send error: tx queue full
Send error: tx queue full
Send error: tx queue full
Send error: tx queue full
Send error: tx queue full

#### dut-rust-dpdk-multicore-app.log

Send error: TX ring full
Send error: TX ring full
Send error: TX ring full
Send error: TX ring full
Send error: TX ring full
Send error: TX ring full
Send error: TX ring full
Send error: TX ring full
Send error: TX ring full
Send error: TX ring full
Send error: TX ring full
Send error: TX ring full
Send error: TX ring full
Send error: TX ring full
Send error: TX ring full
Send error: TX ring full
Send error: TX ring full
Send error: TX ring full
Send error: TX ring full
Send error: TX ring full
Send error: TX ring full
Send error: TX ring full
Send error: TX ring full
Send error: TX ring full
Send error: TX ring full
Send error: TX ring full
Send error: TX ring full
Send error: TX ring full
Send error: TX ring full
Send error: TX ring full
Send error: TX ring full
Send error: TX ring full
Send error: TX ring full
Send error: TX ring full
Send error: TX ring full
[PERF] interval=10s rx_pps=111361 rx_bps=419977976 tx_pps=107842 tx_bps=406860406 rx_drops=0 tx_fails=29668 lat_avg_us=0 lat_p50_us=0 lat_p95_us=0 lat_p99_us=0 lat_max_us=0 arp_hits=1108101 arp_misses=0 ring_drops=36682 worker_idle_pct=98.9 burst_avg=5.8
[PERF] interval=10s rx_pps=70003 rx_bps=758268928 tx_pps=69999 tx_bps=758231016 rx_drops=0 tx_fails=0 lat_avg_us=0 lat_p50_us=0 lat_p95_us=0 lat_p99_us=0 lat_max_us=0 arp_hits=700000 arp_misses=0 ring_drops=0 worker_idle_pct=99.3 burst_avg=6.7
[PERF] interval=10s rx_pps=69996 rx_bps=758195017 tx_pps=69999 tx_bps=758232929 rx_drops=0 tx_fails=0 lat_avg_us=0 lat_p50_us=0 lat_p95_us=0 lat_p99_us=0 lat_max_us=0 arp_hits=700000 arp_misses=0 ring_drops=0 worker_idle_pct=99.3 burst_avg=6.3
[PERF] interval=10s rx_pps=69320 rx_bps=750876135 tx_pps=69320 tx_bps=750876135 rx_drops=0 tx_fails=0 lat_avg_us=0 lat_p50_us=0 lat_p95_us=0 lat_p99_us=0 lat_max_us=0 arp_hits=693210 arp_misses=0 ring_drops=0 worker_idle_pct=99.3 burst_avg=6.1
[PERF] interval=10s rx_pps=84453 rx_bps=914799630 tx_pps=84450 tx_bps=914764968 rx_drops=0 tx_fails=0 lat_avg_us=0 lat_p50_us=0 lat_p95_us=0 lat_p99_us=0 lat_max_us=0 arp_hits=844513 arp_misses=0 ring_drops=0 worker_idle_pct=99.2 burst_avg=14.9
[PERF] interval=10s rx_pps=136700 rx_bps=1480736792 tx_pps=136700 tx_bps=1480736792 rx_drops=0 tx_fails=0 lat_avg_us=0 lat_p50_us=0 lat_p95_us=0 lat_p99_us=0 lat_max_us=0 arp_hits=1367018 arp_misses=0 ring_drops=0 worker_idle_pct=98.5 burst_avg=14.4
[PERF] interval=10s rx_pps=137894 rx_bps=1493666758 tx_pps=137897 tx_bps=1493701420 rx_drops=0 tx_fails=0 lat_avg_us=0 lat_p50_us=0 lat_p95_us=0 lat_p99_us=0 lat_max_us=0 arp_hits=1378987 arp_misses=0 ring_drops=0 worker_idle_pct=98.5 burst_avg=14.7
[PERF] interval=10s rx_pps=78032 rx_bps=845243246 tx_pps=77978 tx_bps=844659409 rx_drops=0 tx_fails=0 lat_avg_us=0 lat_p50_us=0 lat_p95_us=0 lat_p99_us=0 lat_max_us=0 arp_hits=779792 arp_misses=0 ring_drops=0 worker_idle_pct=99.2 burst_avg=11.8
[PERF] interval=10s rx_pps=128956 rx_bps=1396846100 tx_pps=129009 tx_bps=1397425604 rx_drops=0 tx_fails=0 lat_avg_us=0 lat_p50_us=0 lat_p95_us=0 lat_p99_us=0 lat_max_us=0 arp_hits=1290105 arp_misses=0 ring_drops=0 worker_idle_pct=98.5 burst_avg=10.2
[PERF] interval=10s rx_pps=134199 rx_bps=1453638566 tx_pps=134199 tx_bps=1453642899 rx_drops=0 tx_fails=0 lat_avg_us=0 lat_p50_us=0 lat_p95_us=0 lat_p99_us=0 lat_max_us=0 arp_hits=1342005 arp_misses=0 ring_drops=0 worker_idle_pct=98.4 burst_avg=9.9
[PERF] interval=10s rx_pps=103832 rx_bps=1124710949 tx_pps=103832 tx_bps=1124710949 rx_drops=0 tx_fails=0 lat_avg_us=0 lat_p50_us=0 lat_p95_us=0 lat_p99_us=0 lat_max_us=0 arp_hits=1038335 arp_misses=0 ring_drops=0 worker_idle_pct=98.8 burst_avg=8.6
[PERF] interval=10s rx_pps=104762 rx_bps=1134786380 tx_pps=104754 tx_bps=1134699725 rx_drops=0 tx_fails=0 lat_avg_us=0 lat_p50_us=0 lat_p95_us=0 lat_p99_us=0 lat_max_us=0 arp_hits=1047557 arp_misses=0 ring_drops=0 worker_idle_pct=98.8 burst_avg=9.1
[PERF] interval=10s rx_pps=131733 rx_bps=1426926448 tx_pps=131741 tx_bps=1427013103 rx_drops=0 tx_fails=0 lat_avg_us=0 lat_p50_us=0 lat_p95_us=0 lat_p99_us=0 lat_max_us=0 arp_hits=1317421 arp_misses=0 ring_drops=0 worker_idle_pct=98.4 burst_avg=8.6
[PERF] interval=10s rx_pps=133142 rx_bps=1442194786 tx_pps=133142 tx_bps=1442194786 rx_drops=0 tx_fails=0 lat_avg_us=0 lat_p50_us=0 lat_p95_us=0 lat_p99_us=0 lat_max_us=0 arp_hits=1331436 arp_misses=0 ring_drops=0 worker_idle_pct=98.4 burst_avg=9.0
[PERF] interval=10s rx_pps=28039 rx_bps=303721363 tx_pps=28039 tx_bps=303721363 rx_drops=0 tx_fails=0 lat_avg_us=0 lat_p50_us=0 lat_p95_us=0 lat_p99_us=0 lat_max_us=0 arp_hits=280396 arp_misses=0 ring_drops=0 worker_idle_pct=99.7 burst_avg=9.8

#### dut-rust-stdlib-app.log

🚀 DPDK-STDLIB Echo Server
Binding to 10.0.1.218:9000
EAL: Detected CPU lcores: 8
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 failed (Port init failed: Invalid port ID: 0), falling back to standard networking
Using standard networking
✅ Socket created successfully!
📡 Local address: 10.0.1.218:9000
🔄 Echo server running... (Ctrl+C to stop)

</details>

<details><summary>Network & PCI State</summary>

#### dut-networking-diag-baseline.txt

=== Interface State ===
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:be:2e:5a:da:27 brd ff:ff:ff:ff:ff:ff
altname enp0s5
altname eni-01973d09dba5a2125
altname device-number-0.0
inet 10.0.1.31/24 metric 512 brd 10.0.1.255 scope global dynamic ens5
valid_lft 3220sec preferred_lft 3220sec
inet6 fe80::be:2eff:fe5a:da27/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:de:e3:7d:7f 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
4: ens6: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 qdisc mq state UP group default qlen 1000
link/ether 02:d6:4c:12:ca:d7 brd ff:ff:ff:ff:ff:ff
altname enp0s6
altname eni-0ee25b777120a96ba
altname device-number-1.0
inet 10.0.1.218/24 metric 513 brd 10.0.1.255 scope global dynamic ens6
valid_lft 3551sec preferred_lft 3551sec
inet6 fe80::d6:4cff:fe12:cad7/64 scope link proto kernel_ll
valid_lft forever preferred_lft forever
=== ARP Table ===
10.0.1.1 dev ens5 lladdr 02:f2:78:ac:05:97 REACHABLE
10.0.1.98 dev ens5 lladdr 02:f9:d4:ab:8b:87 REACHABLE
10.0.1.1 dev ens6 lladdr 02:f2:78:ac:05:97 REACHABLE
=== Routes ===
default via 10.0.1.1 dev ens5 proto dhcp src 10.0.1.31 metric 512
default via 10.0.1.1 dev ens6 proto dhcp src 10.0.1.218 metric 513
10.0.0.2 via 10.0.1.1 dev ens5 proto dhcp src 10.0.1.31 metric 512
10.0.0.2 via 10.0.1.1 dev ens6 proto dhcp src 10.0.1.218 metric 513
10.0.1.0/24 dev ens5 proto kernel scope link src 10.0.1.31 metric 512
10.0.1.0/24 dev ens6 proto kernel scope link src 10.0.1.218 metric 513
10.0.1.1 dev ens5 proto dhcp scope link src 10.0.1.31 metric 512
10.0.1.1 dev ens6 proto dhcp scope link src 10.0.1.218 metric 513
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1 linkdown
=== DPDK Bind ===

Network devices using kernel driver

0000:00:05.0 'Elastic Network Adapter (ENA) ec20' if=ens5 drv=ena unused=vfio-pci Active
0000:00:06.0 'Elastic Network Adapter (ENA) ec20' if=ens6 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

=== Ethtool Stats (ens6) ===
=== Processes ===
none

#### dut-networking-diag-failure-native-dpdk.txt

(failed)

#### dut-networking-diag-failure.txt

(failed)

#### trex-networking-diag-baseline.txt

=== Interface State ===
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:2d:4d:ac:7b:71 brd ff:ff:ff:ff:ff:ff
altname enp0s5
altname eni-0d18cace6fae47663
altname device-number-0.0
inet 10.0.1.17/24 metric 512 brd 10.0.1.255 scope global dynamic ens5
valid_lft 3225sec preferred_lft 3225sec
inet6 fe80::2d:4dff:feac:7b71/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:3a:8d:b6:95 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
4: ens7: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 qdisc mq state UP group default qlen 1000
link/ether 02:fb:51:03:7d:31 brd ff:ff:ff:ff:ff:ff
altname enp0s7
altname eni-060f4be8e185bd1a5
altname device-number-2.0
inet 10.0.1.205/24 metric 514 brd 10.0.1.255 scope global dynamic ens7
valid_lft 3513sec preferred_lft 3513sec
inet6 fe80::fb:51ff:fe03:7d31/64 scope link proto kernel_ll
valid_lft forever preferred_lft forever
5: ens6: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 qdisc mq state UP group default qlen 1000
link/ether 02:93:c5:54:af:83 brd ff:ff:ff:ff:ff:ff
altname enp0s6
altname eni-0480404789e9d1d19
altname device-number-1.0
inet 10.0.1.74/24 metric 513 brd 10.0.1.255 scope global dynamic ens6
valid_lft 3513sec preferred_lft 3513sec
inet6 fe80::93:c5ff:fe54:af83/64 scope link proto kernel_ll
valid_lft forever preferred_lft forever
=== ARP Table ===
10.0.1.1 dev ens5 lladdr 02:f2:78:ac:05:97 REACHABLE
10.0.1.1 dev ens6 lladdr 02:f2:78:ac:05:97 STALE
10.0.1.1 dev ens7 lladdr 02:f2:78:ac:05:97 STALE
10.0.1.98 dev ens5 lladdr 02:f9:d4:ab:8b:87 REACHABLE
=== Routes ===
default via 10.0.1.1 dev ens5 proto dhcp src 10.0.1.17 metric 512
default via 10.0.1.1 dev ens6 proto dhcp src 10.0.1.74 metric 513
default via 10.0.1.1 dev ens7 proto dhcp src 10.0.1.205 metric 514
10.0.0.2 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 ens6 proto dhcp src 10.0.1.74 metric 513
10.0.0.2 via 10.0.1.1 dev ens7 proto dhcp src 10.0.1.205 metric 514
10.0.1.0/24 dev ens5 proto kernel scope link src 10.0.1.17 metric 512
10.0.1.0/24 dev ens6 proto kernel scope link src 10.0.1.74 metric 513
10.0.1.0/24 dev ens7 proto kernel scope link src 10.0.1.205 metric 514
10.0.1.1 dev ens5 proto dhcp scope link src 10.0.1.17 metric 512
10.0.1.1 dev ens6 proto dhcp scope link src 10.0.1.74 metric 513
10.0.1.1 dev ens7 proto dhcp scope link src 10.0.1.205 metric 514
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1 linkdown
=== DPDK Bind ===
unavailable
=== Ethtool Stats (ens6) ===
=== Processes ===
none

#### trex-networking-diag-failure-native-dpdk.txt

(failed)

#### trex-networking-diag-failure.txt

(failed)

</details>

<details><summary>Kernel Console (dmesg)</summary>

#### dut-console-output.log (PCI/driver events only)
#### trex-console-output.log (PCI/driver events only)
</details>

@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

Performance Test Failure (Run 23011396603)

Branch: claude/performance-optimization-phase-one-7mAY5 | Commit: 148d2410

failure-summary.json

{
  "failed_step": "perf-test",
  "error": "Script exited with code 2",
  "exit_code": 2,
  "timestamp": "2026-03-12T16:19:50.499106Z",
  "trex_instance_id": "",
  "dut_instance_id": "",
  "commit": "148d2410a310ac0b118c165c81a3f944f6df404c",
  "run_url": "https://github.com/gspivey/dpdk-stdlib-rust/actions/runs/23011396603"
}```

### Application Logs (last 20 lines)


<details><summary>Full Application Logs (last 200 lines each)</summary>

</details>

<details><summary>Network & PCI State</summary>

</details>

<details><summary>Kernel Console (dmesg)</summary>

</details>

@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

Performance Test Failure (Run 23014287878)

Branch: claude/performance-optimization-phase-one-7mAY5 | Commit: 148d2410

failure-summary.json

{
  "failed_step": "perf-test",
  "error": "Script exited with code 2",
  "exit_code": 2,
  "timestamp": "2026-03-12T17:25:50.839791Z",
  "trex_instance_id": "",
  "dut_instance_id": "",
  "commit": "148d2410a310ac0b118c165c81a3f944f6df404c",
  "run_url": "https://github.com/gspivey/dpdk-stdlib-rust/actions/runs/23014287878"
}```

### Application Logs (last 20 lines)


<details><summary>Full Application Logs (last 200 lines each)</summary>

</details>

<details><summary>Network & PCI State</summary>

</details>

<details><summary>Kernel Console (dmesg)</summary>

</details>

@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

Performance Test Failure (Run 23015349931)

Branch: claude/performance-optimization-phase-one-7mAY5 | Commit: 148d2410

failure-summary.json

{
  "failed_step": "perf-test",
  "error": "Script exited with code 2",
  "exit_code": 2,
  "timestamp": "2026-03-12T17:50:51.549752Z",
  "trex_instance_id": "",
  "dut_instance_id": "",
  "commit": "148d2410a310ac0b118c165c81a3f944f6df404c",
  "run_url": "https://github.com/gspivey/dpdk-stdlib-rust/actions/runs/23015349931"
}```

### Application Logs (last 20 lines)


<details><summary>Full Application Logs (last 200 lines each)</summary>

</details>

<details><summary>Network & PCI State</summary>

</details>

<details><summary>Kernel Console (dmesg)</summary>

</details>

The perf test script's stack cleanup loop had a bug where after the 900s
timeout, it would blindly proceed to `cdk deploy` even if the old stack
was still in DELETE_IN_PROGRESS. This caused all 4 recent perf runs to
fail with "Stack is in DELETE_IN_PROGRESS state and can not be updated."

The fix adds post-timeout escalation:
- If stack is still DELETE_IN_PROGRESS after 900s, use
  `--retain-resources` on all undeletable resources to force cleanup
- Wait up to 120s more for the retain-resources delete to finish
- Fail with a clear error if the stack still can't be deleted, instead
  of attempting a doomed `cdk deploy`
- Also handle DELETE_FAILED state after timeout with retain-resources

https://claude.ai/code/session_016N4yPU5RzaxmK1Vtu4Hr6y
@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

[CI] Stage: Deploy

Infrastructure ready.

  • Sender: i-0fc866ce841d413f2 (DPDK ENI: 10.0.1.175)
  • Receiver: i-0624fa6fc0cbb0458 (DPDK ENI: 10.0.1.150)
  • Both instances SSM-ready.

@github-actions

Copy link
Copy Markdown

Performance Test Failure (Run 23019600299)

Branch: claude/performance-optimization-phase-one-7mAY5 | Commit: de447c0d

failure-summary.json

{
  "failed_step": "perf-test",
  "error": "Script exited with code 2",
  "exit_code": 2,
  "timestamp": "2026-03-12T19:36:39.400820Z",
  "trex_instance_id": "",
  "dut_instance_id": "",
  "commit": "de447c0d331423ad64fa8ef53b15b8cd7fbd8eec",
  "run_url": "https://github.com/gspivey/dpdk-stdlib-rust/actions/runs/23019600299"
}```

### Application Logs (last 20 lines)


<details><summary>Full Application Logs (last 200 lines each)</summary>

</details>

<details><summary>Network & PCI State</summary>

</details>

<details><summary>Kernel Console (dmesg)</summary>

</details>

@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

When CDK deploy fails, the script now captures CloudFormation events
(FAILED/ROLLBACK resources) and posts them to the PR as a comment.
This gives visibility into which resource failed and why, instead of
just "CDK deploy failed" with no diagnostics.

https://claude.ai/code/session_016N4yPU5RzaxmK1Vtu4Hr6y
@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

✅ Integration Tests Passed (Run 23019595293)

Branch: 23/merge | Commit: daa6451f

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.150: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.150:9000 (MAC: 02:7f:40:ea:b4:1b)
Using DPDK acceleration (run-to-completion)
✅ Socket created successfully!
📡 Local address: 10.0.1.150:9000
🔄 Echo server running... (Ctrl+C to stop)
Shutting down gracefully...

sender-echo-server.log

🚀 DPDK-STDLIB Echo Server
Binding to 10.0.1.175: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.175:9000 (MAC: 02:60:49:36:52:53)
Using DPDK acceleration (run-to-completion)
✅ Socket created successfully!
📡 Local address: 10.0.1.175: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.150:9000: 'arp-probe #1'
Test complete
[2026-03-12T19:33:55Z] INFO: ARP resolution succeeded (got response from peer)
[2026-03-12T19:33:55Z] INFO: Test: udp_send_receive
[2026-03-12T19:33:56Z] INFO: UDP send/receive succeeded
[2026-03-12T19:33:56Z] INFO: Test: echo_roundtrip
[2026-03-12T19:33:57Z] INFO: Echo roundtrip succeeded: 5/5 responses received
[2026-03-12T19:33:57Z] INFO: Test: payload_integrity
[2026-03-12T19:33:57Z] INFO: Response received, checking payload match...
[2026-03-12T19:33:57Z] INFO: Payload integrity verified (found in response)
[2026-03-12T19:33:57Z] INFO: JUnit XML written to: /tmp/test-results/tier2-kernel-interop.xml
[2026-03-12T19:33:57Z] INFO: Tier 2 sender tests complete. Results: /tmp/test-results/tier2-kernel-interop.xml

receiver-test-client-iperf.log

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

sender-test-client-iperf.log

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

sender-echo-server.log

🚀 DPDK-STDLIB Echo Server
Binding to 10.0.1.175: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.175:9000 (MAC: 02:60:49:36:52:53)
Using DPDK acceleration (run-to-completion)
✅ Socket created successfully!
📡 Local address: 10.0.1.175:9000
🔄 Echo server running... (Ctrl+C to stop)
Shutting down gracefully...

sender-test-client.log

[2026-03-12T19:26:52Z] INFO: Test: arp_resolution
UDP Test Client
Target: 10.0.1.150:9000
Bind address: 10.0.1.175: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.175:32768 (MAC: 02:60:49:36:52:53)
Backend: dpdk
Sending packets...
Sent 12 bytes: 'arp-probe #1'
Received 12 bytes from 10.0.1.150:9000: 'arp-probe #1'
Test complete
[2026-03-12T19:26:54Z] INFO: ARP resolution succeeded (got response from peer)
[2026-03-12T19:26:54Z] INFO: Test: udp_send_receive
[2026-03-12T19:26:56Z] INFO: UDP send/receive succeeded
[2026-03-12T19:26:56Z] INFO: Test: echo_roundtrip
[2026-03-12T19:26:57Z] INFO: Echo roundtrip succeeded: 5/5 responses received
[2026-03-12T19:26:57Z] INFO: Test: payload_integrity
[2026-03-12T19:26:58Z] INFO: Response received, checking payload match...
[2026-03-12T19:26:58Z] INFO: Payload integrity verified (found in response)
[2026-03-12T19:26:58Z] INFO: JUnit XML written to: /tmp/test-results/tier1-dpdk-echo.xml
[2026-03-12T19:26:58Z] INFO: Tier 1 sender tests complete. Results: /tmp/test-results/tier1-dpdk-echo.xml
[2026-03-12T19:33:55Z] INFO: Test: arp_resolution
UDP Test Client
Target: 10.0.1.150: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.150:9000: 'arp-probe #1'
Test complete
[2026-03-12T19:33:55Z] INFO: ARP resolution succeeded (got response from peer)
[2026-03-12T19:33:55Z] INFO: Test: udp_send_receive
[2026-03-12T19:33:56Z] INFO: UDP send/receive succeeded
[2026-03-12T19:33:56Z] INFO: Test: echo_roundtrip
[2026-03-12T19:33:57Z] INFO: Echo roundtrip succeeded: 5/5 responses received
[2026-03-12T19:33:57Z] INFO: Test: payload_integrity
[2026-03-12T19:33:57Z] INFO: Response received, checking payload match...
[2026-03-12T19:33:57Z] INFO: Payload integrity verified (found in response)
[2026-03-12T19:33:57Z] INFO: JUnit XML written to: /tmp/test-results/tier2-kernel-interop.xml
[2026-03-12T19:33:57Z] INFO: Tier 2 sender tests complete. Results: /tmp/test-results/tier2-kernel-interop.xml

receiver-test-client-iperf.log

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

sender-test-client-iperf.log

[2026-03-12T19:39:59Z] INFO: Pre-flight: checking DPDK state and ARP cache...
[2026-03-12T19:39:59Z] INFO: Local IP: 10.0.1.175, Peer IP: 10.0.1.150, Port: 9000
[2026-03-12T19:39:59Z] INFO: /proc/net/arp contents:
IP address       HW type     Flags       HW address            Mask     Device
10.0.1.150       0x1         0x2         02:7f:40:ea:b4:1b     *        ens5
10.0.1.175       0x1         0x2         02:60:49:36:52:53     *        ens5
10.0.1.200       0x1         0x2         02:90:20:44:e4:69     *        ens5
10.0.1.90        0x1         0x2         02:d6:a5:ec:ee:29     *        ens5
10.0.1.1         0x1         0x2         02:5a:8a:e8:fd:bf     *        ens5
[2026-03-12T19:39:59Z] INFO: DPDK runtime state:
No /var/run/dpdk/ directory
[2026-03-12T19:39:59Z] INFO: vfio-pci bindings:
0000:00:06.0
bind
module
new_id
remove_id
uevent
unbind
[2026-03-12T19:39:59Z] INFO: Test binary: /opt/dpdk-stdlib/target/release/test-client
-rwxr-xr-x. 2 root root 1845056 Mar 12 19:25 /opt/dpdk-stdlib/target/release/test-client
[2026-03-12T19:39:59Z] INFO: Launching test-client: /opt/dpdk-stdlib/target/release/test-client --target 10.0.1.150 --port 9000 --bind-ip 10.0.1.175 --count 10 --delay 200
[2026-03-12T19:40:01Z] INFO: Test client output: UDP Test Client
Target: 10.0.1.150:9000
Bind address: 10.0.1.175: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.175:32768 (MAC: 02:60:49:36:52:53)
Backend: dpdk
Sending packets...
Sent 30 bytes: 'dpdk-to-kernel-test-payload #1'
Received 30 bytes from 10.0.1.150:9000: 'dpdk-to-kernel-test-payload #1'
Sent 30 bytes: 'dpdk-to-kernel-test-payload #2'
Received 30 bytes from 10.0.1.150:9000: 'dpdk-to-kernel-test-payload #2'
Sent 30 bytes: 'dpdk-to-kernel-test-payload #3'
Received 30 bytes from 10.0.1.150:9000: 'dpdk-to-kernel-test-payload #3'
Sent 30 bytes: 'dpdk-to-kernel-test-payload #4'
Received 30 bytes from 10.0.1.150:9000: 'dpdk-to-kernel-test-payload #4'
Sent 30 bytes: 'dpdk-to-kernel-test-payload #5'
Received 30 bytes from 10.0.1.150:9000: 'dpdk-to-kernel-test-payload #5'
Sent 30 bytes: 'dpdk-to-kernel-test-payload #6'
Received 30 bytes from 10.0.1.150:9000: 'dpdk-to-kernel-test-payload #6'
Sent 30 bytes: 'dpdk-to-kernel-test-payload #7'
Received 30 bytes from 10.0.1.150:9000: 'dpdk-to-kernel-test-payload #7'
Sent 30 bytes: 'dpdk-to-kernel-test-payload #8'
Received 30 bytes from 10.0.1.150:9000: 'dpdk-to-kernel-test-payload #8'
Sent 30 bytes: 'dpdk-to-kernel-test-payload #9'
Received 30 bytes from 10.0.1.150:9000: 'dpdk-to-kernel-test-payload #9'
Sent 31 bytes: 'dpdk-to-kernel-test-payload #10'
Received 31 bytes from 10.0.1.150:9000: 'dpdk-to-kernel-test-payload #10'
Test complete
[2026-03-12T19:40:01Z] INFO: our-app-sends: sent 10 packets, received 10 responses
[2026-03-12T19:40:01Z] INFO: our-app-sends: PASS (sent >= 5 packets)
[2026-03-12T19:40:01Z] INFO: JUnit XML written to: /tmp/test-results/tier3-our-app-sends.xml
[2026-03-12T19:40:01Z] INFO: our-app-sends test complete
⚠️ SSM Command Failures (receiver-ssm-failure.log)
=== Polling timeout after 30s ===
Status: InProgress
Instance: i-0624fa6fc0cbb0458 (receiver)
Command ID: 90bc78b6-2911-4581-90e1-51449c6b6142

=== STDOUT ===


=== STDERR ===


=== Polling timeout after 30s ===
Status: InProgress
Instance: i-0624fa6fc0cbb0458 (receiver)
Command ID: c6608ad3-f9b9-4e7e-ac15-653cea10db8c

=== STDOUT ===


=== STDERR ===


=== Polling timeout after 30s ===
Status: InProgress
Instance: i-0624fa6fc0cbb0458 (receiver)
Command ID: 1ee2f35d-1a23-424f-a7ac-cc79d2229a31

=== STDOUT ===


=== STDERR ===


⚠️ SSM Command Failures (sender-ssm-failure.log)
=== Polling timeout after 30s ===
Status: InProgress
Instance: i-0fc866ce841d413f2 (sender)
Command ID: d348aba0-bf7a-4f8d-9e05-1d6029e1f80a

=== 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:9e:08:c8:80:e1 brd ff:ff:ff:ff:ff:ff
    altname enp0s5
    altname eni-08b1cbefae22b9deb
    altname device-number-0.0
    inet 10.0.1.209/24 metric 512 brd 10.0.1.255 scope global dynamic ens5
       valid_lft 2307sec preferred_lft 2307sec
    inet6 fe80::9e:8ff:fec8:80e1/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:c9:28:db:3e 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:7f:40:ea:b4:1b brd ff:ff:ff:ff:ff:ff
    altname enp0s6
    altname ens6
    inet 10.0.1.150/24 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::7f:40ff:feea:b41b/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:d7:1a:99:58:a9 brd ff:ff:ff:ff:ff:ff
    altname enp0s5
    altname eni-086a7453ca14d74ad
    altname device-number-0.0
    inet 10.0.1.35/24 metric 512 brd 10.0.1.255 scope global dynamic ens5
       valid_lft 2331sec preferred_lft 2331sec
    inet6 fe80::d7:1aff:fe99:58a9/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:50:3a:69:19 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-12T19:26:12Z
hostname: ip-10-0-1-209.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:9e:08:c8:80:e1 brd ff:ff:ff:ff:ff:ff
    altname enp0s5
    altname eni-08b1cbefae22b9deb
    altname device-number-0.0
    inet 10.0.1.209/24 metric 512 brd 10.0.1.255 scope global dynamic ens5
       valid_lft 3321sec preferred_lft 3321sec
    inet6 fe80::9e:8ff:fec8:80e1/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:c9:28:db:3e 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.200 dev ens5 lladdr 02:90:20:44:e4:69 REACHABLE 
10.0.1.90 dev ens5 lladdr 02:d6:a5:ec:ee:29 REACHABLE 
10.0.1.1 dev ens5 lladdr 02:5a:8a:e8:fd:bf REACHABLE 

=== ROUTE TABLE ===
default via 10.0.1.1 dev ens5 proto dhcp src 10.0.1.209 metric 512 
10.0.0.2 via 10.0.1.1 dev ens5 proto dhcp src 10.0.1.209 metric 512 
10.0.1.0/24 dev ens5 proto kernel scope link src 10.0.1.209 metric 512 
10.0.1.1 dev ens5 proto dhcp scope link src 10.0.1.209 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:7f:40:ea:b4:1b/ 02:9e:08:c8:80:e1/ 

--- ENI: 02:7f:40:ea:b4:1b/ ---
  device-number: 1
  local-ipv4s: 10.0.1.150
  subnet-id: subnet-0ffb5d8123b6211a1
  subnet-cidr: 10.0.1.0/24

--- ENI: 02:9e:08:c8:80:e1/ ---
  device-number: 0
  local-ipv4s: 10.0.1.209
  subnet-id: subnet-0ffb5d8123b6211a1
  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:5a:8a:e8:fd:bf REACHABLE 

arping result:
ARPING 10.0.1.1 from 10.0.1.209 ens5
Unicast reply from 10.0.1.1 [02:5A:8A:E8:FD:BF]  0.535ms
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 12 19:25 .
drwxr-xr-x. 14 root root     3100 Mar 12 19:25 ..
crw-------.  1 root root 243,   0 Mar 12 19:25 noiommu-0
crw-rw-rw-.  1 root root  10, 196 Mar 12 19:21 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.074106] audit: type=2000 audit(1773343286.340:1): state=initialized audit_enabled=0 res=1
[    0.075551] kprobes: kprobe jump-optimization is enabled. All kprobes are optimized if possible.
[    0.100125] ACPI: Interpreter enabled
[    0.100125] ACPI: Enabled 2 GPEs in block 00 to 0F
[    0.124020] pci 0000:00:05.0: enabling Extended Tags
[    0.156248] SGI XFS with ACLs, security attributes, quota, no debug enabled
[    0.186953] ACPI: \_SB_.LNKD: Enabled at IRQ 11
[    0.270168] IPI shorthand broadcast: enabled
[    0.270235] AES CTR mode by8 optimization enabled
[    2.455221] systemd[1]: Mounting dev-hugepages.mount - Huge Pages File System...
[    2.494407] systemd[1]: Mounted dev-hugepages.mount - Huge Pages File System.
[    2.544645] VFIO - User Level meta-driver version: 0.3
[    3.513677] ena 0000:00:05.0: Elastic Network Adapter (ENA) v2.16.1g
[    3.525080] ena 0000:00:05.0: ENA device version: 0.10
[    3.525870] ena 0000:00:05.0: ENA controller version: 0.0.1 implementation version 1
[    3.625121] ena 0000:00:05.0: ENA Large LLQ is disabled
[    3.649375] ena 0000:00:05.0: Elastic Network Adapter (ENA) found at mem c0500000, mac addr 02:9e:08:c8:80:e1
[    3.705224] ena 0000:00:05.0 ens5: renamed from eth0
[    4.833714] ena 0000:00:05.0 ens5: Local page cache is disabled for less than 16 channels
[  231.746508] pci 0000:00:06.0: enabling Extended Tags
[  231.750330] ena 0000:00:06.0: enabling device (0000 -> 0002)
[  231.761921] ena 0000:00:06.0: ENA device version: 0.10
[  231.762725] ena 0000:00:06.0: ENA controller version: 0.0.1 implementation version 1
[  231.861919] ena 0000:00:06.0: ENA Large LLQ is disabled
[  231.873723] ena 0000:00:06.0: Elastic Network Adapter (ENA) found at mem c0508000, mac addr 02:7f:40:ea:b4:1b
[  231.931922] ena 0000:00:06.0 ens6: renamed from eth0
[  232.286230] ena 0000:00:06.0 ens6: Local page cache is disabled for less than 16 channels
[  271.685690] vfio-pci 0000:00:06.0: Adding to iommu group 0
[  271.687029] 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-12T19:26:03Z
hostname: ip-10-0-1-35.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:d7:1a:99:58:a9 brd ff:ff:ff:ff:ff:ff
    altname enp0s5
    altname eni-086a7453ca14d74ad
    altname device-number-0.0
    inet 10.0.1.35/24 metric 512 brd 10.0.1.255 scope global dynamic ens5
       valid_lft 3330sec preferred_lft 3330sec
    inet6 fe80::d7:1aff:fe99:58a9/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:50:3a:69:19 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.200 dev ens5 lladdr 02:90:20:44:e4:69 STALE 
10.0.1.1 dev ens5 lladdr 02:5a:8a:e8:fd:bf REACHABLE 

=== ROUTE TABLE ===
default via 10.0.1.1 dev ens5 proto dhcp src 10.0.1.35 metric 512 
10.0.0.2 via 10.0.1.1 dev ens5 proto dhcp src 10.0.1.35 metric 512 
10.0.1.0/24 dev ens5 proto kernel scope link src 10.0.1.35 metric 512 
10.0.1.1 dev ens5 proto dhcp scope link src 10.0.1.35 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:60:49:36:52:53/ 02:d7:1a:99:58:a9/ 

--- ENI: 02:60:49:36:52:53/ ---
  device-number: 1
  local-ipv4s: 10.0.1.175
  subnet-id: subnet-0ffb5d8123b6211a1
  subnet-cidr: 10.0.1.0/24

--- ENI: 02:d7:1a:99:58:a9/ ---
  device-number: 0
  local-ipv4s: 10.0.1.35
  subnet-id: subnet-0ffb5d8123b6211a1
  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:5a:8a:e8:fd:bf REACHABLE 

arping result:
ARPING 10.0.1.1 from 10.0.1.35 ens5
Unicast reply from 10.0.1.1 [02:5A:8A:E8:FD:BF]  0.548ms
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 12 19:25 .
drwxr-xr-x. 14 root root     3100 Mar 12 19:25 ..
crw-------.  1 root root 243,   0 Mar 12 19:25 noiommu-0
crw-rw-rw-.  1 root root  10, 196 Mar 12 19:21 vfio

noiommu mode:
Y

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

=== DPDK-RELATED DMESG (last 30 lines) ===
[    0.069435] x86/fpu: Enabled xstate features 0x2ff, context size is 2568 bytes, using 'compacted' format.
[    0.075653] audit: type=2000 audit(1773343287.624:1): state=initialized audit_enabled=0 res=1
[    0.077070] kprobes: kprobe jump-optimization is enabled. All kprobes are optimized if possible.
[    0.101780] ACPI: Interpreter enabled
[    0.101780] ACPI: Enabled 2 GPEs in block 00 to 0F
[    0.125555] pci 0000:00:05.0: enabling Extended Tags
[    0.158375] SGI XFS with ACLs, security attributes, quota, no debug enabled
[    0.189023] ACPI: \_SB_.LNKD: Enabled at IRQ 11
[    0.268829] IPI shorthand broadcast: enabled
[    0.268890] AES CTR mode by8 optimization enabled
[    2.345168] systemd[1]: Mounting dev-hugepages.mount - Huge Pages File System...
[    2.384765] systemd[1]: Mounted dev-hugepages.mount - Huge Pages File System.
[    2.429549] VFIO - User Level meta-driver version: 0.3
[    3.405082] ena 0000:00:05.0: Elastic Network Adapter (ENA) v2.16.1g
[    3.435034] ena 0000:00:05.0: ENA device version: 0.10
[    3.435820] ena 0000:00:05.0: ENA controller version: 0.0.1 implementation version 1
[    3.540143] ena 0000:00:05.0: ENA Large LLQ is disabled
[    3.552709] ena 0000:00:05.0: Elastic Network Adapter (ENA) found at mem c0500000, mac addr 02:d7:1a:99:58:a9
[    3.625079] ena 0000:00:05.0 ens5: renamed from eth0
[    4.727407] ena 0000:00:05.0 ens5: Local page cache is disabled for less than 16 channels
[  230.858213] pci 0000:00:06.0: enabling Extended Tags
[  230.862129] ena 0000:00:06.0: enabling device (0000 -> 0002)
[  230.872614] ena 0000:00:06.0: ENA device version: 0.10
[  230.873417] ena 0000:00:06.0: ENA controller version: 0.0.1 implementation version 1
[  230.972598] ena 0000:00:06.0: ENA Large LLQ is disabled
[  230.984293] ena 0000:00:06.0: Elastic Network Adapter (ENA) found at mem c0508000, mac addr 02:60:49:36:52:53
[  231.032619] ena 0000:00:06.0 ens6: renamed from eth0
[  231.371453] ena 0000:00:06.0 ens6: Local page cache is disabled for less than 16 channels
[  263.486263] vfio-pci 0000:00:06.0: Adding to iommu group 0
[  263.487617] 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.074089] pid_max: default: 32768 minimum: 301
[    0.126144] iommu: Default domain type: Translated 
[    0.126894] NetLabel:  unlabeled traffic allowed by default
[    0.134089] PCI: CLS 0 bytes, default 64
[    0.210620] nvme nvme0: 2/0/0 default/read/poll queues
[    0.435493] 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.435586] systemd[1]: No hostname configured, using default hostname.
[    0.537886] systemd[1]: Queued start job for default target initrd.target.
[    1.639250] 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.022688] bridge: filtering via arp/ip/ip6tables is no longer available by default. Update your scripts to load br_netfilter if you need this.
[  310.453270] vfio-pci 0000:00:06.0: vfio-noiommu device opened by user (echo:6678)
[  733.437191] vfio-pci 0000:00:06.0: vfio-noiommu device opened by user (echo:22640)

sender-dmesg-crashes.log

[    0.075637] pid_max: default: 32768 minimum: 301
[    0.127659] iommu: Default domain type: Translated 
[    0.128396] NetLabel:  unlabeled traffic allowed by default
[    0.135637] PCI: CLS 0 bytes, default 64
[    0.220060] nvme nvme0: 2/0/0 default/read/poll queues
[    0.434191] 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.434283] systemd[1]: No hostname configured, using default hostname.
[    0.548123] systemd[1]: Queued start job for default target initrd.target.
[    1.628536] 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.257327] bridge: filtering via arp/ip/ip6tables is no longer available by default. Update your scripts to load br_netfilter if you need this.
[ 1157.300226] vfio-pci 0000:00:06.0: vfio-noiommu device opened by user (echo:49777)
Kernel Console (dmesg)

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

[  231.744188] pci 0000:00:06.0: reg 0x10: [mem 0x00000000-0x00003fff]
[  231.745230] pci 0000:00:06.0: reg 0x18: [mem 0x00000000-0x000fffff pref]
[  231.746508] pci 0000:00:06.0: enabling Extended Tags
[  231.748305] pci 0000:00:06.0: BAR 2: assigned [mem 0xc0600000-0xc06fffff pref]
[  231.749335] pci 0000:00:06.0: BAR 0: assigned [mem 0xc0508000-0xc050bfff]
[  231.750330] ena 0000:00:06.0: enabling device (0000 -> 0002)
[  231.761921] ena 0000:00:06.0: ENA device version: 0.10
[  231.762725] ena 0000:00:06.0: ENA controller version: 0.0.1 implementation version 1
[  231.861919] ena 0000:00:06.0: ENA Large LLQ is disabled
[  231.873723] ena 0000:00:06.0: Elastic Network Adapter (ENA) found at mem c0508000, mac addr 02:7f:40:ea:b4:1b
[  231.931922] ena 0000:00:06.0 ens6: renamed from eth0
[  232.286230] ena 0000:00:06.0 ens6: Local page cache is disabled for less than 16 channels
[  271.685690] vfio-pci 0000:00:06.0: Adding to iommu group 0
[  271.687029] vfio-pci 0000:00:06.0: Adding kernel taint for vfio-noiommu group on device
[  310.453270] vfio-pci 0000:00:06.0: vfio-noiommu device opened by user (echo:6678)
[  470.913440] vfio-pci 0000:00:06.0: Removing from iommu group 0
[  471.926329] ena 0000:00:06.0: ENA device version: 0.10
[  471.927124] ena 0000:00:06.0: ENA controller version: 0.0.1 implementation version 1
[  472.028359] ena 0000:00:06.0: ENA Large LLQ is disabled
[  472.040267] ena 0000:00:06.0: Elastic Network Adapter (ENA) found at mem c0508000, mac addr 02:7f:40:ea:b4:1b
[  472.050514] ena 0000:00:06.0 eth0: Local page cache is disabled for less than 16 channels
[  599.690584] vfio-pci 0000:00:06.0: Adding to iommu group 0
[  599.691949] vfio-pci 0000:00:06.0: Adding kernel taint for vfio-noiommu group on device
[  733.437191] vfio-pci 0000:00:06.0: vfio-noiommu device opened by user (echo:22640)
[  810.028905] vfio-pci 0000:00:06.0: Removing from iommu group 0
[  811.041917] ena 0000:00:06.0: ENA device version: 0.10
[  811.042715] ena 0000:00:06.0: ENA controller version: 0.0.1 implementation version 1
[  811.143561] ena 0000:00:06.0: ENA Large LLQ is disabled
[  811.155357] ena 0000:00:06.0: Elastic Network Adapter (ENA) found at mem c0508000, mac addr 02:7f:40:ea:b4:1b
[  811.166159] 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.727407] ena 0000:00:05.0 ens5: Local page cache is disabled for less than 16 channels
[  230.854698] pci 0000:00:06.0: [1d0f:ec20] type 00 class 0x020000
[  230.855818] pci 0000:00:06.0: reg 0x10: [mem 0x00000000-0x00003fff]
[  230.856898] pci 0000:00:06.0: reg 0x18: [mem 0x00000000-0x000fffff pref]
[  230.858213] pci 0000:00:06.0: enabling Extended Tags
[  230.860020] pci 0000:00:06.0: BAR 2: assigned [mem 0xc0600000-0xc06fffff pref]
[  230.861089] pci 0000:00:06.0: BAR 0: assigned [mem 0xc0508000-0xc050bfff]
[  230.862129] ena 0000:00:06.0: enabling device (0000 -> 0002)
[  230.872614] ena 0000:00:06.0: ENA device version: 0.10
[  230.873417] ena 0000:00:06.0: ENA controller version: 0.0.1 implementation version 1
[  230.972598] ena 0000:00:06.0: ENA Large LLQ is disabled
[  230.984293] ena 0000:00:06.0: Elastic Network Adapter (ENA) found at mem c0508000, mac addr 02:60:49:36:52:53
[  231.032619] ena 0000:00:06.0 ens6: renamed from eth0
[  231.371453] ena 0000:00:06.0 ens6: Local page cache is disabled for less than 16 channels
[  263.486263] vfio-pci 0000:00:06.0: Adding to iommu group 0
[  263.487617] vfio-pci 0000:00:06.0: Adding kernel taint for vfio-noiommu group on device
[  326.254603] vfio-pci 0000:00:06.0: vfio-noiommu device opened by user (tokio-rt-worker:6661)
[  327.014457] vfio-pci 0000:00:06.0: vfio-noiommu device opened by user (tokio-rt-worker:6683)
[  328.774509] vfio-pci 0000:00:06.0: vfio-noiommu device opened by user (tokio-rt-worker:6705)
[  330.334492] vfio-pci 0000:00:06.0: vfio-noiommu device opened by user (tokio-rt-worker:6730)
[  375.859259] vfio-pci 0000:00:06.0: Removing from iommu group 0
[  376.871839] ena 0000:00:06.0: ENA device version: 0.10
[  376.872634] ena 0000:00:06.0: ENA controller version: 0.0.1 implementation version 1
[  376.971934] ena 0000:00:06.0: ENA Large LLQ is disabled
[  376.983630] ena 0000:00:06.0: Elastic Network Adapter (ENA) found at mem c0508000, mac addr 02:60:49:36:52:53
[  376.993718] ena 0000:00:06.0 eth0: Local page cache is disabled for less than 16 channels
[  961.353229] vfio-pci 0000:00:06.0: Adding to iommu group 0
[  961.354738] vfio-pci 0000:00:06.0: Adding kernel taint for vfio-noiommu group on device
[ 1111.730419] vfio-pci 0000:00:06.0: vfio-noiommu device opened by user (tokio-rt-worker:47202)
[ 1157.300226] vfio-pci 0000:00:06.0: vfio-noiommu device opened by user (echo:49777)

@github-actions

Copy link
Copy Markdown

[CI] Stage: Deploy

Infrastructure ready.

  • Sender: i-023870f1bcd7171d8 (DPDK ENI: 10.0.1.121)
  • Receiver: i-02c8e004af26a1eb2 (DPDK ENI: 10.0.1.53)
  • Both instances SSM-ready.

@github-actions

Copy link
Copy Markdown

Performance Test Failure (Run 23020644756)

Branch: claude/performance-optimization-phase-one-7mAY5 | Commit: 1b11ee67

failure-summary.json

{
  "failed_step": "perf-test",
  "error": "Script exited with code 2",
  "exit_code": 2,
  "timestamp": "2026-03-12T20:03:32.969960Z",
  "trex_instance_id": "",
  "dut_instance_id": "",
  "commit": "1b11ee6772b6db6a9852e2373d0f5a9cf3442512",
  "run_url": "https://github.com/gspivey/dpdk-stdlib-rust/actions/runs/23020644756"
}```

### Application Logs (last 20 lines)


<details><summary>Full Application Logs (last 200 lines each)</summary>

</details>

<details><summary>Network & PCI State</summary>

</details>

<details><summary>Kernel Console (dmesg)</summary>

</details>

@gspivey
gspivey merged commit 8f0bc3f into main Mar 12, 2026
4 of 5 checks passed
@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 23020643885)

Branch: 23/merge | Commit: 10406329

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.53: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.53:9000 (MAC: 02:c4:dd:86:73:35)
Using DPDK acceleration (run-to-completion)
✅ Socket created successfully!
📡 Local address: 10.0.1.53:9000
🔄 Echo server running... (Ctrl+C to stop)
Shutting down gracefully...

sender-echo-server.log

🚀 DPDK-STDLIB Echo Server
Binding to 10.0.1.121: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.121:9000 (MAC: 02:39:dc:c2:4b:03)
Using DPDK acceleration (run-to-completion)
✅ Socket created successfully!
📡 Local address: 10.0.1.121: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.53:9000: 'arp-probe #1'
Test complete
[2026-03-12T20:01:59Z] INFO: ARP resolution succeeded (got response from peer)
[2026-03-12T20:01:59Z] INFO: Test: udp_send_receive
[2026-03-12T20:02:00Z] INFO: UDP send/receive succeeded
[2026-03-12T20:02:00Z] INFO: Test: echo_roundtrip
[2026-03-12T20:02:01Z] INFO: Echo roundtrip succeeded: 5/5 responses received
[2026-03-12T20:02:01Z] INFO: Test: payload_integrity
[2026-03-12T20:02:01Z] INFO: Response received, checking payload match...
[2026-03-12T20:02:01Z] INFO: Payload integrity verified (found in response)
[2026-03-12T20:02:01Z] INFO: JUnit XML written to: /tmp/test-results/tier2-kernel-interop.xml
[2026-03-12T20:02:01Z] INFO: Tier 2 sender tests complete. Results: /tmp/test-results/tier2-kernel-interop.xml

receiver-test-client-iperf.log

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

sender-test-client-iperf.log

Received 30 bytes from 10.0.1.53:9000: 'dpdk-to-kernel-test-payload #3'
Sent 30 bytes: 'dpdk-to-kernel-test-payload #4'
Received 30 bytes from 10.0.1.53:9000: 'dpdk-to-kernel-test-payload #4'
Sent 30 bytes: 'dpdk-to-kernel-test-payload #5'
Received 30 bytes from 10.0.1.53:9000: 'dpdk-to-kernel-test-payload #5'
Sent 30 bytes: 'dpdk-to-kernel-test-payload #6'
Received 30 bytes from 10.0.1.53:9000: 'dpdk-to-kernel-test-payload #6'
Sent 30 bytes: 'dpdk-to-kernel-test-payload #7'
Received 30 bytes from 10.0.1.53:9000: 'dpdk-to-kernel-test-payload #7'
Sent 30 bytes: 'dpdk-to-kernel-test-payload #8'
Received 30 bytes from 10.0.1.53:9000: 'dpdk-to-kernel-test-payload #8'
Sent 30 bytes: 'dpdk-to-kernel-test-payload #9'
Received 30 bytes from 10.0.1.53:9000: 'dpdk-to-kernel-test-payload #9'
Sent 31 bytes: 'dpdk-to-kernel-test-payload #10'
Received 31 bytes from 10.0.1.53:9000: 'dpdk-to-kernel-test-payload #10'
Test complete
[2026-03-12T20:06:39Z] INFO: our-app-sends: sent 10 packets, received 10 responses
[2026-03-12T20:06:39Z] INFO: our-app-sends: PASS (sent >= 5 packets)
[2026-03-12T20:06:39Z] INFO: JUnit XML written to: /tmp/test-results/tier3-our-app-sends.xml
[2026-03-12T20:06:39Z] 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.53: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.53:9000 (MAC: 02:c4:dd:86:73:35)
Using DPDK acceleration (run-to-completion)
✅ Socket created successfully!
📡 Local address: 10.0.1.53:9000
🔄 Echo server running... (Ctrl+C to stop)
Shutting down gracefully...

sender-echo-server.log

🚀 DPDK-STDLIB Echo Server
Binding to 10.0.1.121: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.121:9000 (MAC: 02:39:dc:c2:4b:03)
Using DPDK acceleration (run-to-completion)
✅ Socket created successfully!
📡 Local address: 10.0.1.121:9000
🔄 Echo server running... (Ctrl+C to stop)
Shutting down gracefully...

sender-test-client.log

[2026-03-12T19:55:57Z] INFO: Test: arp_resolution
UDP Test Client
Target: 10.0.1.53:9000
Bind address: 10.0.1.121: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.121:32768 (MAC: 02:39:dc:c2:4b:03)
Backend: dpdk
Sending packets...
Sent 12 bytes: 'arp-probe #1'
Received 12 bytes from 10.0.1.53:9000: 'arp-probe #1'
Test complete
[2026-03-12T19:55:59Z] INFO: ARP resolution succeeded (got response from peer)
[2026-03-12T19:55:59Z] INFO: Test: udp_send_receive
[2026-03-12T19:56:01Z] INFO: UDP send/receive succeeded
[2026-03-12T19:56:01Z] INFO: Test: echo_roundtrip
[2026-03-12T19:56:02Z] INFO: Echo roundtrip succeeded: 5/5 responses received
[2026-03-12T19:56:02Z] INFO: Test: payload_integrity
[2026-03-12T19:56:03Z] INFO: Response received, checking payload match...
[2026-03-12T19:56:03Z] INFO: Payload integrity verified (found in response)
[2026-03-12T19:56:03Z] INFO: JUnit XML written to: /tmp/test-results/tier1-dpdk-echo.xml
[2026-03-12T19:56:03Z] INFO: Tier 1 sender tests complete. Results: /tmp/test-results/tier1-dpdk-echo.xml
[2026-03-12T20:01:59Z] INFO: Test: arp_resolution
UDP Test Client
Target: 10.0.1.53: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.53:9000: 'arp-probe #1'
Test complete
[2026-03-12T20:01:59Z] INFO: ARP resolution succeeded (got response from peer)
[2026-03-12T20:01:59Z] INFO: Test: udp_send_receive
[2026-03-12T20:02:00Z] INFO: UDP send/receive succeeded
[2026-03-12T20:02:00Z] INFO: Test: echo_roundtrip
[2026-03-12T20:02:01Z] INFO: Echo roundtrip succeeded: 5/5 responses received
[2026-03-12T20:02:01Z] INFO: Test: payload_integrity
[2026-03-12T20:02:01Z] INFO: Response received, checking payload match...
[2026-03-12T20:02:01Z] INFO: Payload integrity verified (found in response)
[2026-03-12T20:02:01Z] INFO: JUnit XML written to: /tmp/test-results/tier2-kernel-interop.xml
[2026-03-12T20:02:01Z] INFO: Tier 2 sender tests complete. Results: /tmp/test-results/tier2-kernel-interop.xml

receiver-test-client-iperf.log

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

sender-test-client-iperf.log

[2026-03-12T20:06:37Z] INFO: Pre-flight: checking DPDK state and ARP cache...
[2026-03-12T20:06:37Z] INFO: Local IP: 10.0.1.121, Peer IP: 10.0.1.53, Port: 9000
[2026-03-12T20:06:37Z] INFO: /proc/net/arp contents:
IP address       HW type     Flags       HW address            Mask     Device
10.0.1.53        0x1         0x2         02:c4:dd:86:73:35     *        ens5
10.0.1.121       0x1         0x2         02:39:dc:c2:4b:03     *        ens5
10.0.1.218       0x1         0x2         02:d3:7b:cd:74:5b     *        ens5
10.0.1.81        0x1         0x2         02:4d:d2:70:1b:69     *        ens5
10.0.1.1         0x1         0x2         02:20:29:b4:12:85     *        ens5
[2026-03-12T20:06:37Z] INFO: DPDK runtime state:
No /var/run/dpdk/ directory
[2026-03-12T20:06:37Z] INFO: vfio-pci bindings:
0000:00:06.0
bind
module
new_id
remove_id
uevent
unbind
[2026-03-12T20:06:37Z] INFO: Test binary: /opt/dpdk-stdlib/target/release/test-client
-rwxr-xr-x. 2 root root 1845056 Mar 12 19:53 /opt/dpdk-stdlib/target/release/test-client
[2026-03-12T20:06:37Z] INFO: Launching test-client: /opt/dpdk-stdlib/target/release/test-client --target 10.0.1.53 --port 9000 --bind-ip 10.0.1.121 --count 10 --delay 200
[2026-03-12T20:06:39Z] INFO: Test client output: UDP Test Client
Target: 10.0.1.53:9000
Bind address: 10.0.1.121: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.121:32768 (MAC: 02:39:dc:c2:4b:03)
Backend: dpdk
Sending packets...
Sent 30 bytes: 'dpdk-to-kernel-test-payload #1'
Received 30 bytes from 10.0.1.53:9000: 'dpdk-to-kernel-test-payload #1'
Sent 30 bytes: 'dpdk-to-kernel-test-payload #2'
Received 30 bytes from 10.0.1.53:9000: 'dpdk-to-kernel-test-payload #2'
Sent 30 bytes: 'dpdk-to-kernel-test-payload #3'
Received 30 bytes from 10.0.1.53:9000: 'dpdk-to-kernel-test-payload #3'
Sent 30 bytes: 'dpdk-to-kernel-test-payload #4'
Received 30 bytes from 10.0.1.53:9000: 'dpdk-to-kernel-test-payload #4'
Sent 30 bytes: 'dpdk-to-kernel-test-payload #5'
Received 30 bytes from 10.0.1.53:9000: 'dpdk-to-kernel-test-payload #5'
Sent 30 bytes: 'dpdk-to-kernel-test-payload #6'
Received 30 bytes from 10.0.1.53:9000: 'dpdk-to-kernel-test-payload #6'
Sent 30 bytes: 'dpdk-to-kernel-test-payload #7'
Received 30 bytes from 10.0.1.53:9000: 'dpdk-to-kernel-test-payload #7'
Sent 30 bytes: 'dpdk-to-kernel-test-payload #8'
Received 30 bytes from 10.0.1.53:9000: 'dpdk-to-kernel-test-payload #8'
Sent 30 bytes: 'dpdk-to-kernel-test-payload #9'
Received 30 bytes from 10.0.1.53:9000: 'dpdk-to-kernel-test-payload #9'
Sent 31 bytes: 'dpdk-to-kernel-test-payload #10'
Received 31 bytes from 10.0.1.53:9000: 'dpdk-to-kernel-test-payload #10'
Test complete
[2026-03-12T20:06:39Z] INFO: our-app-sends: sent 10 packets, received 10 responses
[2026-03-12T20:06:39Z] INFO: our-app-sends: PASS (sent >= 5 packets)
[2026-03-12T20:06:39Z] INFO: JUnit XML written to: /tmp/test-results/tier3-our-app-sends.xml
[2026-03-12T20:06:39Z] INFO: our-app-sends test complete
⚠️ SSM Command Failures (receiver-ssm-failure.log)
=== Polling timeout after 30s ===
Status: InProgress
Instance: i-02c8e004af26a1eb2 (receiver)
Command ID: db991fb9-cbd0-4576-a8ab-7f59c3596604

=== STDOUT ===


=== STDERR ===


=== Polling timeout after 30s ===
Status: InProgress
Instance: i-02c8e004af26a1eb2 (receiver)
Command ID: 5bfc2e41-99ac-4cb8-8feb-aa7109eb72d3

=== STDOUT ===


=== STDERR ===


=== Polling timeout after 30s ===
Status: InProgress
Instance: i-02c8e004af26a1eb2 (receiver)
Command ID: 85a951bd-d9be-4ad5-80e4-84e3615498ae

=== STDOUT ===


=== STDERR ===


⚠️ SSM Command Failures (sender-ssm-failure.log)
=== Polling timeout after 30s ===
Status: InProgress
Instance: i-023870f1bcd7171d8 (sender)
Command ID: ac5197f6-ea67-4d7a-8ed3-fc32bdf5c69b

=== 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:0b:97:72:f2:ed brd ff:ff:ff:ff:ff:ff
    altname enp0s5
    altname eni-059f70c4fc37c8400
    altname device-number-0.0
    inet 10.0.1.151/24 metric 512 brd 10.0.1.255 scope global dynamic ens5
       valid_lft 2447sec preferred_lft 2447sec
    inet6 fe80::b:97ff:fe72:f2ed/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:a6:09:bc 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:c4:dd:86:73:35 brd ff:ff:ff:ff:ff:ff
    altname enp0s6
    altname eni-07da5e484e00ca108
    altname device-number-1.0
    inet 10.0.1.53/24 brd 10.0.1.255 scope global ens6
       valid_lft forever preferred_lft forever
    inet6 fe80::c4:ddff:fe86:7335/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:1b:6e:fc:72:e3 brd ff:ff:ff:ff:ff:ff
    altname enp0s5
    altname eni-068368565473a74bf
    altname device-number-0.0
    inet 10.0.1.119/24 metric 512 brd 10.0.1.255 scope global dynamic ens5
       valid_lft 2470sec preferred_lft 2470sec
    inet6 fe80::1b:6eff:fefc:72e3/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:1f:9d:67:ac 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-12T19:55:16Z
hostname: ip-10-0-1-151.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:0b:97:72:f2:ed brd ff:ff:ff:ff:ff:ff
    altname enp0s5
    altname eni-059f70c4fc37c8400
    altname device-number-0.0
    inet 10.0.1.151/24 metric 512 brd 10.0.1.255 scope global dynamic ens5
       valid_lft 3318sec preferred_lft 3318sec
    inet6 fe80::b:97ff:fe72:f2ed/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:a6:09:bc 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.218 dev ens5 lladdr 02:d3:7b:cd:74:5b REACHABLE 
10.0.1.1 dev ens5 lladdr 02:20:29:b4:12:85 REACHABLE 

=== ROUTE TABLE ===
default via 10.0.1.1 dev ens5 proto dhcp src 10.0.1.151 metric 512 
10.0.0.2 via 10.0.1.1 dev ens5 proto dhcp src 10.0.1.151 metric 512 
10.0.1.0/24 dev ens5 proto kernel scope link src 10.0.1.151 metric 512 
10.0.1.1 dev ens5 proto dhcp scope link src 10.0.1.151 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:0b:97:72:f2:ed/ 02:c4:dd:86:73:35/ 

--- ENI: 02:0b:97:72:f2:ed/ ---
  device-number: 0
  local-ipv4s: 10.0.1.151
  subnet-id: subnet-00320fd2769d591b3
  subnet-cidr: 10.0.1.0/24

--- ENI: 02:c4:dd:86:73:35/ ---
  device-number: 1
  local-ipv4s: 10.0.1.53
  subnet-id: subnet-00320fd2769d591b3
  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:20:29:b4:12:85 REACHABLE 

arping result:
ARPING 10.0.1.1 from 10.0.1.151 ens5
Unicast reply from 10.0.1.1 [02:20:29:B4:12:85]  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 12 19:55 .
drwxr-xr-x. 14 root root     3100 Mar 12 19:54 ..
crw-------.  1 root root 243,   0 Mar 12 19:55 noiommu-0
crw-rw-rw-.  1 root root  10, 196 Mar 12 19:50 vfio

noiommu mode:
Y

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

=== DPDK-RELATED DMESG (last 30 lines) ===
[    0.066979] x86/fpu: Enabled xstate features 0x2ff, context size is 2568 bytes, using 'compacted' format.
[    0.073317] audit: type=2000 audit(1773345029.108:1): state=initialized audit_enabled=0 res=1
[    0.074750] kprobes: kprobe jump-optimization is enabled. All kprobes are optimized if possible.
[    0.099379] ACPI: Interpreter enabled
[    0.099379] ACPI: Enabled 2 GPEs in block 00 to 0F
[    0.123364] pci 0000:00:05.0: enabling Extended Tags
[    0.155703] SGI XFS with ACLs, security attributes, quota, no debug enabled
[    0.186299] ACPI: \_SB_.LNKD: Enabled at IRQ 11
[    0.266972] IPI shorthand broadcast: enabled
[    0.267035] AES CTR mode by8 optimization enabled
[    2.585190] systemd[1]: Mounting dev-hugepages.mount - Huge Pages File System...
[    2.634095] systemd[1]: Mounted dev-hugepages.mount - Huge Pages File System.
[    2.678270] VFIO - User Level meta-driver version: 0.3
[    3.759588] ena 0000:00:05.0: Elastic Network Adapter (ENA) v2.16.1g
[    3.779394] ena 0000:00:05.0: ENA device version: 0.10
[    3.780183] ena 0000:00:05.0: ENA controller version: 0.0.1 implementation version 1
[    3.925196] ena 0000:00:05.0: ENA Large LLQ is disabled
[    3.936853] ena 0000:00:05.0: Elastic Network Adapter (ENA) found at mem c0500000, mac addr 02:0b:97:72:f2:ed
[    3.985405] ena 0000:00:05.0 ens5: renamed from eth0
[    5.009729] ena 0000:00:05.0 ens5: Local page cache is disabled for less than 16 channels
[  230.634626] pci 0000:00:06.0: enabling Extended Tags
[  230.638637] ena 0000:00:06.0: enabling device (0000 -> 0002)
[  230.647123] ena 0000:00:06.0: ENA device version: 0.10
[  230.647906] ena 0000:00:06.0: ENA controller version: 0.0.1 implementation version 1
[  230.741057] ena 0000:00:06.0: ENA Large LLQ is disabled
[  230.753609] ena 0000:00:06.0: Elastic Network Adapter (ENA) found at mem c0508000, mac addr 02:c4:dd:86:73:35
[  230.791840] ena 0000:00:06.0 ens6: renamed from eth0
[  231.083897] ena 0000:00:06.0 ens6: Local page cache is disabled for less than 16 channels
[  273.465686] vfio-pci 0000:00:06.0: Adding to iommu group 0
[  273.466976] 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-12T19:55:08Z
hostname: ip-10-0-1-119.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:1b:6e:fc:72:e3 brd ff:ff:ff:ff:ff:ff
    altname enp0s5
    altname eni-068368565473a74bf
    altname device-number-0.0
    inet 10.0.1.119/24 metric 512 brd 10.0.1.255 scope global dynamic ens5
       valid_lft 3326sec preferred_lft 3326sec
    inet6 fe80::1b:6eff:fefc:72e3/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:1f:9d:67:ac 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:20:29:b4:12:85 REACHABLE 

=== ROUTE TABLE ===
default via 10.0.1.1 dev ens5 proto dhcp src 10.0.1.119 metric 512 
10.0.0.2 via 10.0.1.1 dev ens5 proto dhcp src 10.0.1.119 metric 512 
10.0.1.0/24 dev ens5 proto kernel scope link src 10.0.1.119 metric 512 
10.0.1.1 dev ens5 proto dhcp scope link src 10.0.1.119 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:1b:6e:fc:72:e3/ 02:39:dc:c2:4b:03/ 

--- ENI: 02:1b:6e:fc:72:e3/ ---
  device-number: 0
  local-ipv4s: 10.0.1.119
  subnet-id: subnet-00320fd2769d591b3
  subnet-cidr: 10.0.1.0/24

--- ENI: 02:39:dc:c2:4b:03/ ---
  device-number: 1
  local-ipv4s: 10.0.1.121
  subnet-id: subnet-00320fd2769d591b3
  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:20:29:b4:12:85 REACHABLE 

arping result:
ARPING 10.0.1.1 from 10.0.1.119 ens5
Unicast reply from 10.0.1.1 [02:20:29:B4:12:85]  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 12 19:54 .
drwxr-xr-x. 14 root root     3100 Mar 12 19:53 ..
crw-------.  1 root root 243,   0 Mar 12 19:54 noiommu-0
crw-rw-rw-.  1 root root  10, 196 Mar 12 19:50 vfio

noiommu mode:
Y

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

=== DPDK-RELATED DMESG (last 30 lines) ===
[    0.066787] x86/fpu: Enabled xstate features 0x2ff, context size is 2568 bytes, using 'compacted' format.
[    0.073111] audit: type=2000 audit(1773345028.091:1): state=initialized audit_enabled=0 res=1
[    0.074604] kprobes: kprobe jump-optimization is enabled. All kprobes are optimized if possible.
[    0.099407] ACPI: Interpreter enabled
[    0.099407] ACPI: Enabled 2 GPEs in block 00 to 0F
[    0.123097] pci 0000:00:05.0: enabling Extended Tags
[    0.155460] SGI XFS with ACLs, security attributes, quota, no debug enabled
[    0.205162] ACPI: \_SB_.LNKD: Enabled at IRQ 11
[    0.266260] IPI shorthand broadcast: enabled
[    0.266321] AES CTR mode by8 optimization enabled
[    2.665245] systemd[1]: Mounting dev-hugepages.mount - Huge Pages File System...
[    2.703206] systemd[1]: Mounted dev-hugepages.mount - Huge Pages File System.
[    2.768863] VFIO - User Level meta-driver version: 0.3
[    3.890382] ena 0000:00:05.0: Elastic Network Adapter (ENA) v2.16.1g
[    3.901607] ena 0000:00:05.0: ENA device version: 0.10
[    3.902358] ena 0000:00:05.0: ENA controller version: 0.0.1 implementation version 1
[    4.005011] ena 0000:00:05.0: ENA Large LLQ is disabled
[    4.017157] ena 0000:00:05.0: Elastic Network Adapter (ENA) found at mem c0500000, mac addr 02:1b:6e:fc:72:e3
[    4.075068] ena 0000:00:05.0 ens5: renamed from eth0
[    5.347021] ena 0000:00:05.0 ens5: Local page cache is disabled for less than 16 channels
[  210.842389] pci 0000:00:06.0: enabling Extended Tags
[  210.846294] ena 0000:00:06.0: enabling device (0000 -> 0002)
[  210.859583] ena 0000:00:06.0: ENA device version: 0.10
[  210.860372] ena 0000:00:06.0: ENA controller version: 0.0.1 implementation version 1
[  210.956592] ena 0000:00:06.0: ENA Large LLQ is disabled
[  210.966486] ena 0000:00:06.0: Elastic Network Adapter (ENA) found at mem c0508000, mac addr 02:39:dc:c2:4b:03
[  211.004469] ena 0000:00:06.0 ens6: renamed from eth0
[  211.438715] ena 0000:00:06.0 ens6: Local page cache is disabled for less than 16 channels
[  267.339521] vfio-pci 0000:00:06.0: Adding to iommu group 0
[  267.340867] 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.073300] pid_max: default: 32768 minimum: 301
[    0.125463] iommu: Default domain type: Translated 
[    0.126204] NetLabel:  unlabeled traffic allowed by default
[    0.133357] PCI: CLS 0 bytes, default 64
[    0.205271] nvme nvme0: 2/0/0 default/read/poll queues
[    0.433363] 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.433459] systemd[1]: No hostname configured, using default hostname.
[    0.528741] systemd[1]: Queued start job for default target initrd.target.
[    1.773136] 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.011463] bridge: filtering via arp/ip/ip6tables is no longer available by default. Update your scripts to load br_netfilter if you need this.
[  313.902863] vfio-pci 0000:00:06.0: vfio-noiommu device opened by user (echo:6495)
[  674.727355] vfio-pci 0000:00:06.0: vfio-noiommu device opened by user (echo:22273)

sender-dmesg-crashes.log

[    0.073090] pid_max: default: 32768 minimum: 301
[    0.125216] iommu: Default domain type: Translated 
[    0.125957] NetLabel:  unlabeled traffic allowed by default
[    0.133090] PCI: CLS 0 bytes, default 64
[    0.230693] nvme nvme0: 2/0/0 default/read/poll queues
[    0.432355] 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.432451] systemd[1]: No hostname configured, using default hostname.
[    0.528216] systemd[1]: Queued start job for default target initrd.target.
[    1.633793] 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)
[   10.061446] bridge: filtering via arp/ip/ip6tables is no longer available by default. Update your scripts to load br_netfilter if you need this.
[ 1016.104361] vfio-pci 0000:00:06.0: vfio-noiommu device opened by user (echo:18857)
Kernel Console (dmesg)

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

[  230.633351] pci 0000:00:06.0: reg 0x18: [mem 0x00000000-0x000fffff pref]
[  230.634626] pci 0000:00:06.0: enabling Extended Tags
[  230.636545] pci 0000:00:06.0: BAR 2: assigned [mem 0xc0600000-0xc06fffff pref]
[  230.637600] pci 0000:00:06.0: BAR 0: assigned [mem 0xc0508000-0xc050bfff]
[  230.638637] ena 0000:00:06.0: enabling device (0000 -> 0002)
[  230.647123] ena 0000:00:06.0: ENA device version: 0.10
[  230.647906] ena 0000:00:06.0: ENA controller version: 0.0.1 implementation version 1
[  230.741057] ena 0000:00:06.0: ENA Large LLQ is disabled
[  230.753609] ena 0000:00:06.0: Elastic Network Adapter (ENA) found at mem c0508000, mac addr 02:c4:dd:86:73:35
[  230.791840] ena 0000:00:06.0 ens6: renamed from eth0
[  231.083897] ena 0000:00:06.0 ens6: Local page cache is disabled for less than 16 channels
[  273.465686] vfio-pci 0000:00:06.0: Adding to iommu group 0
[  273.466976] vfio-pci 0000:00:06.0: Adding kernel taint for vfio-noiommu group on device
[  313.902863] vfio-pci 0000:00:06.0: vfio-noiommu device opened by user (echo:6495)
[  390.522078] vfio-pci 0000:00:06.0: Removing from iommu group 0
[  391.536179] ena 0000:00:06.0: ENA device version: 0.10
[  391.536952] ena 0000:00:06.0: ENA controller version: 0.0.1 implementation version 1
[  391.631195] ena 0000:00:06.0: ENA Large LLQ is disabled
[  391.641061] ena 0000:00:06.0: Elastic Network Adapter (ENA) found at mem c0508000, mac addr 02:c4:dd:86:73:35
[  391.650451] ena 0000:00:06.0 eth0: Local page cache is disabled for less than 16 channels
[  472.271515] vfio-pci 0000:00:06.0: Adding to iommu group 0
[  472.272837] vfio-pci 0000:00:06.0: Adding kernel taint for vfio-noiommu group on device
[  674.727355] vfio-pci 0000:00:06.0: vfio-noiommu device opened by user (echo:22273)
[  752.688501] vfio-pci 0000:00:06.0: Removing from iommu group 0
[  753.702259] ena 0000:00:06.0: ENA device version: 0.10
[  753.703032] ena 0000:00:06.0: ENA controller version: 0.0.1 implementation version 1
[  753.803653] ena 0000:00:06.0: ENA Large LLQ is disabled
[  753.815472] ena 0000:00:06.0: Elastic Network Adapter (ENA) found at mem c0508000, mac addr 02:c4:dd:86:73:35
[  753.863808] ena 0000:00:06.0 ens6: renamed from eth0
[  753.952411] 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.838959] pci 0000:00:06.0: [1d0f:ec20] type 00 class 0x020000
[  210.840062] pci 0000:00:06.0: reg 0x10: [mem 0x00000000-0x00003fff]
[  210.841103] pci 0000:00:06.0: reg 0x18: [mem 0x00000000-0x000fffff pref]
[  210.842389] pci 0000:00:06.0: enabling Extended Tags
[  210.844179] pci 0000:00:06.0: BAR 2: assigned [mem 0xc0600000-0xc06fffff pref]
[  210.845263] pci 0000:00:06.0: BAR 0: assigned [mem 0xc0508000-0xc050bfff]
[  210.846294] ena 0000:00:06.0: enabling device (0000 -> 0002)
[  210.859583] ena 0000:00:06.0: ENA device version: 0.10
[  210.860372] ena 0000:00:06.0: ENA controller version: 0.0.1 implementation version 1
[  210.956592] ena 0000:00:06.0: ENA Large LLQ is disabled
[  210.966486] ena 0000:00:06.0: Elastic Network Adapter (ENA) found at mem c0508000, mac addr 02:39:dc:c2:4b:03
[  211.004469] ena 0000:00:06.0 ens6: renamed from eth0
[  211.438715] ena 0000:00:06.0 ens6: Local page cache is disabled for less than 16 channels
[  267.339521] vfio-pci 0000:00:06.0: Adding to iommu group 0
[  267.340867] vfio-pci 0000:00:06.0: Adding kernel taint for vfio-noiommu group on device
[  331.026546] vfio-pci 0000:00:06.0: vfio-noiommu device opened by user (tokio-rt-worker:7246)
[  331.776471] vfio-pci 0000:00:06.0: vfio-noiommu device opened by user (tokio-rt-worker:7267)
[  333.516476] vfio-pci 0000:00:06.0: vfio-noiommu device opened by user (tokio-rt-worker:7289)
[  335.076483] vfio-pci 0000:00:06.0: vfio-noiommu device opened by user (tokio-rt-worker:7314)
[  381.368403] vfio-pci 0000:00:06.0: Removing from iommu group 0
[  382.381688] ena 0000:00:06.0: ENA device version: 0.10
[  382.382474] ena 0000:00:06.0: ENA controller version: 0.0.1 implementation version 1
[  382.483703] ena 0000:00:06.0: ENA Large LLQ is disabled
[  382.495937] ena 0000:00:06.0: Elastic Network Adapter (ENA) found at mem c0508000, mac addr 02:39:dc:c2:4b:03
[  382.543927] ena 0000:00:06.0 ens6: renamed from eth0
[  382.575816] ena 0000:00:06.0 ens6: Local page cache is disabled for less than 16 channels
[  774.946663] vfio-pci 0000:00:06.0: Adding to iommu group 0
[  774.948124] vfio-pci 0000:00:06.0: Adding kernel taint for vfio-noiommu group on device
[  969.384501] vfio-pci 0000:00:06.0: vfio-noiommu device opened by user (tokio-rt-worker:18064)
[ 1016.104361] vfio-pci 0000:00:06.0: vfio-noiommu device opened by user (echo:18857)

@gspivey
gspivey deleted the claude/performance-optimization-phase-one-7mAY5 branch March 17, 2026 03:25
gspivey pushed a commit that referenced this pull request Jun 16, 2026
gspivey added a commit that referenced this pull request Jun 16, 2026
## Roadmap Item

Implements ROADMAP item #23: `dpdk-stdlib-tcp: Engine — on_tick
(tx-drain and RTO)`

Spec: `.kiro/specs/tcp-support/` · tasks 5.14, 5.15

## Changes

### Task 5.14: TX Drain
- Drain `tx_ring` → `send_buf` → segment respecting
`effective_window(rwnd)` → transmit
- Segments at MSS boundaries, respects Nagle algorithm
- Wakes condvar + `write_waker` when send window opens (enables blocked
writers to resume)
- Only runs for ESTABLISHED and CLOSE_WAIT connections

### Task 5.15: RTO (Retransmission Timeout)
- Retransmit oldest unacked segment on RTO expiry
- Double RTO on each retransmit (exponential backoff, capped at 60s)
- Collapse cwnd to 1 MSS on timeout (RFC 5681)
- Abort after `max_retries` (default 15) → latch `TimedOut` on
ConnectionHandle
- Fulfil pending connect oneshot on abort

### Config Addition
- Added `max_retries: u32` field to `EngineConfig` (default 15)

## Tests Added

14 new unit tests covering:
- TX drain: basic data send, effective window limiting, MSS
segmentation, RTO arming, retransmit queue population, snd_nxt
advancement, write_waker notification, zero-window blocking, Nagle
buffering, TCP_NODELAY override
- RTO: retransmission on expiry, exponential backoff, abort after max
retries (with TimedOut latch), cwnd collapse, empty retransmit queue
safety, state filtering (SYN_SENT doesn't drain)

## Tradeoffs

- The retransmit implementation reads payload from `send_buf` via
iterator (not zero-copy from the original VecDeque). This is acceptable
at MVP; a contiguous-slice optimization can be added later if profiling
shows overhead.

## Verification

All 945 workspace tests pass (`cargo build && cargo test`).

---------

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