Skip to content

tokio UDP perf (0.3.1): tokio-echo fair/concurrent modes - #138

Merged
gspivey merged 1 commit into
developmentfrom
agent/tokio-echo-fair-concurrent-modes
Oct 26, 2026
Merged

gspivey merged 1 commit into
developmentfrom
agent/tokio-echo-fair-concurrent-modes

Conversation

@gspivey

@gspivey gspivey commented Oct 26, 2026

Copy link
Copy Markdown
Owner

Roadmap item

ROADMAP item 45 — tokio UDP perf (0.3.1): tokio-echo fair/concurrent modes (PR 1 of the tokio-udp-perf spec).

Spec: .kiro/specs/tokio-udp-perf/ · tasks 1.1, 1.2, 1.3, 1.4, 1.4a, 1.5, 1.6, 1.7.

Boundary: apps/tokio-echo/src/main.rs only (plus its tests). No library or harness change; no published-crate API change.

What this does

  • --mode {fair|concurrent} clap ValueEnum arg, default fair; an unknown value is rejected with a non-zero exit and a clear message during Args::parse() (1.3).
  • fair (default): receive then send the same bytes back in the same task via echo_fair() — no to_vec, no Semaphore, no tokio::spawn, no tokio::time::timeout (1.1).
  • concurrent: the E2 "spawn" pattern — buf[..len].to_vec(), acquire an owned Semaphore permit, tokio::spawn, send under tokio::time::timeout, echoing the exact received bytes (no more format!("echo: {}", ..)) (1.2). --workers/--timeout apply only here (1.8).
  • All from_utf8_lossy/format! payload work is gated behind --verbose in both modes; non-verbose echoes exact bytes (1.4, 1.5).
  • Prints mode=<fair|concurrent> at startup; keeps the SIGTERM/SIGINT shutdown select! and disable_perf_reporting() so [NIC-FINAL] is still emitted (1.6, 1.7).
  • Adds a parse-only --idle-backoff-ms <N> flag (default absent = OFF), printed at startup. PR 1 deliberately does not reference set_idle_backoff (that method lands in PR 5) (1.4a / 1.8).

Tests added (task 1.5)

The receive-loop body is factored into echo_fair / echo_concurrent_handler so the test can call it directly over a loopback TokioUdpSocket (the --force-tokio backend):

  • fair_echoes_exact_bytes_over_loopback — fair echoes exact bytes, including non-UTF-8 bytes (proves no format!/from_utf8_lossy transform on the hot path).
  • concurrent_echoes_exact_bytes_no_prefix — concurrent echoes exact bytes with no echo: prefix (regression guard for the old behaviour).
  • clap arg tests: fair default, fair/concurrent accepted, --mode bogus rejected (InvalidValue), --idle-backoff-ms optional, existing flags still parse, Args::command().debug_assert().

cargo build && cargo test from the workspace root is green in stub mode (tokio-echo: 8/8; full suite: all passing, no regressions) (1.6).

Tradeoffs

  • Task 1.5 allows either assert_cmd or factoring the loop into a directly-callable function. I chose the latter to avoid adding a new dev-dependency (per AGENTS.md: keep the dependency surface small), which also keeps the test fast and deterministic (no subprocess/signal orchestration).
  • Per task 1.7, the perf workflow run that records the new tokio-dpdk fair baseline in docs/perf-test-log.md is run after CI is green (the benchmarked app's fair default changes its numbers ~2.3×). PR 1 adds no perf gates (the gate harness lands in PR 2), so that run records a new baseline, not a gate.

Implement tasks 1.1-1.7 of the tokio-udp-perf (0.3.1) spec, scoped to
apps/tokio-echo/src/main.rs only (no library or harness change).

- Add a --mode {fair|concurrent} clap ValueEnum arg, defaulting to fair;
  unknown values are rejected with a non-zero exit and a clear message
  during Args::parse() (Req 1.3).
- fair (default): receive then send the same bytes back in the SAME task
  via echo_fair() - no to_vec, no Semaphore, no tokio::spawn, no
  tokio::time::timeout (Req 1.1).
- concurrent: the E2 'spawn' pattern - buf[..len].to_vec(), acquire an
  owned Semaphore permit, tokio::spawn, and send under tokio::time::timeout,
  echoing the EXACT received bytes (no more format!("echo: {}", ..)) (Req 1.2).
  --workers/--timeout apply only in this mode (Req 1.8).
- Gate all from_utf8_lossy/format! payload work behind --verbose in both
  modes; echo exact bytes when not verbose (Req 1.4, 1.5).
- Print mode=<fair|concurrent> at startup; keep the SIGTERM/SIGINT shutdown
  select! and disable_perf_reporting() so [NIC-FINAL] is still emitted
  (Req 1.6, 1.7).
- Add a parse-only --idle-backoff-ms <N> flag (default absent = OFF),
  printed at startup; PR 1 does NOT reference set_idle_backoff (lands in
  PR 5) (Req 1.4a / 1.8).

Tests (Req 1.5): factor the receive-loop body into echo_fair and
echo_concurrent_handler and exercise them over a loopback TokioUdpSocket
(the --force-tokio backend) - fair echoes exact (incl. non-UTF-8) bytes,
concurrent echoes exact bytes with no 'echo: ' prefix - plus clap arg tests
asserting fair default, fair/concurrent accepted, --mode bogus rejected, and
--idle-backoff-ms optional. Avoids a new assert_cmd dependency per task 1.5's
allowance to factor the loop into a directly-callable function.
@github-actions

Copy link
Copy Markdown

TCP Synthetic Performance Results (run)

Commit: df4f453f

TCP Synthetic Performance Results

Measures TCP engine framework overhead using a mock PacketBackend.

Test Metric Value Unit
connection_establishment latency_ns 1881 ns
single_stream_throughput throughput_mbps 4532.2 Mbps
engine_tick latency_ns 704 ns

conn_est=1881ns, throughput=4532.2Mbps, tick=704ns

@github-actions

Copy link
Copy Markdown

Synthetic Performance Results (run)

Commit: df4f453f

✅ synthetic UDP socket bound to 10.0.0.1:9000 (MAC: 02:00:00:00:00:01)
✅ synthetic UDP socket bound to 10.0.0.1:9000 (MAC: 02:00:00:00:00:01)
✅ synthetic UDP socket bound to [2001:db8::1]:9000 (MAC: 02:00:00:00:00:01)
✅ synthetic UDP socket bound to [2001:db8::1]:9000 (MAC: 02:00:00:00:00:01)
✅ synthetic UDP socket bound to 10.0.0.1:9000 (MAC: 02:00:00:00:00:01)
✅ synthetic UDP socket bound to 10.0.0.1:9000 (MAC: 02:00:00:00:00:01)
✅ synthetic UDP socket bound to [2001:db8::1]:9000 (MAC: 02:00:00:00:00:01)
✅ synthetic UDP socket bound to [2001:db8::1]:9000 (MAC: 02:00:00:00:00:01)
✅ synthetic UDP socket bound to 10.0.0.1:9000 (MAC: 02:00:00:00:00:01)
✅ synthetic UDP socket bound to 10.0.0.1:9000 (MAC: 02:00:00:00:00:01)
✅ synthetic UDP socket bound to [2001:db8::1]:9000 (MAC: 02:00:00:00:00:01)
✅ synthetic UDP socket bound to [2001:db8::1]:9000 (MAC: 02:00:00:00:00:01)
✅ synthetic UDP socket bound to 10.0.0.1:9000 (MAC: 02:00:00:00:00:01)
✅ synthetic UDP socket bound to 10.0.0.1:9000 (MAC: 02:00:00:00:00:01)
✅ synthetic UDP socket bound to [2001:db8::1]:9000 (MAC: 02:00:00:00:00:01)
✅ synthetic UDP socket bound to [2001:db8::1]:9000 (MAC: 02:00:00:00:00:01)

Synthetic UDP Performance Results

Measures framework overhead: sync dpdk_udp::UdpSocket vs async (std::sync::Mutex + try_recv_from).

IPv4 Baseline

Test Payload Sync PPS Async PPS Ratio (sync/async) Async ns/op
TX send_to 64B 16.3M 14.2M 1.1x 70
RX recv_from 64B 4.4M 5.2M 0.9x 191
TX send_to 1400B 3.0M 2.9M 1.0x 339
RX recv_from 1400B 1.5M 1.6M 0.9x 608

IPv6

Test Payload Sync PPS Async PPS Ratio (sync/async) Async ns/op
TX send_to (IPv6) 64B 12.0M 11.3M 1.1x 88
RX recv_from (IPv6) 64B 4.8M 6.1M 0.8x 163
TX send_to (IPv6) 1400B 4.6M 4.6M 1.0x 218
RX recv_from (IPv6) 1400B 1.5M 1.7M 0.9x 593

IPv6 vs IPv4 Comparison (sync path)

Test Payload IPv4 PPS IPv6 PPS IPv4/IPv6 Ratio
TX send_to (sync) 64B 16.3M 12.0M 1.36x
RX recv_from (sync) 64B 4.4M 4.8M 0.93x
TX send_to (sync) 1400B 3.0M 4.6M 0.66x
RX recv_from (sync) 1400B 1.5M 1.5M 1.00x

IPv4 avg sync/async ratio: 1.0x, worst: 1.1x | IPv6 vs IPv4 worst ratio: 1.36x (OK)

OK: IPv6 is 35.7% slower than IPv4 — within acceptable threshold (<50%). Expected due to larger headers (40B vs 20B) and mandatory UDP checksum.

Good: Async wrapper is within 1.1x of sync — minimal framework overhead.

@github-actions

Copy link
Copy Markdown

Synthetic Performance Results — Graviton (run)

Commit: df4f453f

✅ synthetic UDP socket bound to 10.0.0.1:9000 (MAC: 02:00:00:00:00:01)
✅ synthetic UDP socket bound to 10.0.0.1:9000 (MAC: 02:00:00:00:00:01)
✅ synthetic UDP socket bound to [2001:db8::1]:9000 (MAC: 02:00:00:00:00:01)
✅ synthetic UDP socket bound to [2001:db8::1]:9000 (MAC: 02:00:00:00:00:01)
✅ synthetic UDP socket bound to 10.0.0.1:9000 (MAC: 02:00:00:00:00:01)
✅ synthetic UDP socket bound to 10.0.0.1:9000 (MAC: 02:00:00:00:00:01)
✅ synthetic UDP socket bound to [2001:db8::1]:9000 (MAC: 02:00:00:00:00:01)
✅ synthetic UDP socket bound to [2001:db8::1]:9000 (MAC: 02:00:00:00:00:01)
✅ synthetic UDP socket bound to 10.0.0.1:9000 (MAC: 02:00:00:00:00:01)
✅ synthetic UDP socket bound to 10.0.0.1:9000 (MAC: 02:00:00:00:00:01)
✅ synthetic UDP socket bound to [2001:db8::1]:9000 (MAC: 02:00:00:00:00:01)
✅ synthetic UDP socket bound to [2001:db8::1]:9000 (MAC: 02:00:00:00:00:01)
✅ synthetic UDP socket bound to 10.0.0.1:9000 (MAC: 02:00:00:00:00:01)
✅ synthetic UDP socket bound to 10.0.0.1:9000 (MAC: 02:00:00:00:00:01)
✅ synthetic UDP socket bound to [2001:db8::1]:9000 (MAC: 02:00:00:00:00:01)
✅ synthetic UDP socket bound to [2001:db8::1]:9000 (MAC: 02:00:00:00:00:01)

Synthetic UDP Performance Results

Measures framework overhead: sync dpdk_udp::UdpSocket vs async (std::sync::Mutex + try_recv_from).

IPv4 Baseline

Test Payload Sync PPS Async PPS Ratio (sync/async) Async ns/op
TX send_to 64B 11.7M 11.2M 1.0x 89
RX recv_from 64B 3.6M 4.6M 0.8x 215
TX send_to 1400B 1.8M 1.8M 1.0x 557
RX recv_from 1400B 1.1M 1.2M 0.9x 840

IPv6

Test Payload Sync PPS Async PPS Ratio (sync/async) Async ns/op
TX send_to (IPv6) 64B 8.8M 8.4M 1.0x 118
RX recv_from (IPv6) 64B 4.0M 5.5M 0.7x 182
TX send_to (IPv6) 1400B 2.9M 2.9M 1.0x 348
RX recv_from (IPv6) 1400B 1.1M 1.2M 0.9x 824

IPv6 vs IPv4 Comparison (sync path)

Test Payload IPv4 PPS IPv6 PPS IPv4/IPv6 Ratio
TX send_to (sync) 64B 11.7M 8.8M 1.33x
RX recv_from (sync) 64B 3.6M 4.0M 0.89x
TX send_to (sync) 1400B 1.8M 2.9M 0.64x
RX recv_from (sync) 1400B 1.1M 1.1M 0.97x

IPv4 avg sync/async ratio: 0.9x, worst: 1.0x | IPv6 vs IPv4 worst ratio: 1.33x (OK)

OK: IPv6 is 32.9% slower than IPv4 — within acceptable threshold (<50%). Expected due to larger headers (40B vs 20B) and mandatory UDP checksum.

Good: Async wrapper is within 1.0x of sync — minimal framework overhead.

@github-actions

Copy link
Copy Markdown

[CI] Stage: Deploy

Infrastructure ready.

  • Sender: i-0cba470138777f914 (DPDK ENI: 10.0.1.136)
  • Receiver: i-0ed38b44e3d05e99d (DPDK ENI: 10.0.1.143)
  • Both instances SSM-ready.

@github-actions

Copy link
Copy Markdown

[CI] Stage: Deploy

Infrastructure ready.

  • Sender: i-019198a7d4dbbbce5 (DPDK ENI: 10.0.1.226)
  • Receiver: i-0af919adb83d370c4 (DPDK ENI: 10.0.1.53)
  • Both instances SSM-ready.

@github-actions

Copy link
Copy Markdown

[CI] Stage: Deploy

Infrastructure ready.

  • Sender: i-06ba777f458775acb (DPDK ENI: 10.0.1.111)
  • Receiver: i-0a1cb0c1109b67ba5 (DPDK ENI: 10.0.1.245)
  • Both instances SSM-ready.

@github-actions

Copy link
Copy Markdown

Integration Tests — ✅ all passed

df4f453 · run · QUIC Integration Tests · 2 tests: 2 ✅ · 0 ❌ real · 0 ⚠️ infra

Tier Test Result Time Reason
tier1-quic-handshake quic_handshake ✅ pass 1.057s
tier1-quic-handshake quic_bidir_echo ✅ pass 0.846s

✅ All 2 tests passed

@github-actions

Copy link
Copy Markdown

Integration Tests — ✅ all passed

df4f453 · run · Integration Tests · 17 tests: 17 ✅ · 0 ❌ real · 0 ⚠️ infra

Tier Test Result Time Reason
tier1-dpdk-echo arp_resolution ✅ pass 0.701s
tier1-dpdk-echo udp_send_receive ✅ pass 1.703s
tier1-dpdk-echo echo_roundtrip ✅ pass 1.522s
tier1-dpdk-echo payload_integrity ✅ pass 0.715s
tier1-dpdk-echo jumbo_diagnostics ✅ pass 0.021s
tier1-dpdk-echo jumbo_echo_8000 ✅ pass 1.720s
tier1-tcp-echo bidir_echo ✅ pass 0.707s
tier1-tcp-echo bidir_multi ✅ pass 0.730s
tier1-tcp-echo bidir_echo ✅ pass 0.702s
tier1-tcp-echo bidir_multi ✅ pass 0.739s
tier2-kernel-interop arp_resolution ✅ pass 0.290s
tier2-kernel-interop udp_send_receive ✅ pass 1.068s
tier2-kernel-interop echo_roundtrip ✅ pass 0.871s
tier2-kernel-interop payload_integrity ✅ pass 0.070s
tier2-tcp-echo kernel_to_dpdk_echo ✅ pass 0.022s
tier3-iperf-interop iperf_sends ✅ pass 1.880s
tier3-iperf-interop our_app_sends ✅ pass 2.521s

✅ All 17 tests passed

@github-actions

Copy link
Copy Markdown

Integration Tests — ✅ all passed

df4f453 · run · Integration Tests (Graviton) · 17 tests: 17 ✅ · 0 ❌ real · 0 ⚠️ infra

Tier Test Result Time Reason
tier1-dpdk-echo arp_resolution ✅ pass 0.704s
tier1-dpdk-echo udp_send_receive ✅ pass 1.703s
tier1-dpdk-echo echo_roundtrip ✅ pass 1.493s
tier1-dpdk-echo payload_integrity ✅ pass 0.695s
tier1-dpdk-echo jumbo_diagnostics ✅ pass 0.017s
tier1-dpdk-echo jumbo_echo_8000 ✅ pass 1.696s
tier1-tcp-echo bidir_echo ✅ pass 0.698s
tier1-tcp-echo bidir_multi ✅ pass 0.701s
tier1-tcp-echo bidir_echo ✅ pass 0.683s
tier1-tcp-echo bidir_multi ✅ pass 0.710s
tier2-kernel-interop arp_resolution ✅ pass 0.305s
tier2-kernel-interop udp_send_receive ✅ pass 1.037s
tier2-kernel-interop echo_roundtrip ✅ pass 0.840s
tier2-kernel-interop payload_integrity ✅ pass 0.037s
tier2-tcp-echo kernel_to_dpdk_echo ✅ pass 0.022s
tier3-iperf-interop iperf_sends ✅ pass 1.854s
tier3-iperf-interop our_app_sends ✅ pass 2.505s

✅ All 17 tests passed

@github-actions

Copy link
Copy Markdown

✅ QUIC Integration Tests Passed (run)

Branch: 138/merge | Commit: df4f453f

Test Results

  • tier1-quic-handshake.xml: 2 tests, 0 failures, skipped

Summary: 2 tests, 0 failures, 0 skipped

Application Logs (last 20 lines each)
Network 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:ff:c8:3e:6f:21 brd ff:ff:ff:ff:ff:ff
    altname enp0s5
    altname eni-0093ef3dd4eaafcab
    altname device-number-0.0
    inet 10.0.1.154/24 metric 512 brd 10.0.1.255 scope global dynamic ens5
       valid_lft 2978sec preferred_lft 2978sec
    inet6 fe80::ff:c8ff:fe3e:6f21/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:ff:c8:13:c6:f9 brd ff:ff:ff:ff:ff:ff
    altname enp0s5
    altname eni-05c917d909ba37b9d
    altname device-number-0.0
    inet 10.0.1.234/24 metric 512 brd 10.0.1.255 scope global dynamic ens5
       valid_lft 3000sec preferred_lft 3000sec
    inet6 fe80::ff:c8ff:fe13:c6f9/64 scope link proto kernel_ll 
       valid_lft forever preferred_lft forever

@github-actions

Copy link
Copy Markdown

[Perf] Stage: Deploy

Deploying PerfTestStack...
Configs: plain-rust,rust-dpdk,tokio-dpdk,native-dpdk
Packet sizes: 64,512,1400,8500

@github-actions

Copy link
Copy Markdown

✅ Integration Tests Passed (Run 40256846781)

Branch: 138/merge | Commit: df4f453f

Test Results

  • tier1-dpdk-echo.xml: 6 tests, 0 failures, skipped
  • tier1-tcp-echo-async.xml: 2 tests, 0 failures, skipped
  • tier1-tcp-echo.xml: 2 tests, 0 failures, skipped
  • tier2-kernel-interop.xml: 4 tests, 0 failures, skipped
  • tier2-tcp-echo.xml: 1 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

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
Warning: Some RX offloads not supported by device (flags: 0x1)
Warning: Some TX offloads not supported by device (flags: 0x1)
✅ DPDK UDP socket bound to 10.0.1.245:9000 (MAC: 02:ff:c7:69:c2:25)
echo listening on 10.0.1.245:9000 (MTU=9001, max_udp_payload=8973)
Shutting down gracefully...

sender-echo-server.log

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
Warning: Some RX offloads not supported by device (flags: 0x1)
Warning: Some TX offloads not supported by device (flags: 0x1)
✅ DPDK UDP socket bound to 10.0.1.111:9000 (MAC: 02:ff:fa:68:28:6b)
echo listening on 10.0.1.111:9000 (MTU=9001, max_udp_payload=8973)
Shutting down gracefully...

sender-test-client.log

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
Warning: Some RX offloads not supported by device (flags: 0x1)
Warning: Some TX offloads not supported by device (flags: 0x1)
✅ DPDK UDP socket bound to 10.0.1.111:32768 (MAC: 02:ff:fa:68:28:6b)
Backend: dpdk
Sending packets...
Sent 8000 bytes (binary payload)
Received 8000 bytes from 10.0.1.245:9000 (expected 8000, OK)
Sent 8000 bytes (binary payload)
Received 8000 bytes from 10.0.1.245:9000 (expected 8000, OK)
Sent 8000 bytes (binary payload)
Received 8000 bytes from 10.0.1.245:9000 (expected 8000, OK)
Test complete
[2026-10-26T02:20:43Z] INFO: Jumbo frame echo succeeded: 3/3 responses with correct size
[2026-10-26T02:20:43Z] INFO: JUnit XML written to: /tmp/test-results/tier1-dpdk-echo.xml
[2026-10-26T02:20:43Z] INFO: Tier 1 sender tests complete. Results: /tmp/test-results/tier1-dpdk-echo.xml

receiver-test-client-iperf.log

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

sender-test-client-iperf.log

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

receiver-echo-server.log

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
Warning: Some RX offloads not supported by device (flags: 0x1)
Warning: Some TX offloads not supported by device (flags: 0x1)
✅ DPDK UDP socket bound to 10.0.1.245:9000 (MAC: 02:ff:c7:69:c2:25)
echo listening on 10.0.1.245:9000 (MTU=9001, max_udp_payload=8973)
Shutting down gracefully...

sender-echo-server.log

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
Warning: Some RX offloads not supported by device (flags: 0x1)
Warning: Some TX offloads not supported by device (flags: 0x1)
✅ DPDK UDP socket bound to 10.0.1.111:9000 (MAC: 02:ff:fa:68:28:6b)
echo listening on 10.0.1.111:9000 (MTU=9001, max_udp_payload=8973)
Shutting down gracefully...

sender-test-client.log

[2026-10-26T02:14:11Z] INFO: Test: arp_resolution
UDP Test Client
Target: 10.0.1.245: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.245:9000: 'arp-probe #1'
Test complete
[2026-10-26T02:14:11Z] INFO: ARP resolution succeeded (got response from peer)
[2026-10-26T02:14:11Z] INFO: Test: udp_send_receive
[2026-10-26T02:14:12Z] INFO: UDP send/receive succeeded
[2026-10-26T02:14:12Z] INFO: Test: echo_roundtrip
[2026-10-26T02:14:13Z] INFO: Echo roundtrip succeeded: 5/5 responses received
[2026-10-26T02:14:13Z] INFO: Test: payload_integrity
[2026-10-26T02:14:13Z] INFO: Response received, checking payload match...
[2026-10-26T02:14:13Z] INFO: Payload integrity verified (found in response)
[2026-10-26T02:14:13Z] INFO: JUnit XML written to: /tmp/test-results/tier2-kernel-interop.xml
[2026-10-26T02:14:13Z] INFO: Tier 2 sender tests complete. Results: /tmp/test-results/tier2-kernel-interop.xml
[2026-10-26T02:20:37Z] INFO: Test: arp_resolution
UDP Test Client
Target: 10.0.1.245:9000
Bind address: 10.0.1.111: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
Warning: Some RX offloads not supported by device (flags: 0x1)
Warning: Some TX offloads not supported by device (flags: 0x1)
✅ DPDK UDP socket bound to 10.0.1.111:32768 (MAC: 02:ff:fa:68:28:6b)
Backend: dpdk
Sending packets...
Sent 12 bytes: 'arp-probe #1'
Received 12 bytes from 10.0.1.245:9000: 'arp-probe #1'
Test complete
[2026-10-26T02:20:38Z] INFO: ARP resolution succeeded (got response from peer)
[2026-10-26T02:20:38Z] INFO: Test: udp_send_receive
[2026-10-26T02:20:39Z] INFO: UDP send/receive succeeded
[2026-10-26T02:20:39Z] INFO: Test: echo_roundtrip
[2026-10-26T02:20:41Z] INFO: Echo roundtrip succeeded: 5/5 responses received
[2026-10-26T02:20:41Z] INFO: Test: payload_integrity
[2026-10-26T02:20:42Z] INFO: Response received, checking payload match...
[2026-10-26T02:20:42Z] INFO: Payload integrity verified (found in response)
[2026-10-26T02:20:42Z] INFO: Test: jumbo_diagnostics
[2026-10-26T02:20:42Z] INFO: === JUMBO FRAME DIAGNOSTICS ===
[2026-10-26T02:20:42Z] INFO: Interface MTU:
  9001
  65536
[2026-10-26T02:20:42Z] INFO:   ens5: MTU=9001
[2026-10-26T02:20:42Z] INFO:   lo: MTU=65536
[2026-10-26T02:20:42Z] INFO: Routing table MTU column:
Iface	Destination	Gateway 	Flags	RefCnt	Use	Metric	Mask		MTU	Window	IRTT                                                       
ens5	00000000	0101000A	0003	0	0	50	00000000	0	0	0                                                                              
ens5	00000000	0101000A	0003	0	0	512	00000000	0	0	0                                                                             
ens5	0200000A	0101000A	0007	0	0	512	FFFFFFFF	0	0	0                                                                             
ens5	0001000A	00000000	0001	0	0	512	00FFFFFF	0	0	0                                                                             
[2026-10-26T02:20:42Z] INFO: DPDK port config (from echo server log):
[2026-10-26T02:20:42Z] INFO:   (no MTU info in echo log)
[2026-10-26T02:20:42Z] INFO: === END JUMBO DIAGNOSTICS ===
[2026-10-26T02:20:42Z] INFO: Test: jumbo_echo_8000
[2026-10-26T02:20:43Z] INFO: Jumbo output: UDP Test Client
Target: 10.0.1.245:9000
Bind address: 10.0.1.111:0
Payload size: 8000 bytes
Count: 3
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
Warning: Some RX offloads not supported by device (flags: 0x1)
Warning: Some TX offloads not supported by device (flags: 0x1)
✅ DPDK UDP socket bound to 10.0.1.111:32768 (MAC: 02:ff:fa:68:28:6b)
Backend: dpdk
Sending packets...
Sent 8000 bytes (binary payload)
Received 8000 bytes from 10.0.1.245:9000 (expected 8000, OK)
Sent 8000 bytes (binary payload)
Received 8000 bytes from 10.0.1.245:9000 (expected 8000, OK)
Sent 8000 bytes (binary payload)
Received 8000 bytes from 10.0.1.245:9000 (expected 8000, OK)
Test complete
[2026-10-26T02:20:43Z] INFO: Jumbo frame echo succeeded: 3/3 responses with correct size
[2026-10-26T02:20:43Z] INFO: JUnit XML written to: /tmp/test-results/tier1-dpdk-echo.xml
[2026-10-26T02:20:43Z] INFO: Tier 1 sender tests complete. Results: /tmp/test-results/tier1-dpdk-echo.xml

receiver-test-client-iperf.log

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

sender-test-client-iperf.log

[2026-10-26T02:27:58Z] INFO: Pre-flight: checking DPDK state and ARP cache...
[2026-10-26T02:27:58Z] INFO: Local IP: 10.0.1.111, Peer IP: 10.0.1.245, Port: 9000
[2026-10-26T02:27:58Z] INFO: /proc/net/arp contents:
IP address       HW type     Flags       HW address            Mask     Device
10.0.1.111       0x1         0x2         02:ff:fa:68:28:6b     *        ens5
10.0.1.245       0x1         0x2         02:ff:c7:69:c2:25     *        ens5
10.0.1.100       0x1         0x2         02:ff:d5:fe:d0:b9     *        ens5
10.0.1.1         0x1         0x2         02:ff:d9:e6:2b:4d     *        ens5
10.0.1.121       0x1         0x2         02:ff:ea:f9:fb:73     *        ens5
[2026-10-26T02:27:58Z] INFO: DPDK runtime state:
No /var/run/dpdk/ directory
[2026-10-26T02:27:58Z] INFO: vfio-pci bindings:
0000:00:06.0
bind
module
new_id
remove_id
uevent
unbind
[2026-10-26T02:27:58Z] INFO: Test binary: /opt/dpdk-stdlib/target/release/test-client
-rwxr-xr-x. 2 root root 2051136 Oct 26 02:11 /opt/dpdk-stdlib/target/release/test-client
[2026-10-26T02:27:58Z] INFO: Launching test-client: /opt/dpdk-stdlib/target/release/test-client --target 10.0.1.245 --port 9000 --bind-ip 10.0.1.111 --count 10 --delay 200
[2026-10-26T02:28:01Z] INFO: Test client output: UDP Test Client
Target: 10.0.1.245:9000
Bind address: 10.0.1.111: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
Warning: Some RX offloads not supported by device (flags: 0x1)
Warning: Some TX offloads not supported by device (flags: 0x1)
✅ DPDK UDP socket bound to 10.0.1.111:32768 (MAC: 02:ff:fa:68:28:6b)
Backend: dpdk
Sending packets...
Sent 30 bytes: 'dpdk-to-kernel-test-payload #1'
Received 30 bytes from 10.0.1.245:9000: 'dpdk-to-kernel-test-payload #1'
Sent 30 bytes: 'dpdk-to-kernel-test-payload #2'
Received 30 bytes from 10.0.1.245:9000: 'dpdk-to-kernel-test-payload #2'
Sent 30 bytes: 'dpdk-to-kernel-test-payload #3'
Received 30 bytes from 10.0.1.245:9000: 'dpdk-to-kernel-test-payload #3'
Sent 30 bytes: 'dpdk-to-kernel-test-payload #4'
Received 30 bytes from 10.0.1.245:9000: 'dpdk-to-kernel-test-payload #4'
Sent 30 bytes: 'dpdk-to-kernel-test-payload #5'
Received 30 bytes from 10.0.1.245:9000: 'dpdk-to-kernel-test-payload #5'
Sent 30 bytes: 'dpdk-to-kernel-test-payload #6'
Received 30 bytes from 10.0.1.245:9000: 'dpdk-to-kernel-test-payload #6'
Sent 30 bytes: 'dpdk-to-kernel-test-payload #7'
Received 30 bytes from 10.0.1.245:9000: 'dpdk-to-kernel-test-payload #7'
Sent 30 bytes: 'dpdk-to-kernel-test-payload #8'
Received 30 bytes from 10.0.1.245:9000: 'dpdk-to-kernel-test-payload #8'
Sent 30 bytes: 'dpdk-to-kernel-test-payload #9'
Received 30 bytes from 10.0.1.245:9000: 'dpdk-to-kernel-test-payload #9'
Sent 31 bytes: 'dpdk-to-kernel-test-payload #10'
Received 31 bytes from 10.0.1.245:9000: 'dpdk-to-kernel-test-payload #10'
Test complete
[2026-10-26T02:28:01Z] INFO: our-app-sends: sent 10 packets, received 10 responses
[2026-10-26T02:28:01Z] INFO: our-app-sends: PASS (sent >= 5 packets)
[2026-10-26T02:28:01Z] INFO: JUnit XML written to: /tmp/test-results/tier3-our-app-sends.xml
[2026-10-26T02:28:01Z] INFO: our-app-sends test complete
⚠️ SSM Command Failures (receiver-ssm-failure.log)
=== Polling timeout after 30s ===
Status: InProgress
Instance: i-0a1cb0c1109b67ba5 (receiver)
Command ID: a824c16f-fe70-4a6c-8927-d57406c8d42d

=== STDOUT ===


=== STDERR ===


=== Polling timeout after 30s ===
Status: InProgress
Instance: i-0a1cb0c1109b67ba5 (receiver)
Command ID: 54a33ab3-c7b6-4a75-ae1b-b0bd02c6047e

=== STDOUT ===


=== STDERR ===


=== Polling timeout after 30s ===
Status: InProgress
Instance: i-0a1cb0c1109b67ba5 (receiver)
Command ID: 54f4f537-1f13-4bdc-a2e7-9c8f8fd958d5

=== STDOUT ===


=== STDERR ===


=== Polling timeout after 30s ===
Status: InProgress
Instance: i-0a1cb0c1109b67ba5 (receiver)
Command ID: 10155b4b-e9b3-476b-8c17-242691611261

=== STDOUT ===


=== STDERR ===


=== Polling timeout after 30s ===
Status: InProgress
Instance: i-0a1cb0c1109b67ba5 (receiver)
Command ID: aa9e51f2-8847-4304-a2e2-483ea4df8000

=== STDOUT ===


=== STDERR ===


=== Polling timeout after 30s ===
Status: InProgress
Instance: i-0a1cb0c1109b67ba5 (receiver)
Command ID: 75eec2f4-efed-421d-b03f-24052e97a5b2

=== STDOUT ===


=== STDERR ===


=== Polling timeout after 30s ===
Status: InProgress
Instance: i-0a1cb0c1109b67ba5 (receiver)
Command ID: da57fdfd-4fbf-4dc6-84c4-23f2b509c447

=== STDOUT ===


=== STDERR ===


⚠️ SSM Command Failures (sender-ssm-failure.log)
=== Polling timeout after 30s ===
Status: InProgress
Instance: i-06ba777f458775acb (sender)
Command ID: 71cc6a4c-d707-4481-91bd-1c7f1fd103fa

=== 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:ff:c1:8b:91:9f brd ff:ff:ff:ff:ff:ff
    altname enp0s5
    altname eni-001f24a1246e6fd7e
    altname device-number-0.0
    inet 10.0.1.197/24 metric 512 brd 10.0.1.255 scope global dynamic ens5
       valid_lft 2012sec preferred_lft 2012sec
    inet6 fe80::ff:c1ff:fe8b:919f/64 scope link proto kernel_ll 
       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:ff:c7:69:c2:25 brd ff:ff:ff:ff:ff:ff
    altname enp0s6
    altname eni-0c99a74b1b8858a32
    altname device-number-1.0
    inet 10.0.1.245/24 brd 10.0.1.255 scope global ens6
       valid_lft forever preferred_lft forever
    inet6 fe80::ff:c7ff:fe69:c225/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:ff:e1:c2:3f:49 brd ff:ff:ff:ff:ff:ff
    altname enp0s5
    altname eni-0c2ce740b80b4e70b
    altname device-number-0.0
    inet 10.0.1.42/24 metric 512 brd 10.0.1.255 scope global dynamic ens5
       valid_lft 2033sec preferred_lft 2033sec
    inet6 fe80::ff:e1ff:fec2:3f49/64 scope link proto kernel_ll 
       valid_lft forever preferred_lft forever

receiver-networking-diag-baseline.txt

=== NETWORKING DIAGNOSTICS ===
timestamp: 2026-10-26T02:20:00Z
hostname: ip-10-0-1-197.ec2.internal
kernel: 6.12.113-138.209.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:ff:c1:8b:91:9f brd ff:ff:ff:ff:ff:ff
    altname enp0s5
    altname eni-001f24a1246e6fd7e
    altname device-number-0.0
    inet 10.0.1.197/24 metric 512 brd 10.0.1.255 scope global dynamic ens5
       valid_lft 2658sec preferred_lft 2658sec
    inet6 fe80::ff:c1ff:fe8b:919f/64 scope link proto kernel_ll 
       valid_lft forever preferred_lft forever

=== ARP TABLE ===
10.0.1.111 dev ens5 lladdr 02:ff:fa:68:28:6b STALE 
10.0.1.100 dev ens5 lladdr 02:ff:d5:fe:d0:b9 REACHABLE 
10.0.1.121 dev ens5 lladdr 02:ff:ea:f9:fb:73 REACHABLE 
10.0.1.1 dev ens5 lladdr 02:ff:d9:e6:2b:4d REACHABLE 
10.0.1.245 dev ens5 lladdr 02:ff:c7:69:c2:25 STALE 

=== ROUTE TABLE ===
default via 10.0.1.1 dev ens5 metric 50 
default via 10.0.1.1 dev ens5 proto dhcp src 10.0.1.197 metric 512 
10.0.0.2 via 10.0.1.1 dev ens5 proto dhcp src 10.0.1.197 metric 512 
10.0.1.0/24 dev ens5 proto kernel scope link src 10.0.1.197 metric 512 
10.0.1.1 dev ens5 proto dhcp scope link src 10.0.1.197 metric 512 

=== IMDS: ENI INFORMATION ===
ENI MACs found: 02:ff:c1:8b:91:9f/ 02:ff:c7:69:c2:25/ 

--- ENI: 02:ff:c1:8b:91:9f/ ---
  device-number: 0
  local-ipv4s: 10.0.1.197
  subnet-id: subnet-079952285e4d737d5
  subnet-cidr: 10.0.1.0/24

--- ENI: 02:ff:c7:69:c2:25/ ---
  device-number: 1
  local-ipv4s: 10.0.1.245
  subnet-id: subnet-079952285e4d737d5
  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:ff:d9:e6:2b:4d REACHABLE 

arping result:
ARPING 10.0.1.1 from 10.0.1.197 ens5
Unicast reply from 10.0.1.1 [02:FF:D9:E6:2B:4D]  0.545ms
Sent 1 probes (1 broadcast(s))
Received 1 response(s)

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

=== VFIO STATUS ===
total 0
drwxr-xr-x.  2 root root       80 Oct 26 02:12 .
drwxr-xr-x. 14 root root     3100 Oct 26 02:11 ..
crw-------.  1 root root 243,   0 Oct 26 02:12 noiommu-0
crw-rw-rw-.  1 root root  10, 196 Oct 26 02:04 vfio

noiommu mode:
Y

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

=== DPDK-RELATED DMESG (last 30 lines) ===
[    0.061423] x86/fpu: Enabled xstate features 0x2ff, context size is 2568 bytes, using 'compacted' format.
[    0.068994] audit: type=2000 audit(1792980246.543:1): state=initialized audit_enabled=0 res=1
[    0.069672] kprobes: kprobe jump-optimization is enabled. All kprobes are optimized if possible.
[    0.098601] ACPI: Interpreter enabled
[    0.098745] ACPI: Enabled 2 GPEs in block 00 to 0F
[    0.129481] pci 0000:00:05.0: enabling Extended Tags
[    0.181330] SGI XFS with ACLs, security attributes, quota, no debug enabled
[    0.216852] ACPI: \_SB_.LNKD: Enabled at IRQ 11
[    0.279595] IPI shorthand broadcast: enabled
[    0.279634] AES CTR mode by8 optimization enabled
[    8.415181] systemd[1]: Mounting dev-hugepages.mount - Huge Pages File System...
[    8.456482] systemd[1]: Mounted dev-hugepages.mount - Huge Pages File System.
[    8.516443] VFIO - User Level meta-driver version: 0.3
[    9.130945] ena 0000:00:05.0: Elastic Network Adapter (ENA) v2.17.4g
[    9.142074] ena 0000:00:05.0: ENA device version: 0.10
[    9.142738] ena 0000:00:05.0: ENA controller version: 0.0.1 implementation version 1
[    9.274756] ena 0000:00:05.0: ENA Large LLQ is disabled
[    9.286850] ena 0000:00:05.0: Elastic Network Adapter (ENA) found at mem c0500000, mac addr 02:ff:c1:8b:91:9f
[    9.388192] ena 0000:00:05.0 ens5: renamed from eth0
[  451.339926] pci 0000:00:06.0: enabling Extended Tags
[  451.343714] ena 0000:00:06.0: enabling device (0000 -> 0002)
[  451.353055] ena 0000:00:06.0: ENA device version: 0.10
[  451.353722] ena 0000:00:06.0: ENA controller version: 0.0.1 implementation version 1
[  451.453025] ena 0000:00:06.0: ENA Large LLQ is disabled
[  451.466106] ena 0000:00:06.0: Elastic Network Adapter (ENA) found at mem c0508000, mac addr 02:ff:c7:69:c2:25
[  451.472544] ena 0000:00:06.0 ens6: renamed from eth0
[  480.926590] vfio-pci 0000:00:06.0: Adding to iommu group 0
[  480.927936] vfio-pci 0000:00:06.0: Adding kernel taint for vfio-noiommu group on device
[  589.784806] vfio-pci 0000:00:06.0: vfio-noiommu device opened by user (echo:8445)
[  663.374576] vfio-pci 0000:00:06.0: vfio-noiommu device opened by user (tcp-echo:8731)

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

=== END DIAGNOSTICS ===

sender-networking-diag-baseline.txt

=== NETWORKING DIAGNOSTICS ===
timestamp: 2026-10-26T02:19:53Z
hostname: ip-10-0-1-42.ec2.internal
kernel: 6.12.113-138.209.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:ff:e1:c2:3f:49 brd ff:ff:ff:ff:ff:ff
    altname enp0s5
    altname eni-0c2ce740b80b4e70b
    altname device-number-0.0
    inet 10.0.1.42/24 metric 512 brd 10.0.1.255 scope global dynamic ens5
       valid_lft 2665sec preferred_lft 2665sec
    inet6 fe80::ff:e1ff:fec2:3f49/64 scope link proto kernel_ll 
       valid_lft forever preferred_lft forever

=== ARP TABLE ===
10.0.1.111 dev ens5 lladdr 02:ff:fa:68:28:6b STALE 
10.0.1.245 dev ens5 lladdr 02:ff:c7:69:c2:25 STALE 
10.0.1.100 dev ens5 lladdr 02:ff:d5:fe:d0:b9 REACHABLE 
10.0.1.1 dev ens5 lladdr 02:ff:d9:e6:2b:4d REACHABLE 
10.0.1.121 dev ens5 lladdr 02:ff:ea:f9:fb:73 REACHABLE 

=== ROUTE TABLE ===
default via 10.0.1.1 dev ens5 metric 50 
default via 10.0.1.1 dev ens5 proto dhcp src 10.0.1.42 metric 512 
10.0.0.2 via 10.0.1.1 dev ens5 proto dhcp src 10.0.1.42 metric 512 
10.0.1.0/24 dev ens5 proto kernel scope link src 10.0.1.42 metric 512 
10.0.1.1 dev ens5 proto dhcp scope link src 10.0.1.42 metric 512 

=== IMDS: ENI INFORMATION ===
ENI MACs found: 02:ff:e1:c2:3f:49/ 02:ff:fa:68:28:6b/ 

--- ENI: 02:ff:e1:c2:3f:49/ ---
  device-number: 0
  local-ipv4s: 10.0.1.42
  subnet-id: subnet-079952285e4d737d5
  subnet-cidr: 10.0.1.0/24

--- ENI: 02:ff:fa:68:28:6b/ ---
  device-number: 1
  local-ipv4s: 10.0.1.111
  subnet-id: subnet-079952285e4d737d5
  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:ff:d9:e6:2b:4d REACHABLE 

arping result:
ARPING 10.0.1.1 from 10.0.1.42 ens5
Unicast reply from 10.0.1.1 [02:FF:D9:E6:2B:4D]  0.537ms
Sent 1 probes (1 broadcast(s))
Received 1 response(s)

=== HUGEPAGE STATUS ===
AnonHugePages:         0 kB
ShmemHugePages:        0 kB
FileHugePages:     59392 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 Oct 26 02:16 .
drwxr-xr-x. 14 root root     3100 Oct 26 02:11 ..
crw-------.  1 root root 243,   0 Oct 26 02:16 noiommu-0
crw-rw-rw-.  1 root root  10, 196 Oct 26 02:04 vfio

noiommu mode:
Y

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

=== DPDK-RELATED DMESG (last 30 lines) ===
[    0.053334] printk: legacy console [ttyS0] enabled
[    0.054359] x2apic enabled
[    0.060810] x86/fpu: Enabled xstate features 0x2ff, context size is 2568 bytes, using 'compacted' format.
[    0.068511] audit: type=2000 audit(1792980246.558:1): state=initialized audit_enabled=0 res=1
[    0.069168] kprobes: kprobe jump-optimization is enabled. All kprobes are optimized if possible.
[    0.098114] ACPI: Interpreter enabled
[    0.098251] ACPI: Enabled 2 GPEs in block 00 to 0F
[    0.127420] pci 0000:00:05.0: enabling Extended Tags
[    0.192016] SGI XFS with ACLs, security attributes, quota, no debug enabled
[    0.222429] ACPI: \_SB_.LNKD: Enabled at IRQ 11
[    0.276790] IPI shorthand broadcast: enabled
[    0.276826] AES CTR mode by8 optimization enabled
[    8.425141] systemd[1]: Mounting dev-hugepages.mount - Huge Pages File System...
[    8.468042] systemd[1]: Mounted dev-hugepages.mount - Huge Pages File System.
[    8.507417] VFIO - User Level meta-driver version: 0.3
[    9.205339] ena 0000:00:05.0: Elastic Network Adapter (ENA) v2.17.4g
[    9.214706] ena 0000:00:05.0: ENA device version: 0.10
[    9.215330] ena 0000:00:05.0: ENA controller version: 0.0.1 implementation version 1
[    9.314861] ena 0000:00:05.0: ENA Large LLQ is disabled
[    9.329618] ena 0000:00:05.0: Elastic Network Adapter (ENA) found at mem c0500000, mac addr 02:ff:e1:c2:3f:49
[    9.421139] ena 0000:00:05.0 ens5: renamed from eth0
[  451.735902] pci 0000:00:06.0: enabling Extended Tags
[  451.739669] ena 0000:00:06.0: enabling device (0000 -> 0002)
[  451.751912] ena 0000:00:06.0: ENA device version: 0.10
[  451.752540] ena 0000:00:06.0: ENA controller version: 0.0.1 implementation version 1
[  451.853175] ena 0000:00:06.0: ENA Large LLQ is disabled
[  451.865849] ena 0000:00:06.0: Elastic Network Adapter (ENA) found at mem c0508000, mac addr 02:ff:fa:68:28:6b
[  451.871844] ena 0000:00:06.0 ens6: renamed from eth0
[  717.775749] vfio-pci 0000:00:06.0: Adding to iommu group 0
[  717.776914] 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.068335] pid_max: default: 32768 minimum: 301
[    0.133249] iommu: Default domain type: Translated
[    0.134048] NetLabel:  unlabeled traffic allowed by default
[    0.161278] PCI: CLS 0 bytes, default 64
[    0.225957] nvme nvme0: 2/0/0 default/read/poll queues
[    0.364722] systemd[1]: systemd 252.23-15.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.364866] systemd[1]: No hostname configured, using default hostname.
[    0.485211] systemd[1]: Queued start job for default target initrd.target.
[    5.587158] systemd[1]: systemd 252.23-15.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)
[  589.784806] vfio-pci 0000:00:06.0: vfio-noiommu device opened by user (echo:8445)
[  663.374576] vfio-pci 0000:00:06.0: vfio-noiommu device opened by user (tcp-echo:8731)
[  975.523378] vfio-pci 0000:00:06.0: vfio-noiommu device opened by user (echo:10387)
[ 1068.823038] vfio-pci 0000:00:06.0: vfio-noiommu device opened by user (tcp-echo:10729)
[ 1161.592687] vfio-pci 0000:00:06.0: vfio-noiommu device opened by user (tokio-tcp-echo:12170)
[ 1259.982245] vfio-pci 0000:00:06.0: vfio-noiommu device opened by user (echo:12489)

sender-dmesg-crashes.log

[    0.067849] pid_max: default: 32768 minimum: 301
[    0.131056] iommu: Default domain type: Translated
[    0.131803] NetLabel:  unlabeled traffic allowed by default
[    0.159380] PCI: CLS 0 bytes, default 64
[    0.233979] nvme nvme0: 2/0/0 default/read/poll queues
[    0.396716] systemd[1]: systemd 252.23-15.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.396841] systemd[1]: No hostname configured, using default hostname.
[    0.488229] systemd[1]: Queued start job for default target initrd.target.
[    5.586978] systemd[1]: systemd 252.23-15.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)
[ 1084.453379] vfio-pci 0000:00:06.0: vfio-noiommu device opened by user (tcp-test-client:10243)
[ 1088.173395] vfio-pci 0000:00:06.0: vfio-noiommu device opened by user (tcp-test-client:10264)
[ 1177.173084] vfio-pci 0000:00:06.0: vfio-noiommu device opened by user (tcp-test-client:10548)
[ 1180.883068] vfio-pci 0000:00:06.0: vfio-noiommu device opened by user (tcp-test-client:10569)
[ 1474.172192] vfio-pci 0000:00:06.0: vfio-noiommu device opened by user (echo:11523)
Kernel Console (dmesg)

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

[    9.142738] ena 0000:00:05.0: ENA controller version: 0.0.1 implementation version 1
[    9.274756] ena 0000:00:05.0: ENA Large LLQ is disabled
[    9.286850] ena 0000:00:05.0: Elastic Network Adapter (ENA) found at mem c0500000, mac addr 02:ff:c1:8b:91:9f
[    9.388192] ena 0000:00:05.0 ens5: renamed from eth0
[  451.336895] pci 0000:00:06.0: [1d0f:ec20] type 00 class 0x020000 PCIe Endpoint
[  451.337983] pci 0000:00:06.0: BAR 0 [mem 0x00000000-0x00003fff]
[  451.338846] pci 0000:00:06.0: BAR 2 [mem 0x00000000-0x000fffff pref]
[  451.339926] pci 0000:00:06.0: enabling Extended Tags
[  451.341540] pci 0000:00:06.0: BAR 2 [mem 0xc0600000-0xc06fffff pref]: assigned
[  451.342467] pci 0000:00:06.0: BAR 0 [mem 0xc0508000-0xc050bfff]: assigned
[  451.343714] ena 0000:00:06.0: enabling device (0000 -> 0002)
[  451.353055] ena 0000:00:06.0: ENA device version: 0.10
[  451.353722] ena 0000:00:06.0: ENA controller version: 0.0.1 implementation version 1
[  451.453025] ena 0000:00:06.0: ENA Large LLQ is disabled
[  451.466106] ena 0000:00:06.0: Elastic Network Adapter (ENA) found at mem c0508000, mac addr 02:ff:c7:69:c2:25
[  451.472544] ena 0000:00:06.0 ens6: renamed from eth0
[  480.926590] vfio-pci 0000:00:06.0: Adding to iommu group 0
[  480.927936] vfio-pci 0000:00:06.0: Adding kernel taint for vfio-noiommu group on device
[  589.784806] vfio-pci 0000:00:06.0: vfio-noiommu device opened by user (echo:8445)
[  663.374576] vfio-pci 0000:00:06.0: vfio-noiommu device opened by user (tcp-echo:8731)
[  975.523378] vfio-pci 0000:00:06.0: vfio-noiommu device opened by user (echo:10387)
[ 1068.823038] vfio-pci 0000:00:06.0: vfio-noiommu device opened by user (tcp-echo:10729)
[ 1161.592687] vfio-pci 0000:00:06.0: vfio-noiommu device opened by user (tokio-tcp-echo:12170)
[ 1259.982245] vfio-pci 0000:00:06.0: vfio-noiommu device opened by user (echo:12489)
[ 1327.349593] vfio-pci 0000:00:06.0: Removing from iommu group 0
[ 1328.359689] ena 0000:00:06.0: ENA device version: 0.10
[ 1328.360355] ena 0000:00:06.0: ENA controller version: 0.0.1 implementation version 1
[ 1328.459666] ena 0000:00:06.0: ENA Large LLQ is disabled
[ 1328.472004] ena 0000:00:06.0: Elastic Network Adapter (ENA) found at mem c0508000, mac addr 02:ff:c7:69:c2:25
[ 1328.480142] ena 0000:00:06.0 ens6: renamed from eth0

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

[    9.421139] ena 0000:00:05.0 ens5: renamed from eth0
[  451.732958] pci 0000:00:06.0: [1d0f:ec20] type 00 class 0x020000 PCIe Endpoint
[  451.734024] pci 0000:00:06.0: BAR 0 [mem 0x00000000-0x00003fff]
[  451.734853] pci 0000:00:06.0: BAR 2 [mem 0x00000000-0x000fffff pref]
[  451.735902] pci 0000:00:06.0: enabling Extended Tags
[  451.737524] pci 0000:00:06.0: BAR 2 [mem 0xc0600000-0xc06fffff pref]: assigned
[  451.738416] pci 0000:00:06.0: BAR 0 [mem 0xc0508000-0xc050bfff]: assigned
[  451.739669] ena 0000:00:06.0: enabling device (0000 -> 0002)
[  451.751912] ena 0000:00:06.0: ENA device version: 0.10
[  451.752540] ena 0000:00:06.0: ENA controller version: 0.0.1 implementation version 1
[  451.853175] ena 0000:00:06.0: ENA Large LLQ is disabled
[  451.865849] ena 0000:00:06.0: Elastic Network Adapter (ENA) found at mem c0508000, mac addr 02:ff:fa:68:28:6b
[  451.871844] ena 0000:00:06.0 ens6: renamed from eth0
[  717.775749] vfio-pci 0000:00:06.0: Adding to iommu group 0
[  717.776914] vfio-pci 0000:00:06.0: Adding kernel taint for vfio-noiommu group on device
[  991.093698] vfio-pci 0000:00:06.0: vfio-noiommu device opened by user (tokio-rt-worker:9725)
[  991.813620] vfio-pci 0000:00:06.0: vfio-noiommu device opened by user (tokio-rt-worker:9745)
[  993.523625] vfio-pci 0000:00:06.0: vfio-noiommu device opened by user (tokio-rt-worker:9767)
[  995.043611] vfio-pci 0000:00:06.0: vfio-noiommu device opened by user (tokio-rt-worker:9790)
[  995.803612] vfio-pci 0000:00:06.0: vfio-noiommu device opened by user (tokio-rt-worker:9846)
[ 1084.453379] vfio-pci 0000:00:06.0: vfio-noiommu device opened by user (tcp-test-client:10243)
[ 1088.173395] vfio-pci 0000:00:06.0: vfio-noiommu device opened by user (tcp-test-client:10264)
[ 1177.173084] vfio-pci 0000:00:06.0: vfio-noiommu device opened by user (tcp-test-client:10548)
[ 1180.883068] vfio-pci 0000:00:06.0: vfio-noiommu device opened by user (tcp-test-client:10569)
[ 1275.682765] vfio-pci 0000:00:06.0: vfio-noiommu device opened by user (tokio-rt-worker:10930)
[ 1276.402707] vfio-pci 0000:00:06.0: vfio-noiommu device opened by user (tokio-rt-worker:10950)
[ 1278.122688] vfio-pci 0000:00:06.0: vfio-noiommu device opened by user (tokio-rt-worker:10973)
[ 1279.842699] vfio-pci 0000:00:06.0: vfio-noiommu device opened by user (tokio-rt-worker:10996)
[ 1432.602276] vfio-pci 0000:00:06.0: vfio-noiommu device opened by user (tokio-rt-worker:11425)
[ 1474.172192] vfio-pci 0000:00:06.0: vfio-noiommu device opened by user (echo:11523)

@github-actions

Copy link
Copy Markdown

✅ Integration Tests Passed — Graviton (run)

Branch: 138/merge | Commit: df4f453f

Test Results

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

Application Logs (last 20 lines)

receiver-echo-server.log

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
Warning: Some RX offloads not supported by device (flags: 0x1)
Warning: Some TX offloads not supported by device (flags: 0x1)
✅ DPDK UDP socket bound to 10.0.1.143:9000 (MAC: 02:ff:d5:a6:3a:69)
echo listening on 10.0.1.143:9000 (MTU=9001, max_udp_payload=8973)
Shutting down gracefully...

sender-echo-server.log

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
Warning: Some RX offloads not supported by device (flags: 0x1)
Warning: Some TX offloads not supported by device (flags: 0x1)
✅ DPDK UDP socket bound to 10.0.1.136:9000 (MAC: 02:ff:fc:e6:f7:1d)
echo listening on 10.0.1.136:9000 (MTU=9001, max_udp_payload=8973)
Shutting down gracefully...

sender-test-client.log

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
Warning: Some RX offloads not supported by device (flags: 0x1)
Warning: Some TX offloads not supported by device (flags: 0x1)
✅ DPDK UDP socket bound to 10.0.1.136:32768 (MAC: 02:ff:fc:e6:f7:1d)
Backend: dpdk
Sending packets...
Sent 8000 bytes (binary payload)
Received 8000 bytes from 10.0.1.143:9000 (expected 8000, OK)
Sent 8000 bytes (binary payload)
Received 8000 bytes from 10.0.1.143:9000 (expected 8000, OK)
Sent 8000 bytes (binary payload)
Received 8000 bytes from 10.0.1.143:9000 (expected 8000, OK)
Test complete
[2026-10-26T02:20:08Z] INFO: Jumbo frame echo succeeded: 3/3 responses with correct size
[2026-10-26T02:20:08Z] INFO: JUnit XML written to: /tmp/test-results/tier1-dpdk-echo.xml
[2026-10-26T02:20:08Z] INFO: Tier 1 sender tests complete. Results: /tmp/test-results/tier1-dpdk-echo.xml

@github-actions

Copy link
Copy Markdown

[Perf] Stage: Deploy FAILED

CDK deploy failed. CloudFormation events:

2026-10-26T02:38:23.981000+00:00	PerfTestStack	ROLLBACK_COMPLETE	None
2026-10-26T02:35:33.250000+00:00	PerfTestStack	ROLLBACK_IN_PROGRESS	The following resource(s) failed to create: [PerfTestVpcPrivateSubnet1DefaultRoute111E42CE, DutInstance, TrexInstance]. Rollback requested by user.
2026-10-26T02:35:32.905000+00:00	DutInstance	CREATE_FAILED	Resource creation cancelled
2026-10-26T02:35:32.196000+00:00	PerfTestVpcPrivateSubnet1DefaultRoute111E42CE	CREATE_FAILED	Resource creation cancelled
2026-10-26T02:35:31.280000+00:00	TrexInstance	CREATE_FAILED	Resource handler returned message: "The image id '[ami-0e4c5917a5313cbfd]' does not exist (Service: Ec2, Status Code: 400, Request ID: 6bda8c68-e93b-4d49-96ee-f70eead991a5) (SDK Attempt Count: 1)" (RequestToken: 1a50078d-d5d5-ba83-38a8-17c45017435e, HandlerErrorCode: InvalidRequest)

@github-actions

Copy link
Copy Markdown

Performance Test Failure (Run 40259496360)

Branch: agent/tokio-echo-fair-concurrent-modes | Commit: 49b7b410

failure-summary.json

{
  "failed_step": "perf-test",
  "error": "Script exited with code 2",
  "exit_code": 2,
  "timestamp": "2026-10-26T02:38:32.626606Z",
  "trex_instance_id": "",
  "dut_instance_id": "",
  "commit": "49b7b410576ee297c82c0b0becbd32a7d97ba5ed",
  "run_url": "https://github.com/gspivey/dpdk-stdlib-rust/actions/runs/40259496360"
}```

### 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...
Configs: plain-rust,rust-dpdk,tokio-dpdk,native-dpdk
Packet sizes: 64,512,1400,8500

@github-actions

Copy link
Copy Markdown

[CI] Stage: Deploy

Infrastructure ready.

  • Sender: i-0b92e375657582eb5 (DPDK ENI: 10.0.1.239)
  • Receiver: i-07c5d1f6d211ef7fd (DPDK ENI: 10.0.1.151)
  • Both instances SSM-ready.

@github-actions

Copy link
Copy Markdown

[Perf] Stage: Deploy FAILED

CDK deploy failed. CloudFormation events:

2026-10-26T02:45:49.301000+00:00	PerfTestStack	ROLLBACK_COMPLETE	None
2026-10-26T02:42:58.335000+00:00	PerfTestStack	ROLLBACK_IN_PROGRESS	The following resource(s) failed to create: [DutInstance, TrexInstance]. Rollback requested by user.
2026-10-26T02:42:58.013000+00:00	DutInstance	CREATE_FAILED	Resource creation cancelled
2026-10-26T02:42:56.807000+00:00	TrexInstance	CREATE_FAILED	Resource handler returned message: "The image id '[ami-0e4c5917a5313cbfd]' does not exist (Service: Ec2, Status Code: 400, Request ID: 3133c95e-6428-4d1a-90e8-7616e108684a) (SDK Attempt Count: 1)" (RequestToken: 77222c66-b30a-a267-a2f0-652c3752f040, HandlerErrorCode: InvalidRequest)

@github-actions

Copy link
Copy Markdown

Performance Test Failure (Run 40260119861)

Branch: agent/tokio-echo-fair-concurrent-modes | Commit: 49b7b410

failure-summary.json

{
  "failed_step": "perf-test",
  "error": "Script exited with code 2",
  "exit_code": 2,
  "timestamp": "2026-10-26T02:45:58.918573Z",
  "trex_instance_id": "",
  "dut_instance_id": "",
  "commit": "49b7b410576ee297c82c0b0becbd32a7d97ba5ed",
  "run_url": "https://github.com/gspivey/dpdk-stdlib-rust/actions/runs/40260119861"
}```

### 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 commented Oct 26, 2026

Copy link
Copy Markdown
Owner Author

⚠️ Perf baseline run blocked by infrastructure (stale TRex AMI)

Code CI is fully green on this PR (build/cargo test, Integration Tests 17/17, QUIC Integration 2/2, synthetic-perf, validate-cdk, nightly-gate — all ✅). The change is confined to apps/tokio-echo/src/main.rs.

Per the session SOP (CLAUDE.md step 5 / tokio-udp-perf task 1.7), after green CI I triggered the perf workflow to record the new tokio-dpdk fair baseline. Both attempts failed at the Deploy stage for the same infrastructure reason — not a regression and not caused by this PR:

Perf run Result Cause
40259496360 ❌ Deploy failed TrexInstance CREATE_FAILED → stack ROLLBACK_COMPLETE
40260119861 (retry) ❌ Deploy failed same
TREX_AMI_ID: ami-0e4c5917a5313cbfd
PerfTestStack | CREATE_FAILED | AWS::EC2::Instance | TrexInstance
  The image id '[ami-0e4c5917a5313cbfd]' does not exist
  (Status Code: 400, HandlerErrorCode: InvalidRequest)

The DPDK AMI (ami-0809db4f14f2addd4) resolved fine; only the TRex AMI ami-0e4c5917a5313cbfd no longer exists in the account, so TrexInstance cannot be created and the stack rolls back before any traffic runs. No tokio-dpdk pps numbers were produced.

Why I'm stopping here

  • This is a perf-infrastructure problem (a stale/deregistered TRex AMI, refreshed by the AMI-build pipeline — ROADMAP item 43), out of scope for PR 1, whose boundary is apps/tokio-echo/src/main.rs only. Fixing the AMI reference / rebuilding the TRex AMI is not a change this PR should carry.
  • The SOP forbids substituting local/synthetic numbers into docs/perf-test-log.md — only GitHub Actions perf data may be recorded — so the task 1.7 baseline entry, the ROADMAP tick, and the squash-merge cannot proceed until the perf stack can deploy.
  • I retried once (the cheap, non-destructive mitigation); it reproduced identically, so this is a confirmed blocker rather than a transient flake.

What unblocks it

Rebuild/refresh the TRex AMI (or update the TREX_AMI_ID the perf workflow resolves) so PerfTestStack can create TrexInstance, then re-run perf-tests.yml --ref agent/tokio-echo-fair-concurrent-modes. Once a perf run succeeds, the remaining steps are mechanical: append the GitHub-Actions tokio-dpdk fair numbers to docs/perf-test-log.md, flip ROADMAP item 45 to - [x] Complete · PR: #138, commit both to this branch, and squash-merge to development.

The code for tasks 1.1–1.7 is complete and green; only the infra-dependent perf baseline recording remains.

@github-actions

Copy link
Copy Markdown

Integration Tests — ✅ all passed

df4f453 · run · Integration Tests · 21 tests: 21 ✅ · 0 ❌ real · 0 ⚠️ infra

Tier Test Result Time Reason
tier1-tcp-echo bidir_echo ✅ pass 0.720s
tier1-tcp-echo bidir_multi ✅ pass 0.739s
tier1-tcp-handshake single_handshake ✅ pass 0.937s
tier1-tcp-handshake repeated_handshake ✅ pass 0.729s
tier1-tcp-handshake handshake_rate ✅ pass 0.749s
tier1-tcp-shutdown graceful_fin_teardown ✅ pass 0.722s
tier1-tcp-shutdown data_before_fin ✅ pass 0.739s
tier1-tcp-shutdown repeated_shutdown_cycles ✅ pass 3.661s
tier2-tcp-flow-control large_burst_flow_control ✅ pass 0.882s
tier2-tcp-flow-control sustained_window_pressure ✅ pass 1.159s
tier2-tcp-flow-control data_integrity_under_pressure ✅ pass 1.589s
tier2-tcp-retransmit baseline_no_loss ✅ pass 0.743s
tier2-tcp-retransmit transfer_under_loss ✅ pass 0.744s
tier2-tcp-retransmit bounded_recovery_time ✅ pass 0.007s
tier3-tcp-kernel-interop dpdk_to_ncat_echo ✅ pass 0.729s
tier3-tcp-kernel-interop ncat_to_dpdk_echo ✅ pass 0.057s
tier3-tcp-kernel-interop iperf3_throughput ✅ pass 5.011s
tier3-tcp-std-parity std_parity_small ✅ pass 0.712s
tier3-tcp-std-parity std_parity_medium ✅ pass 0.729s
tier3-tcp-std-parity std_parity_large ✅ pass 0.719s
tier3-tcp-std-parity std_parity_multi_segment ✅ pass 0.719s

✅ All 21 tests passed

@github-actions

Copy link
Copy Markdown

✅ TCP Integration Tests Passed (run)

Branch: 138/merge | Commit: df4f453f

Test Results

  • tier1-tcp-echo-full.xml: 2 tests, 0 failures, skipped
  • tier1-tcp-handshake.xml: 3 tests, 0 failures, skipped
  • tier1-tcp-shutdown.xml: 3 tests, 0 failures, skipped
  • tier2-tcp-flow-control.xml: 3 tests, 0 failures, skipped
  • tier2-tcp-retransmit.xml: 3 tests, 0 failures, skipped
  • tier3-tcp-kernel-interop-dpdk.xml: 1 tests, 0 failures, skipped
  • tier3-tcp-kernel-interop.xml: 2 tests, 0 failures, skipped
  • tier3-tcp-std-parity.xml: 4 tests, 0 failures, skipped

Summary: 21 tests, 0 failures, 0 skipped

Application Logs (last 20 lines each)
Network 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:ff:d0:67:86:ff brd ff:ff:ff:ff:ff:ff
    altname enp0s5
    altname eni-09133c4da01dd576b
    altname device-number-0.0
    inet 10.0.1.159/24 metric 512 brd 10.0.1.255 scope global dynamic ens5
       valid_lft 2012sec preferred_lft 2012sec
    inet6 fe80::ff:d0ff:fe67:86ff/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:ff:f4:1f:b1:c5 brd ff:ff:ff:ff:ff:ff
    altname enp0s5
    altname eni-0b6be8907ac9f83cd
    altname device-number-0.0
    inet 10.0.1.13/24 metric 512 brd 10.0.1.255 scope global dynamic ens5
       valid_lft 2032sec preferred_lft 2032sec
    inet6 fe80::ff:f4ff:fe1f:b1c5/64 scope link proto kernel_ll 
       valid_lft forever preferred_lft forever

@gspivey

gspivey commented Oct 26, 2026

Copy link
Copy Markdown
Owner Author

Re: "CI completed with failures" — the only red check is perf-tests, and it is infra-only

I re-read every check-run on head 49b7b410:

Check Conclusion
build (cargo build + cargo test) ✅ success
integration-tests ✅ success
tcp-integration-tests ✅ success
quic-integration-tests ✅ success
synthetic-perf ✅ success
tcp-synthetic-perf ✅ success
validate-cdk ✅ success
nightly-gate ✅ success
perf-tests ❌ failure

perf-tests is the only failing check, and its failure is the stale TRex AMI infrastructure issue already detailed above (exit_code: 2, empty trex_instance_id/dut_instance_id, ami-0e4c5917a5313cbfd does not exist → PerfTestStack ROLLBACK). It reproduced identically on both runs 40259496360 and 40260119861.

There is no code fix to make. This PR changes only apps/tokio-echo/src/main.rs; it does not touch the perf stack, the AMI lookup, or the workflow. The red is environmental and out of scope for PR 1. Re-triggering again would fail identically on the same missing AMI, and the SOP forbids substituting local/synthetic perf numbers into docs/perf-test-log.md.

Unblock: rebuild/refresh the TRex AMI (or correct the resolved TREX_AMI_ID) so PerfTestStack can create TrexInstance, then re-run perf-tests.yml --ref agent/tokio-echo-fair-concurrent-modes. On a successful run I will append the GitHub-Actions tokio-dpdk fair numbers to docs/perf-test-log.md, flip ROADMAP item 45 to - [x] Complete · PR: #138, commit both to this branch, and squash-merge to development.

@github-actions

Copy link
Copy Markdown

[Perf] Stage: Deploy

Deploying PerfTestStack...
Configs: plain-rust,rust-dpdk,tokio-dpdk,native-dpdk
Packet sizes: 64,512,1400,8500

@github-actions

Copy link
Copy Markdown

[Perf] Stage: Instances Ready

  • TRex: i-00b7296efc1def603 (10.0.1.103)
  • DUT: i-0ae8fe45f103c904c (10.0.1.119)
  • Instance type: c6in.xlarge

@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:ff:cb:2e:8b:ed
  • RX: 0000:00:07.0 MAC: 02:ff:f5:9b:74:3d
  • Gateway MAC: 02:ff:d7:1f:5c:53
    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-0ae8fe45f103c904c SSM working, build complete.

@github-actions

Copy link
Copy Markdown

[Perf] Stage: Benchmark (1/4)

Running plain-rust benchmark...
Packet sizes: 64,512,1400,8500 | 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:ff:cb:2e:8b:ed
  Port 1: 02:ff:f5:9b:74:3d
PREFLIGHT_OK

@github-actions

Copy link
Copy Markdown

[Perf] Benchmark Diag: plain-rust result

SSM exit: 0

Output (last 30 lines)
Duration per step: 30s
Source MAC: 02:ff:cb:2e:8b:ed

--- Packet size: 64B ---
  Target: 70,000 pps ... TX: 70,000 pps, RX: 69,000 pps, Drop: 1.4284%, Lat avg: 0.0 us
  Target: 140,000 pps ... TX: 140,000 pps, RX: 139,000 pps, Drop: 0.7142%, Lat avg: 220.0 us
  Target: 350,000 pps ... TX: 350,000 pps, RX: 348,673 pps, Drop: 0.3792%, Lat avg: 390.0 us
  Target: 700,000 pps ... TX: 700,000 pps, RX: 595,073 pps, Drop: 14.9895%, Lat avg: 0.0 us

--- Packet size: 512B ---
  Target: 70,000 pps ... TX: 70,000 pps, RX: 69,000 pps, Drop: 1.4284%, Lat avg: 0.0 us
  Target: 140,000 pps ... TX: 140,000 pps, RX: 138,995 pps, Drop: 0.7178%, Lat avg: 222.0 us
  Target: 350,000 pps ... TX: 350,000 pps, RX: 348,940 pps, Drop: 0.3029%, Lat avg: 0.0 us
  Target: 700,000 pps ... TX: 700,000 pps, RX: 550,103 pps, Drop: 21.4139%, Lat avg: 374.0 us

--- Packet size: 1400B ---
  Target: 70,000 pps ... TX: 70,000 pps, RX: 69,000 pps, Drop: 1.4283%, Lat avg: 218.0 us
  Target: 140,000 pps ... TX: 140,000 pps, RX: 138,993 pps, Drop: 0.7196%, Lat avg: 0.0 us
  Target: 350,000 pps ... TX: 350,000 pps, RX: 348,417 pps, Drop: 0.4524%, Lat avg: 0.0 us
  Target: 700,000 pps ... TX: 476,360 pps, RX: 438,262 pps, Drop: 7.9978%, Lat avg: 0.0 us

--- Packet size: 8500B ---
  (jumbo: capping at 418,133 pps for 30.0 Gbps limit)
  Target: 70,000 pps ... TX: 70,000 pps, RX: 33,503 pps, Drop: 52.1391%, Lat avg: 0.0 us
  Target: 140,000 pps ... TX: 78,301 pps, RX: 75,148 pps, Drop: 4.0269%, Lat avg: 13821.0 us
  Target: 350,000 pps ... TX: 78,354 pps, RX: 78,013 pps, Drop: 0.4353%, Lat avg: 0.0 us
  Target: 700,000 pps ... SKIPPED (exceeds 30.0 Gbps cap)

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

@github-actions

Copy link
Copy Markdown

[Perf] Stage: Benchmark (2/4)

Running rust-dpdk benchmark...
Packet sizes: 64,512,1400,8500 | 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:ff:cb:2e:8b:ed
  Port 1: 02:ff:f5:9b:74:3d
PREFLIGHT_OK

@github-actions

Copy link
Copy Markdown

[Perf] Benchmark Diag: rust-dpdk result

SSM exit: 0

Output (last 30 lines)
Duration per step: 30s
Source MAC: 02:ff:cb:2e:8b:ed

--- Packet size: 64B ---
  Target: 70,000 pps ... TX: 70,000 pps, RX: 69,000 pps, Drop: 1.4284%, Lat avg: 261.0 us
  Target: 140,000 pps ... TX: 140,000 pps, RX: 139,000 pps, Drop: 0.7142%, Lat avg: 280.0 us
  Target: 350,000 pps ... TX: 350,000 pps, RX: 348,928 pps, Drop: 0.3063%, Lat avg: 275.0 us
  Target: 700,000 pps ... TX: 700,000 pps, RX: 647,690 pps, Drop: 7.4729%, Lat avg: 0.0 us

--- Packet size: 512B ---
  Target: 70,000 pps ... TX: 70,000 pps, RX: 69,000 pps, Drop: 1.4284%, Lat avg: 0.0 us
  Target: 140,000 pps ... TX: 140,000 pps, RX: 139,000 pps, Drop: 0.7142%, Lat avg: 0.0 us
  Target: 350,000 pps ... TX: 350,000 pps, RX: 349,000 pps, Drop: 0.2857%, Lat avg: 0.0 us
  Target: 700,000 pps ... TX: 700,000 pps, RX: 697,889 pps, Drop: 0.3016%, Lat avg: 0.0 us

--- Packet size: 1400B ---
  Target: 70,000 pps ... TX: 70,000 pps, RX: 69,000 pps, Drop: 1.4284%, Lat avg: 0.0 us
  Target: 140,000 pps ... TX: 140,000 pps, RX: 139,000 pps, Drop: 0.7142%, Lat avg: 0.0 us
  Target: 350,000 pps ... TX: 350,000 pps, RX: 348,932 pps, Drop: 0.3052%, Lat avg: 0.0 us
  Target: 700,000 pps ... TX: 476,452 pps, RX: 474,395 pps, Drop: 0.4317%, Lat avg: 0.0 us

--- Packet size: 8500B ---
  (jumbo: capping at 418,133 pps for 30.0 Gbps limit)
  Target: 70,000 pps ... TX: 70,000 pps, RX: 69,000 pps, Drop: 1.4283%, Lat avg: 522.0 us
  Target: 140,000 pps ... TX: 78,287 pps, RX: 75,512 pps, Drop: 3.5446%, Lat avg: 0.0 us
  Target: 350,000 pps ... TX: 78,304 pps, RX: 77,860 pps, Drop: 0.5666%, Lat avg: 0.0 us
  Target: 700,000 pps ... SKIPPED (exceeds 30.0 Gbps cap)

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

@github-actions

Copy link
Copy Markdown

[Perf] Stage: Benchmark (3/4)

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

@github-actions

Copy link
Copy Markdown

[Perf] Benchmark Diag: tokio-dpdk preflight

TRex API OK: 2 ports
  Port 0: 02:ff:cb:2e:8b:ed
  Port 1: 02:ff:f5:9b:74:3d
PREFLIGHT_OK

@github-actions

Copy link
Copy Markdown

[Perf] Benchmark Diag: tokio-dpdk result

SSM exit: 0

Output (last 30 lines)
Duration per step: 30s
Source MAC: 02:ff:cb:2e:8b:ed

--- Packet size: 64B ---
  Target: 70,000 pps ... TX: 70,000 pps, RX: 69,000 pps, Drop: 1.4284%, Lat avg: 144.0 us
  Target: 140,000 pps ... TX: 140,000 pps, RX: 139,000 pps, Drop: 0.7142%, Lat avg: 137.0 us
  Target: 350,000 pps ... TX: 350,000 pps, RX: 349,000 pps, Drop: 0.2857%, Lat avg: 0.0 us
  Target: 700,000 pps ... TX: 700,000 pps, RX: 681,301 pps, Drop: 2.6714%, Lat avg: 0.0 us

--- Packet size: 512B ---
  Target: 70,000 pps ... TX: 70,000 pps, RX: 69,000 pps, Drop: 1.4284%, Lat avg: 165.0 us
  Target: 140,000 pps ... TX: 140,000 pps, RX: 139,000 pps, Drop: 0.7142%, Lat avg: 0.0 us
  Target: 350,000 pps ... TX: 350,000 pps, RX: 348,982 pps, Drop: 0.2908%, Lat avg: 0.0 us
  Target: 700,000 pps ... TX: 700,000 pps, RX: 680,392 pps, Drop: 2.8012%, Lat avg: 187.0 us

--- Packet size: 1400B ---
  Target: 70,000 pps ... TX: 70,000 pps, RX: 69,000 pps, Drop: 1.4283%, Lat avg: 194.0 us
  Target: 140,000 pps ... TX: 140,000 pps, RX: 139,000 pps, Drop: 0.7142%, Lat avg: 0.0 us
  Target: 350,000 pps ... TX: 350,000 pps, RX: 348,999 pps, Drop: 0.2859%, Lat avg: 0.0 us
  Target: 700,000 pps ... TX: 476,709 pps, RX: 475,880 pps, Drop: 0.1738%, Lat avg: 2582.0 us

--- Packet size: 8500B ---
  (jumbo: capping at 418,133 pps for 30.0 Gbps limit)
  Target: 70,000 pps ... TX: 70,000 pps, RX: 69,000 pps, Drop: 1.4284%, Lat avg: 0.0 us
  Target: 140,000 pps ... TX: 78,305 pps, RX: 75,454 pps, Drop: 3.6399%, Lat avg: 0.0 us
  Target: 350,000 pps ... TX: 78,303 pps, RX: 77,790 pps, Drop: 0.6556%, Lat avg: 0.0 us
  Target: 700,000 pps ... SKIPPED (exceeds 30.0 Gbps cap)

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

@github-actions

Copy link
Copy Markdown

[Perf] Stage: Benchmark (4/4)

Running native-dpdk benchmark...
Packet sizes: 64,512,1400,8500 | 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:ff:cb:2e:8b:ed
  Port 1: 02:ff:f5:9b:74:3d
PREFLIGHT_OK

@github-actions

Copy link
Copy Markdown

[Perf] Benchmark Diag: native-dpdk result

SSM exit: 0

Output (last 30 lines)
Duration per step: 30s
Source MAC: 02:ff:cb:2e:8b:ed

--- Packet size: 64B ---
  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: 134.0 us
  Target: 350,000 pps ... TX: 350,000 pps, RX: 350,000 pps, Drop: 0.0%, Lat avg: 144.0 us
  Target: 700,000 pps ... TX: 700,000 pps, RX: 699,956 pps, Drop: 0.0064%, Lat avg: 218.0 us

--- Packet size: 512B ---
  Target: 70,000 pps ... TX: 70,000 pps, RX: 70,000 pps, Drop: 0.0%, Lat avg: 124.0 us
  Target: 140,000 pps ... TX: 140,000 pps, RX: 140,000 pps, Drop: 0.0%, Lat avg: 146.0 us
  Target: 350,000 pps ... TX: 350,000 pps, RX: 350,000 pps, Drop: 0.0%, Lat avg: 160.0 us
  Target: 700,000 pps ... TX: 700,000 pps, RX: 699,528 pps, Drop: 0.0674%, Lat avg: 246.0 us

--- Packet size: 1400B ---
  Target: 70,000 pps ... TX: 70,000 pps, RX: 70,000 pps, Drop: 0.0%, Lat avg: 122.0 us
  Target: 140,000 pps ... TX: 140,000 pps, RX: 140,000 pps, Drop: 0.0%, Lat avg: 152.0 us
  Target: 350,000 pps ... TX: 350,000 pps, RX: 350,000 pps, Drop: 0.0%, Lat avg: 169.0 us
  Target: 700,000 pps ... TX: 476,349 pps, RX: 476,333 pps, Drop: 0.0033%, Lat avg: 2649.0 us

--- Packet size: 8500B ---
  (jumbo: capping at 418,133 pps for 30.0 Gbps limit)
  Target: 70,000 pps ... TX: 70,000 pps, RX: 70,000 pps, Drop: 0.0%, Lat avg: 146.0 us
  Target: 140,000 pps ... TX: 78,355 pps, RX: 78,311 pps, Drop: 0.0561%, Lat avg: 14133.0 us
  Target: 350,000 pps ... TX: 78,354 pps, RX: 78,140 pps, Drop: 0.2733%, Lat avg: 14211.0 us
  Target: 700,000 pps ... SKIPPED (exceeds 30.0 Gbps cap)

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) ===
  ############################################################################
Telling cores to stop...
Waiting for lcores to finish...

  ---------------------- Forward statistics for port 0  ----------------------
  RX-packets: 113485625      RX-dropped: 0             RX-total: 113485625
  RX-error: 403645
  RX-nombufs: 0             
  TX-packets: 113481617      TX-dropped: 4008          TX-total: 113485625
  ----------------------------------------------------------------------------

  +++++++++++++++ Accumulated forward statistics for all ports+++++++++++++++
  RX-packets: 113485625      RX-dropped: 0             RX-total: 113485625
  TX-packets: 113481617      TX-dropped: 4008          TX-total: 113485625
  ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Done.

Stopping port 0...
Stopping ports...
Done

Shutting down port 0...
ena_rx_queue_release(): Rx queue 0:0 released
ena_tx_queue_release(): Tx queue 0:0 released
Closing ports...
Port 0 is closed
Done

Bye...
=== ENA port stats ===
N/A (vfio-pci)

@github-actions

Copy link
Copy Markdown

[Perf] Stage: Results

[05:39:48] INFO Generating markdown summary...

Performance Test Results — c6in.xlarge

Commit: 49b7b410
Timestamp: 2026-10-26T05:39:48.695986+00:00

64B packets

Config Target PPS TX pps RX pps Drop % NIC imissed NIC ierrors NIC nombuf App Drops Lat Avg (us) Lat Max (us) TX Mbps RX Mbps
native-dpdk 70,000 70,000 70,000 0.00% — — — — 125.0 184.0 35.8 35.8
native-dpdk 140,000 140,000 140,000 0.00% — — — — 134.0 237.0 71.7 71.7
native-dpdk 350,000 350,000 350,000 0.00% — — — — 144.0 251.0 179.2 179.2
native-dpdk 700,000 700,000 699,956 0.01% — — — — 218.0 1566.0 358.4 358.4
rust-dpdk 70,000 70,000 69,000 1.43% 0 32,400 0 0 261.0 0.0 35.8 35.3
rust-dpdk 140,000 140,000 139,000 0.71% 0 41,935 0 0 280.0 0.0 71.7 71.2
rust-dpdk 350,000 350,000 348,928 0.31% 0 33,845 0 0 275.0 0.0 179.2 178.7
rust-dpdk 700,000 700,000 647,690 7.47% 0 29,744 0 0 0.0 0.0 358.4 331.6
tokio-dpdk 70,000 70,000 69,000 1.43% 0 31,877 0 0 144.0 0.0 35.8 35.3
tokio-dpdk 140,000 140,000 139,000 0.71% 0 41,912 0 0 137.0 0.0 71.7 71.2
tokio-dpdk 350,000 350,000 349,000 0.29% 0 33,747 0 0 0.0 0.0 179.2 178.7
tokio-dpdk 700,000 700,000 681,301 2.67% 0 41,130 0 0 0.0 0.0 358.4 348.8
plain-rust 70,000 70,000 69,000 1.43% — — — — 0.0 0.0 35.8 35.3
plain-rust 140,000 140,000 139,000 0.71% — — — — 220.0 0.0 71.7 71.2
plain-rust 350,000 350,000 348,673 0.38% — — — — 390.0 0.0 179.2 178.5
plain-rust 700,000 700,000 595,073 14.99% — — — — 0.0 0.0 358.4 304.7

512B packets

Config Target PPS TX pps RX pps Drop % NIC imissed NIC ierrors NIC nombuf App Drops Lat Avg (us) Lat Max (us) TX Mbps RX Mbps
native-dpdk 70,000 70,000 70,000 0.00% — — — — 124.0 261.0 286.7 286.7
native-dpdk 140,000 140,000 140,000 0.00% — — — — 146.0 278.0 573.4 573.4
native-dpdk 350,000 350,000 350,000 0.00% — — — — 160.0 421.0 1433.6 1433.6
native-dpdk 700,000 700,000 699,528 0.07% — — — — 246.0 2506.0 2867.2 2865.3
rust-dpdk 70,000 70,000 69,000 1.43% 0 41,155 0 0 0.0 0.0 286.7 282.6
rust-dpdk 140,000 140,000 139,000 0.71% 0 32,184 0 0 0.0 0.0 573.4 569.3
rust-dpdk 350,000 350,000 349,000 0.29% 0 41,866 0 0 0.0 0.0 1433.6 1429.5
rust-dpdk 700,000 700,000 697,889 0.30% 0 34,063 0 0 0.0 0.0 2867.2 2858.6
tokio-dpdk 70,000 70,000 69,000 1.43% 0 35,693 0 0 165.0 0.0 286.7 282.6
tokio-dpdk 140,000 140,000 139,000 0.71% 0 31,933 0 0 0.0 0.0 573.4 569.3
tokio-dpdk 350,000 350,000 348,982 0.29% 0 41,719 0 0 0.0 0.0 1433.6 1429.4
tokio-dpdk 700,000 700,000 680,392 2.80% 0 32,726 0 0 187.0 0.0 2867.2 2786.9
plain-rust 70,000 70,000 69,000 1.43% — — — — 0.0 0.0 286.7 282.6
plain-rust 140,000 140,000 138,995 0.72% — — — — 222.0 0.0 573.4 569.3
plain-rust 350,000 350,000 348,940 0.30% — — — — 0.0 0.0 1433.6 1429.3
plain-rust 700,000 700,000 550,103 21.41% — — — — 374.0 0.0 2867.2 2253.2

1400B packets

Config Target PPS TX pps RX pps Drop % NIC imissed NIC ierrors NIC nombuf App Drops Lat Avg (us) Lat Max (us) TX Mbps RX Mbps
native-dpdk 70,000 70,000 70,000 0.00% — — — — 122.0 462.0 784.0 784.0
native-dpdk 140,000 140,000 140,000 0.00% — — — — 152.0 252.0 1568.0 1568.0
native-dpdk 350,000 350,000 350,000 0.00% — — — — 169.0 449.0 3920.0 3920.0
native-dpdk 700,000 476,349 476,333 0.00% — — — — 2649.0 3523.0 5335.1 5334.9
rust-dpdk 70,000 70,000 69,000 1.43% 0 31,910 0 0 0.0 0.0 784.0 772.8
rust-dpdk 140,000 140,000 139,000 0.71% 0 41,913 0 0 0.0 0.0 1568.0 1556.8
rust-dpdk 350,000 350,000 348,932 0.31% 0 31,243 0 0 0.0 0.0 3920.0 3908.0
rust-dpdk 700,000 476,452 474,395 0.43% 0 32,129 0 0 0.0 0.0 5336.3 5313.2
tokio-dpdk 70,000 70,000 69,000 1.43% 0 41,858 0 0 194.0 0.0 784.0 772.8
tokio-dpdk 140,000 140,000 139,000 0.71% 0 35,485 0 0 0.0 0.0 1568.0 1556.8
tokio-dpdk 350,000 350,000 348,999 0.29% 0 31,400 0 0 0.0 0.0 3920.0 3908.8
tokio-dpdk 700,000 476,709 475,880 0.17% 0 32,187 0 0 2582.0 0.0 5339.1 5329.9
plain-rust 70,000 70,000 69,000 1.43% — — — — 218.0 0.0 784.0 772.8
plain-rust 140,000 140,000 138,993 0.72% — — — — 0.0 0.0 1568.0 1556.7
plain-rust 350,000 350,000 348,417 0.45% — — — — 0.0 0.0 3920.0 3902.3
plain-rust 700,000 476,360 438,262 8.00% — — — — 0.0 0.0 5335.2 4908.5

8500B packets

Config Target PPS TX pps RX pps Drop % NIC imissed NIC ierrors NIC nombuf App Drops Lat Avg (us) Lat Max (us) TX Mbps RX Mbps
native-dpdk 70,000 70,000 70,000 0.00% — — — — 146.0 229.0 4760.0 4760.0
native-dpdk 140,000 78,355 78,311 0.06% — — — — 14133.0 15107.0 5328.1 5325.1
native-dpdk 350,000 78,354 78,140 0.27% — — — — 14211.0 14980.0 5328.1 5313.5
rust-dpdk 70,000 70,000 69,000 1.43% 0 31,965 0 0 522.0 0.0 4760.0 4692.0
rust-dpdk 140,000 78,287 75,512 3.54% 0 20,785 0 0 0.0 0.0 5323.5 5134.8
rust-dpdk 350,000 78,304 77,860 0.57% 0 6,674 0 0 0.0 0.0 5324.6 5294.5
tokio-dpdk 70,000 70,000 69,000 1.43% 0 31,988 0 0 0.0 0.0 4760.0 4692.0
tokio-dpdk 140,000 78,305 75,454 3.64% 0 21,209 0 0 0.0 0.0 5324.7 5130.9
tokio-dpdk 350,000 78,303 77,790 0.66% 0 6,674 0 0 0.0 0.0 5324.6 5289.7
plain-rust 70,000 70,000 33,503 52.14% — — — — 0.0 0.0 4760.0 2278.2
plain-rust 140,000 78,301 75,148 4.03% — — — — 13821.0 0.0 5324.5 5110.1
plain-rust 350,000 78,354 78,013 0.44% — — — — 0.0 0.0 5328.1 5304.9

NIC Drops Instrumentation Self-Check

Compares (NIC-FINAL − NIC-BASELINE) one-shot snapshots against the sum of per-tick [PERF] deltas over the reporter's lifetime. These MUST match exactly — a mismatch means per-tick delta bookkeeping is losing data.

Config Status imissed (expected / actual / Δ) ierrors (expected / actual / Δ) rx_nombuf (expected / actual / Δ)
native-dpdk no instrumentation — — —
rust-dpdk OK 0 / 0 / 0 401,369 / 401,369 / 0 0 / 0 / 0
tokio-dpdk OK 0 / 0 / 0 402,027 / 402,027 / 0 0 / 0 / 0
plain-rust no instrumentation — — —
native-dpdk-v6 no data — — —
rust-dpdk-v6 no data — — —

expected = FINAL − BASELINE (raw NIC counter delta across reporter lifetime). actual = sum of per-tick [PERF] delta fields. Any Δ ≠ 0 is a bug in the tick loop's bookkeeping.

plain-rust Kernel NIC Drops (ethtool -S delta)

ethtool snapshots not available — baseline or final file missing in $LOGS_DIR/dut-plain-rust-ethtool-*.txt.

Full results artifact

@gspivey
gspivey merged commit 2a84ae5 into development Oct 26, 2026
18 of 20 checks passed
@gspivey
gspivey deleted the agent/tokio-echo-fair-concurrent-modes branch October 26, 2026 10:52
gspivey added a commit that referenced this pull request Oct 26, 2026
Finalize commits missed when #138 merged (one-off pre-step).

- Adds the `docs/perf-test-log.md` Run #36 entry using tokio-dpdk fair
numbers from GH Actions run 40270657131 (perf-results artifact; no
local/synthetic data), with regression check vs Run #35. tokio-dpdk
700K/64B: 320,776 -> 681,301 RX. One flagged variance: rust-dpdk
700K/64B 7.5% drop vs 0.8% (code untouched).
- Ticks item 45 as `- [x] Complete · PR: #138` and moves it to
Completed.
- Marks tasks 1.1-1.7 done in `.kiro/specs/tokio-udp-perf/tasks.md`.

Docs only; no code changes.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-authored-by: Kiro <kiro@gspivey.com>
Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com>
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.

1 participant