Skip to content

perf(sock): attribute UDP queue loss and keep the 8 MiB socket buffers - #7529

Merged
kixelated merged 6 commits into
mainfrom
quest/m2/performance-survey/socket-queues
Nov 3, 2026
Merged

kixelated merged 6 commits into
mainfrom
quest/m2/performance-survey/socket-queues

Conversation

@kixelated

@kixelated kixelated commented Nov 1, 2026 •

Copy link
Copy Markdown
Collaborator

Finishes quest/m2/performance-survey/socket-queues.md as a measured no-win: the relay keeps its fixed 8 MiB UDP buffer request and gets no new setting. This PR adds the benchmark and sampler instrumentation that produced the result and schedules both nightly.

Changes

  • benchmark_socket_queues (rs/moq-uring/tests/integration/socket_queues.rs, ignored, nightly in rust-test). It runs on both receive paths a relay uses: moq-sock recvmmsg under Tokio, and the moq-uring multishot ring. Receivers are a steered moq_sock::shard::bind group, so they start with the production buffer request, and every flow's short-header CID steers it to a known worker. The axes vary one at a time:

    • kernel queue size;
    • rx_buffers_max (pool depth);
    • workers, flows, and GSO trains;
    • load pattern: periodic worker stalls, CPU contention (3 spinners pinned to the worker's CPU), sustained overload (25 µs of work per datagram against 50k/s), and a moq-shaper path at 80% of the offered rate with a deep (200 ms) finite queue that drops on overflow.

    Each row accounts for every datagram: sent, delivered, sk_drops (via SO_MEMINFO, the same counter SO_RXQ_OVFL reports), path drops (the shaper's overflow), and unattributed. Next to those it prints namespace RcvbufErrors, softnet_stat backlog drops, rx_enobufs, peak queued bytes, p50/p99/max delay, goodput, and receive CPU per datagram. Rounds interleave the cells (SOCKET_QUEUES_RUNS, default 3).

  • moq-bench-host UDP accounting (rs/moq-bench/src/host/udp.rs). A sock_diag dump (what ss -uam reads; no privilege needed) is matched against the target's /proc/<pid>/fd socket inodes. Per sample it adds udp_sockets, the granted udp_rcvbuf_min/udp_sndbuf_min, udp_rx_queue_bytes, and the cumulative udp_drops, which handles the wrapping u32 and keeps the counts of closed sockets. The namespace udp_rcvbuf_errors/udp_sndbuf_errors/udp_in_errors come along as a cross-check. bench/summary.py diffs the samples that bracket the load window, so a drop is never split across the boundary. Every relay summary now carries these fields for the relay and the generator. The nightly bench-shard table prints sock-drops and gen-drops. A target whose /proc/<pid>/fd the sampler may not list (another user's process) keeps its CPU and memory samples and only loses the UDP fields, like a host that refuses the dump.

  • Docs: bind.rs cites the measurement on UDP_BUFFER. The moq-uring, bench and moq-bench READMEs describe the benchmark and the fields. The epic README records the verdict.

API: none. moq-bench is publish = false, and the benchmark is a test. Wire: none. Configuration: none.

Measurements

nixos2: 12 CPUs, kernel 6.18.56, rmem_max 16 MiB, load average about 3 (other tenants). Revision 96b25dba7f (the later commits only change docs). Release build in nix develop, 3 interleaved rounds. Command:

SOCKET_QUEUES_RUNS=3 cargo test -p moq-uring --release --test integration -- --ignored --exact socket_queues::benchmark_socket_queues --nocapture

Each cell offers 50k datagrams/s (480 Mbps) of 1200-byte datagrams for 1 s. queue req = relay keeps the production request. rcvbuf is the granted kernel value: Linux doubles the request, so the relay's 8 MiB shows as 16384 KiB. Drops are listed per round. Delay is the median over rounds.

path axis workers flows queue req rcvbuf KiB pool gso stall ms work us delivered socket drops (per run) path drops unattributed enobufs peak queue KiB p50 ms p99 ms rx us/dgram
tokio default 1 16 relay 16384 - 1 20 0 50000 0 / 0 / 0 0 / 0 / 0 0 / 0 / 0 0 2306 0.01 19.1 1.86
tokio queue 1 16 212992 416 - 1 20 0 43436 6592 / 6495 / 6564 0 / 0 / 0 0 / 0 / 0 0 414 0.01 19.2 1.93
tokio queue 1 16 1048576 2048 - 1 20 0 49192 839 / 766 / 808 0 / 0 / 0 0 / 0 / 0 0 2047 0.01 19.1 2.16
tokio queue 1 16 4194304 8192 - 1 20 0 50000 0 / 0 / 0 0 / 0 / 0 0 / 0 / 0 0 2306 0.01 19.1 1.76
tokio stall 1 16 relay 16384 - 1 2 0 50000 0 / 0 / 0 0 / 0 / 0 0 / 0 / 0 0 236 0.01 1.1 1.99
tokio stall 1 16 relay 16384 - 1 100 0 50000 0 / 0 / 0 0 / 0 / 0 0 / 0 / 0 0 11344 2.79 98.2 1.31
tokio workers 4 16 relay 16384 - 1 20 0 50000 0 / 0 / 0 0 / 0 / 0 0 / 0 / 0 0 569 0.01 18.8 4.25
tokio workers 4 16 212992 416 - 1 20 0 47950 2061 / 2034 / 2050 0 / 0 / 0 0 / 0 / 0 0 418 0.01 18.8 4.59
tokio flows 1 1 relay 16384 - 1 20 0 50000 0 / 0 / 0 0 / 0 / 0 0 / 0 / 0 0 2342 0.01 19.1 1.97
tokio flows 1 256 relay 16384 - 1 20 0 50000 0 / 0 / 0 0 / 0 / 0 0 / 0 / 0 0 2313 0.01 19.1 1.97
tokio gso 1 16 212992 416 - 16 20 0 44704 335 / 331 / 330 0 / 0 / 0 5025 / 4965 / 4950 0 413 0.04 19.0 0.54
tokio contend 1 16 212992 416 - 1 0 0 49824 193 / 78 / 176 0 / 0 / 0 0 / 0 / 0 0 414 0.61 1.0 0.64
tokio contend 1 16 relay 16384 - 1 0 0 50000 0 / 0 / 0 0 / 0 / 0 0 / 0 / 0 0 659 0.60 1.0 0.52
tokio overload 1 16 212992 416 - 1 0 25 39322 10686 / 10678 / 10660 0 / 0 / 0 0 / 0 / 0 0 414 3.95 4.4 25.48
tokio overload 1 16 1048576 2048 - 1 0 25 39848 10226 / 10097 / 10152 0 / 0 / 0 0 / 0 / 0 0 2047 18.36 19.4 25.51
tokio overload 1 16 relay 16384 - 1 0 25 44750 5204 / 5250 / 5391 0 / 0 / 0 0 / 0 / 0 0 16382 125.77 150.5 25.61
tokio path 1 16 212992 416 - 1 0 0 48043 0 / 0 / 0 1957 / 1970 / 1956 0 / 0 / 0 0 76 119.08 201.0 3.39
tokio path 1 16 relay 16384 - 1 0 0 48045 0 / 0 / 0 1955 / 1955 / 1955 0 / 0 / 0 0 22 119.03 201.0 3.60
uring default 1 16 relay 16384 256 1 20 0 50000 0 / 0 / 0 0 / 0 / 0 0 / 0 / 0 3 2558 0.01 19.4 1.55
uring queue 1 16 212992 416 256 1 20 0 43344 6639 / 6669 / 6656 0 / 0 / 0 0 / 0 / 0 3 414 0.01 19.5 1.72
uring queue 1 16 1048576 2048 256 1 20 0 49079 921 / 921 / 957 0 / 0 / 0 0 / 0 / 0 3 2047 0.01 19.4 1.61
uring queue 1 16 4194304 8192 256 1 20 0 50000 0 / 0 / 0 0 / 0 / 0 0 / 0 / 0 3 2515 0.01 19.4 1.58
uring stall 1 16 relay 16384 256 1 2 0 50000 0 / 0 / 0 0 / 0 / 0 0 / 0 / 0 3 366 0.01 1.4 1.76
uring stall 1 16 relay 16384 256 1 100 0 50000 0 / 0 / 0 0 / 0 / 0 0 / 0 / 0 3 11637 3.71 98.8 1.20
uring pool 1 16 relay 16384 16 1 20 0 50000 0 / 0 / 0 0 / 0 / 0 0 / 0 / 0 511 2308 0.01 19.1 1.58
uring pool 1 16 212992 416 16 1 20 0 43391 6599 / 6609 / 6697 0 / 0 / 0 0 / 0 / 0 153 414 0.01 19.2 1.75
uring pool 1 16 212992 416 4096 1 20 0 43353 6662 / 6647 / 6630 0 / 0 / 0 0 / 0 / 0 3 414 0.01 19.5 1.73
uring workers 4 16 relay 16384 256 1 20 0 50000 0 / 0 / 0 0 / 0 / 0 0 / 0 / 0 12 650 0.01 19.0 3.44
uring workers 4 16 212992 416 256 1 20 0 47941 2059 / 2039 / 2064 0 / 0 / 0 0 / 0 / 0 12 418 0.01 19.0 3.48
uring flows 1 1 relay 16384 256 1 20 0 50000 0 / 0 / 0 0 / 0 / 0 0 / 0 / 0 3 2538 0.01 19.4 1.69
uring flows 1 256 relay 16384 256 1 20 0 50000 0 / 0 / 0 0 / 0 / 0 0 / 0 / 0 3 2664 0.01 19.4 1.69
uring gso 1 16 212992 416 256 16 20 0 44688 332 / 332 / 331 0 / 0 / 0 4980 / 4980 / 4965 1 413 0.04 19.0 0.43
uring contend 1 16 212992 416 256 1 0 0 49522 717 / 478 / 466 0 / 0 / 0 0 / 0 / 0 3 414 0.61 2.0 0.65
uring contend 1 16 relay 16384 256 1 0 0 50000 0 / 0 / 0 0 / 0 / 0 0 / 0 / 0 3 1503 0.61 4.2 0.66
uring overload 1 16 212992 416 256 1 0 25 38987 11013 / 10912 / 11058 0 / 0 / 0 0 / 0 / 0 3 414 4.00 4.5 25.69
uring overload 1 16 1048576 2048 256 1 0 25 39503 10527 / 10270 / 10497 0 / 0 / 0 0 / 0 / 0 3 2047 18.57 19.6 25.74
uring overload 1 16 relay 16384 256 1 0 25 44518 5731 / 5482 / 5380 0 / 0 / 0 0 / 0 / 0 3 16382 130.52 151.2 25.74
uring path 1 16 212992 416 256 1 0 0 48040 0 / 0 / 0 1950 / 1960 / 1959 10 / 0 / 0 0 20 119.09 200.9 2.56
uring path 1 16 relay 16384 256 1 0 0 48045 0 / 0 / 0 1954 / 1972 / 1955 0 / 0 / 0 0 22 119.19 201.0 2.57

How to read it:

  • Loss follows the kernel queue against the stall, and nothing else. With 20 ms stalls, the 208 KiB default dropped ~13%, 1 MiB dropped ~1.7%, and 4 MiB and the relay's 8 MiB dropped nothing. The relay request also absorbed a 100 ms stall with zero drops (peak 11.3 MiB queued). Pool depth did not change the drops (16 / 256 / 4096 buffers at 208 KiB: ~6.6k each), and neither did flows (1 / 16 / 256) or the receive path. With a 16-buffer pool, rx_enobufs fired ~511 times and nothing was lost: starvation is not loss. Four workers split the backlog, which cut the default queue's drops to ~4%.
  • Contention: three spinners on the worker's CPU dropped 0.2–1.4% at the default queue and nothing at the relay's.
  • Delay cost: a bigger queue adds delay only under sustained overload, when the queue sits full. Loss was ~21% at 208 KiB and ~11% at the relay size, and p50 delay went 4 ms → 18 ms (1 MiB) → ~126–130 ms (relay). In the stall and contention cells delay was set by the stall, not by the queue.
  • Memory: kernel queue memory is rmem_alloc, used only while a backlog exists. The peak was 2.3 MiB in a 20 ms stall, and the idle cost is zero.
  • Attribution closes. With plain sends and no path in between, unattributed was 0 in every row. GSO trains show the GRO caveat: ~332 socket drops stood for ~5300 lost datagrams, 16 per coalesced skb. The shaped path put every drop on the path (~1955 shaper overflows, 0 socket drops). Once, 10 datagrams were dropped at the shaper's own default-sized socket, which shows as unattributed. Namespace RcvbufErrors also moved with other tenants on the local host, so the per-socket counter is the one to trust.

Relay level, same host: just bench-shard "0 1 4" "16 64 256" (room video and 1×N fanout, shared runtime vs 1 and 4 Tokio shards):

value
socket drops, relay and generator, every case 0
namespace RcvbufErrors over each window 0
granted receive buffer (relay and generator) 16 MiB (kernel units)
sampled peak queued bytes at the relay 0 – 115 KB (video 256 conns, 1 shard), under 1% of the grant

The shared-runtime fanout cases reported 0.05–0.12% application loss with zero socket drops, so that loss is not local queue overflow. Raw rows for both runs: evidence comment.

A local run on the loaded 24-CPU dev host (kernel 7.0, rmem_max 4 MiB, so the relay request was clamped to 4 MiB) matched the above. The one exception: the clamped queue dropped 14% in the 100 ms stall where nixos2's full grant dropped nothing. The existing warning already names net.core.rmem_max for that case.

Nightly: just gh nightly rust-test runs the benchmark (table in the job log; this group publishes no report). just bench-shard now prints sock-drops/gen-drops. It is a local diagnostic since moq-dev/moq#7603 removed the Nightly "Relay shard sweep" job.

Choices made without asking

  • SO_MEMINFO polling instead of parsing SO_RXQ_OVFL. Both read the same per-socket sk_drops. Polling needs no ancillary space on either production receive stack, so it does not touch the cmsg buffer that moq-dev/moq#7394 is resizing, and it adds no per-packet cost. The quest said to keep instrumentation private, so production code is unchanged. Rollover is handled per socket.
  • Relay-level drops come from sock_diag, not /proc/net/udp, because only sock_diag also reports the granted buffer the survey contract asks for ("record effective values").
  • Keep 8 MiB. The plan's default applies: the measurements show no gain from a new configuration surface. Smaller queues lose datagrams to ordinary stalls. Larger queues cost delay only when a worker is already overloaded and losing datagrams anyway.
  • The benchmark asserts only accounting invariants (steering, delivered + dropped ≤ sent), not timing or loss thresholds.

Follow-ups (for /quest-merge to plan)

  • moq-shaper binds its listen socket at the 208 KiB default. At 480 Mbps it occasionally drops at its own socket, which a drill would read as path loss. Growing its buffers, or reporting its own sk_drops, would keep its path attribution exact.
  • The relay's /metrics could export per-socket sk_drops if an operator ever needs to attribute local loss in production. Nothing in this survey needed it, so it stays out of scope.

Online review findings (iteration on e1d3b60)

  • Fixed: OpenAI review P2. An unreadable /proc/<pid>/fd used to fail the whole sample, so another user's process was reported as exited. udp::inodes now keeps PermissionDenied distinct, and udp_sample drops only that target's UDP fields, once and loudly; any other fd error still means the target exited. Covered by denied_fd_table_drops_only_udp, and checked by hand against pid 1 (systemd) as a normal user: it now samples CPU and RSS without the udp_* fields.
  • Fixed: pullfrog thread. A NLMSG_ERROR whose nlmsg_len is 16–19 at the end of a datagram indexed past the slice and panicked. The code read is now bounded by the message length. Covered by short_error_is_rejected.
  • Declined: pullfrog thread about inode reuse. sockfs numbers socket inodes from get_next_ino() (sock_alloc in net/socket.c), a global counter that only repeats after 2^32 allocations. A reuse between two sampler rounds cannot happen, so keying by idiag_cookie would add nothing. The Drops doc comment now says so.

Checks

On head 9f5f356868, after merging origin/main 945aec5a53. Conflicts:

  • sh/gh/nightly.sh: kept main's benchmark_datagram_delivery and this PR's benchmark_socket_queues.
  • bench/README.md: kept main's statement that the shard sweep is local-only, not a nightly series, with this PR's sock-drops/gen-drops description.
  • quest/m2/perf/uring-pool-memory.md: main deleted it (moq-dev/moq#7233 finished it). It stays deleted; the pool-depth finding is still in rs/moq-uring/README.md.
  • quest/m2/performance-survey/socket-queues.md: main edited it. It stays deleted, because this PR finishes it.

Two decisions landed on main since the last head. Neither contradicts this PR:

  • moq-dev/moq#7624 sized the QUIC flow-control windows (4 MiB clients, 16 MiB peers, 1 MiB stream). It did not touch the kernel socket buffers, and UDP_BUFFER on main is still 8 MiB.
  • moq-dev/moq#7603 deleted three log-only Nightly relay jobs. It kept the rust-test ignored benchmarks that this PR's benchmark joins.

Results:

  • quest gate nix develop --command just check origin/main passed: rs, bench, markdown, gh, quest, shell and the rest. Rust tests: 11425/11425. Flake was skipped (this host's Nix builder cannot create user namespaces).
  • quest check --base origin/main passed (552 documents).
  • SOCKET_QUEUES_RUNS=1 … benchmark_socket_queues passed on the merged head. This host's rmem_max is 4 MiB, so the relay request was clamped there.

Review

  • Reviewer: Codex (quest review), gpt-6.1-sol, medium effort.
  • Head: 9f5f3568682096cc58bab6a6b690a8d00ff27df3, round 1 of a new session, against origin/main 945aec5a5391.
  • Findings: none.
  • Online reviewers: every finding was addressed before this round (see above). Both review threads are resolved.

(Written by Claude Opus 5.5)

🤖 Generated with Claude Code

kixelated and others added 3 commits November 1, 2026 01:54
…y sampler

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The socket-queue sweep shows loss follows the kernel queue against worker
stalls while pool depth, flows and the receive path do not change it, and
relay shard sweeps see no socket drops. Record the evidence where the
setting lives, share the pool finding with the io_uring pool quest, and
finish the quest.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@kixelated

Copy link
Copy Markdown
Collaborator Author

Raw evidence for the measurements in the description (nixos2, revision 96b25dba7f).

benchmark_socket_queues, 3 rounds, every row
# kernel 6.18.56
# net.core.rmem_max 16777216 rmem_default 212992 wmem_max 16777216
# cpus 12 loadavg 3.00 3.30 3.44 2/1080 4003245
# offered 50000 datagrams/s of 1200 bytes for 1s per cell; 100ms between stalls
run,path,axis,pattern,workers,flows,queue_req,rcvbuf,pool,gso,stall_ms,work_us,sent,send_dropped,delivered,socket_drops,path_drops,unattributed,snmp_rcvbuf_errors,backlog_drops,enobufs,peak_queue_kib,p50_ms,p99_ms,max_ms,goodput_mbps,rx_cpu_us_per_dgram
0,tokio,default,stall,1,16,relay,16777216,256,1,20,0,50000,0,50000,0,0,0,0,0,0,2423,0.02,19.11,20.25,480.0,5.41
0,tokio,queue,stall,1,16,212992,425984,256,1,20,0,50000,0,43408,6592,0,0,6592,0,0,414,0.01,19.20,20.20,416.7,5.41
0,tokio,queue,stall,1,16,1048576,2097152,256,1,20,0,50000,0,49161,839,0,0,839,0,0,2047,0.02,19.12,20.20,471.9,5.28
0,tokio,queue,stall,1,16,4194304,8388608,256,1,20,0,50000,0,50000,0,0,0,0,0,0,2299,0.01,19.10,20.12,480.0,1.76
0,tokio,stall,stall,1,16,relay,16777216,256,1,2,0,50000,0,50000,0,0,0,0,0,0,236,0.01,1.11,2.11,480.0,1.99
0,tokio,stall,stall,1,16,relay,16777216,256,1,100,0,50000,0,50000,0,0,0,0,0,0,11344,2.79,98.19,100.13,480.0,1.33
0,tokio,workers,stall,4,16,relay,16777216,256,1,20,0,50000,0,50000,0,0,0,0,0,0,569,0.01,18.80,20.13,480.0,4.77
0,tokio,workers,stall,4,16,212992,425984,256,1,20,0,50000,0,47939,2061,0,0,2061,0,0,418,0.01,18.98,20.20,460.2,5.27
0,tokio,flows,stall,1,1,relay,16777216,256,1,20,0,50000,0,50000,0,0,0,0,0,0,2382,0.01,19.06,20.16,480.0,4.39
0,tokio,flows,stall,1,256,relay,16777216,256,1,20,0,50000,0,50000,0,0,0,0,0,0,2380,0.01,19.09,20.16,480.0,4.18
0,tokio,gso,stall,1,16,212992,425984,256,16,20,0,50000,0,44640,335,0,5025,335,0,0,413,0.11,19.04,20.08,428.5,2.24
0,tokio,contend,contend,1,16,212992,425984,256,1,0,0,50000,0,49807,193,0,0,193,0,0,414,0.60,1.00,6.15,478.1,0.64
0,tokio,contend,contend,1,16,relay,16777216,256,1,0,0,50000,0,50000,0,0,0,0,0,0,501,0.59,0.98,4.70,480.0,0.56
0,tokio,overload,overload,1,16,212992,425984,256,1,0,25,50000,0,39314,10686,0,0,10686,0,0,414,3.96,4.39,4.57,377.4,25.48
0,tokio,overload,overload,1,16,1048576,2097152,256,1,0,25,50000,0,39774,10226,0,0,10226,0,0,2047,18.38,19.36,19.64,381.8,25.55
0,tokio,overload,overload,1,16,relay,16777216,256,1,0,25,50000,0,44796,5204,0,0,5204,0,0,16382,127.00,150.53,151.18,430.0,25.61
0,tokio,path,path,1,16,212992,425984,256,1,0,0,50000,0,48043,0,1957,0,0,0,0,22,119.03,201.00,201.98,461.2,3.39
0,tokio,path,path,1,16,relay,16777216,256,1,0,0,50000,0,48045,0,1955,0,0,0,0,22,119.03,201.03,201.18,461.2,3.18
0,uring,default,stall,1,16,relay,16777216,256,1,20,0,50000,0,50000,0,0,0,0,0,3,2304,0.01,19.14,20.16,480.0,1.67
0,uring,queue,stall,1,16,212992,425984,256,1,20,0,50000,0,43361,6639,0,0,6639,0,3,414,0.01,19.49,21.65,416.3,2.26
0,uring,queue,stall,1,16,1048576,2097152,256,1,20,0,50000,0,49079,921,0,0,921,0,3,2047,0.01,19.46,21.63,471.2,1.61
0,uring,queue,stall,1,16,4194304,8388608,256,1,20,0,50000,0,50000,0,0,0,0,0,3,2571,0.01,19.41,21.64,480.0,1.71
0,uring,stall,stall,1,16,relay,16777216,256,1,2,0,50000,0,50000,0,0,0,0,0,3,366,0.01,1.45,3.95,480.0,1.76
0,uring,stall,stall,1,16,relay,16777216,256,1,100,0,50000,0,50000,0,0,0,0,0,3,11637,3.83,98.83,101.66,480.0,1.20
0,uring,pool,stall,1,16,relay,16777216,16,1,20,0,50000,0,50000,0,0,0,0,0,520,2317,0.01,19.09,20.14,480.0,1.99
0,uring,pool,stall,1,16,212992,425984,16,1,20,0,50000,0,43401,6599,0,0,6599,0,92,414,0.01,19.16,20.13,416.6,1.75
0,uring,pool,stall,1,16,212992,425984,4096,1,20,0,50000,0,43338,6662,0,0,6662,0,3,414,0.01,19.49,22.38,416.0,2.36
0,uring,workers,stall,4,16,relay,16777216,256,1,20,0,50000,0,50000,0,0,0,0,0,12,663,0.01,19.01,20.53,480.0,3.60
0,uring,workers,stall,4,16,212992,425984,256,1,20,0,50000,0,47941,2059,0,0,2059,0,12,418,0.01,19.04,20.27,460.2,3.46
0,uring,flows,stall,1,1,relay,16777216,256,1,20,0,50000,0,50000,0,0,0,0,0,3,2565,0.01,19.39,21.66,480.0,1.69
0,uring,flows,stall,1,256,relay,16777216,256,1,20,0,50000,0,50000,0,0,0,0,0,3,2679,0.01,19.46,22.13,480.0,1.74
0,uring,gso,stall,1,16,212992,425984,256,16,20,0,50000,0,44688,332,0,4980,332,0,1,413,0.03,19.00,20.31,429.0,0.50
0,uring,contend,contend,1,16,212992,425984,256,1,0,0,50000,0,49283,717,0,0,717,0,3,414,0.61,2.30,14.97,473.1,0.65
0,uring,contend,contend,1,16,relay,16777216,256,1,0,0,50000,0,50000,0,0,0,0,0,3,1386,0.61,2.97,11.27,480.0,0.68
0,uring,overload,overload,1,16,212992,425984,256,1,0,25,50000,0,38987,11013,0,0,11013,0,3,414,4.00,4.47,4.98,374.3,25.69
0,uring,overload,overload,1,16,1048576,2097152,256,1,0,25,50000,0,39473,10527,0,0,10527,0,3,2047,18.57,19.58,19.88,378.9,25.74
0,uring,overload,overload,1,16,relay,16777216,256,1,0,25,50000,0,44269,5731,0,0,5731,0,3,16382,130.52,151.15,151.91,425.0,25.75
0,uring,path,path,1,16,212992,425984,256,1,0,0,50000,0,48040,0,1950,10,10,0,1,85,119.04,200.95,201.18,461.2,2.48
0,uring,path,path,1,16,relay,16777216,256,1,0,0,50000,0,48046,0,1954,0,0,0,0,20,119.03,200.97,201.16,461.2,2.61
1,tokio,default,stall,1,16,relay,16777216,256,1,20,0,50000,0,50000,0,0,0,0,0,0,2306,0.01,19.11,20.12,480.0,1.86
1,tokio,queue,stall,1,16,212992,425984,256,1,20,0,50000,0,43505,6495,0,0,6495,0,0,414,0.01,19.41,21.64,417.6,1.93
1,tokio,queue,stall,1,16,1048576,2097152,256,1,20,0,50000,0,49234,766,0,0,766,0,0,2047,0.01,19.11,20.12,472.6,1.73
1,tokio,queue,stall,1,16,4194304,8388608,256,1,20,0,50000,0,50000,0,0,0,0,0,0,2306,0.01,19.09,20.12,480.0,2.00
1,tokio,stall,stall,1,16,relay,16777216,256,1,2,0,50000,0,50000,0,0,0,0,0,0,231,0.01,1.12,2.12,480.0,2.08
1,tokio,stall,stall,1,16,relay,16777216,256,1,100,0,50000,0,50000,0,0,0,0,0,0,11358,2.77,98.18,100.12,480.0,1.30
1,tokio,workers,stall,4,16,relay,16777216,256,1,20,0,50000,0,50000,0,0,0,0,0,0,569,0.01,18.79,20.10,480.0,4.13
1,tokio,workers,stall,4,16,212992,425984,256,1,20,0,50000,0,47966,2034,0,0,2034,0,0,416,0.01,18.81,20.09,460.5,4.41
1,tokio,flows,stall,1,1,relay,16777216,256,1,20,0,50000,0,50000,0,0,0,0,0,0,2277,0.01,19.06,20.13,480.0,1.97
1,tokio,flows,stall,1,256,relay,16777216,256,1,20,0,50000,0,50000,0,0,0,0,0,0,2313,0.01,19.10,20.12,480.0,1.97
1,tokio,gso,stall,1,16,212992,425984,256,16,20,0,50000,0,44704,331,0,4965,331,0,0,413,0.04,19.02,19.89,429.2,0.48
1,tokio,contend,contend,1,16,212992,425984,256,1,0,0,50000,0,49922,78,0,0,78,0,0,414,0.61,0.98,5.12,479.3,0.53
1,tokio,contend,contend,1,16,relay,16777216,256,1,0,0,50000,0,50000,0,0,0,0,0,0,659,0.60,0.98,5.99,480.0,0.51
1,tokio,overload,overload,1,16,212992,425984,256,1,0,25,50000,0,39322,10678,0,0,10678,0,0,414,3.95,4.38,4.60,377.5,25.48
1,tokio,overload,overload,1,16,1048576,2097152,256,1,0,25,50000,0,39903,10097,0,0,10097,0,0,2047,18.33,19.31,19.55,383.1,25.48
1,tokio,overload,overload,1,16,relay,16777216,256,1,0,25,50000,0,44750,5250,0,0,5250,0,0,16382,125.69,151.13,151.71,429.6,25.65
1,tokio,path,path,1,16,212992,425984,256,1,0,0,50000,0,48030,0,1970,0,0,0,0,96,119.38,201.00,201.12,461.1,3.56
1,tokio,path,path,1,16,relay,16777216,256,1,0,0,50000,0,48045,0,1955,0,0,0,0,22,119.04,200.96,202.03,461.2,3.96
1,uring,default,stall,1,16,relay,16777216,256,1,20,0,50000,0,50000,0,0,0,0,0,3,2569,0.01,19.46,22.35,480.0,1.55
1,uring,queue,stall,1,16,212992,425984,256,1,20,0,50000,0,43331,6669,0,0,6669,0,3,414,0.01,19.47,21.96,416.0,1.72
1,uring,queue,stall,1,16,1048576,2097152,256,1,20,0,50000,0,49079,921,0,0,921,0,3,2047,0.01,19.40,21.67,471.2,1.96
1,uring,queue,stall,1,16,4194304,8388608,256,1,20,0,50000,0,50000,0,0,0,0,0,3,2493,0.01,19.42,21.56,480.0,1.58
1,uring,stall,stall,1,16,relay,16777216,256,1,2,0,50000,0,50000,0,0,0,0,0,3,274,0.01,1.45,3.81,480.0,1.75
1,uring,stall,stall,1,16,relay,16777216,256,1,100,0,50000,0,50000,0,0,0,0,0,3,11637,3.66,98.81,101.75,480.0,1.20
1,uring,pool,stall,1,16,relay,16777216,16,1,20,0,50000,0,50000,0,0,0,0,0,511,2308,0.01,19.11,20.13,480.0,1.47
1,uring,pool,stall,1,16,212992,425984,16,1,20,0,50000,0,43391,6609,0,0,6609,0,153,414,0.01,19.15,20.12,416.6,1.67
1,uring,pool,stall,1,16,212992,425984,4096,1,20,0,50000,0,43353,6647,0,0,6647,0,3,414,0.01,19.47,21.69,416.2,1.73
1,uring,workers,stall,4,16,relay,16777216,256,1,20,0,50000,0,50000,0,0,0,0,0,12,650,0.01,19.04,20.51,480.0,2.98
1,uring,workers,stall,4,16,212992,425984,256,1,20,0,50000,0,47961,2039,0,0,2039,0,8,499,0.01,18.80,20.09,460.4,3.48
1,uring,flows,stall,1,1,relay,16777216,256,1,20,0,50000,0,50000,0,0,0,0,0,3,2538,0.01,19.21,21.48,480.0,1.58
1,uring,flows,stall,1,256,relay,16777216,256,1,20,0,50000,0,50000,0,0,0,0,0,3,2664,0.01,19.43,22.33,480.0,1.59
1,uring,gso,stall,1,16,212992,425984,256,16,20,0,50000,0,44688,332,0,4980,332,0,1,413,0.04,19.01,20.33,429.0,0.39
1,uring,contend,contend,1,16,212992,425984,256,1,0,0,50000,0,49522,478,0,0,478,0,3,414,0.61,1.97,14.31,475.4,0.58
1,uring,contend,contend,1,16,relay,16777216,256,1,0,0,50000,0,50000,0,0,0,0,0,3,1503,0.61,4.18,12.69,480.0,0.63
1,uring,overload,overload,1,16,212992,425984,256,1,0,25,50000,0,39088,10912,0,0,10912,0,3,414,3.98,4.47,5.34,375.2,25.63
1,uring,overload,overload,1,16,1048576,2097152,256,1,0,25,50000,0,39730,10270,0,0,10270,0,3,2047,18.45,19.47,19.84,381.4,25.60
1,uring,overload,overload,1,16,relay,16777216,256,1,0,25,50000,0,44518,5482,0,0,5482,0,3,16382,127.97,150.37,150.94,427.4,25.64
1,uring,path,path,1,16,212992,425984,256,1,0,0,50000,0,48040,0,1960,0,0,0,0,20,119.09,200.94,201.16,461.2,2.56
1,uring,path,path,1,16,relay,16777216,256,1,0,0,50000,0,48028,0,1972,0,0,0,3,391,119.41,201.00,201.10,461.1,2.48
2,tokio,default,stall,1,16,relay,16777216,256,1,20,0,50000,0,50000,0,0,0,0,0,0,2304,0.01,19.11,20.12,480.0,1.71
2,tokio,queue,stall,1,16,212992,425984,256,1,20,0,50000,0,43436,6564,0,0,6564,0,0,414,0.01,19.14,20.13,417.0,1.83
2,tokio,queue,stall,1,16,1048576,2097152,256,1,20,0,50000,0,49192,808,0,0,808,0,0,2047,0.01,19.08,20.12,472.2,2.16
2,tokio,queue,stall,1,16,4194304,8388608,256,1,20,0,50000,0,50000,0,0,0,0,0,0,2308,0.01,19.09,20.13,480.0,1.70
2,tokio,stall,stall,1,16,relay,16777216,256,1,2,0,50000,0,50000,0,0,0,0,0,0,342,0.01,1.41,3.02,480.0,1.90
2,tokio,stall,stall,1,16,relay,16777216,256,1,100,0,50000,0,50000,0,0,0,0,0,0,11322,2.83,98.19,100.12,480.0,1.31
2,tokio,workers,stall,4,16,relay,16777216,256,1,20,0,50000,0,50000,0,0,0,0,0,0,571,0.01,18.76,20.09,480.0,4.25
2,tokio,workers,stall,4,16,212992,425984,256,1,20,0,50000,0,47950,2050,0,0,2050,0,0,420,0.01,18.79,20.09,460.3,4.59
2,tokio,flows,stall,1,1,relay,16777216,256,1,20,0,50000,0,50000,0,0,0,0,0,0,2342,0.02,19.12,20.85,480.0,1.65
2,tokio,flows,stall,1,256,relay,16777216,256,1,20,0,50000,0,50000,0,0,0,0,0,0,2304,0.01,19.12,20.13,480.0,1.67
2,tokio,gso,stall,1,16,212992,425984,256,16,20,0,50000,0,44720,330,0,4950,330,0,0,413,0.04,18.97,19.89,429.3,0.54
2,tokio,contend,contend,1,16,212992,425984,256,1,0,0,50000,0,49824,176,0,0,176,0,0,414,0.61,0.99,2.98,478.3,0.68
2,tokio,contend,contend,1,16,relay,16777216,256,1,0,0,50000,0,50000,0,0,0,0,0,0,675,0.60,0.98,5.81,480.0,0.52
2,tokio,overload,overload,1,16,212992,425984,256,1,0,25,50000,0,39340,10660,0,0,10660,0,0,414,3.95,4.40,4.61,377.7,25.48
2,tokio,overload,overload,1,16,1048576,2097152,256,1,0,25,50000,0,39848,10152,0,0,10152,0,0,2047,18.36,19.36,20.20,382.5,25.51
2,tokio,overload,overload,1,16,relay,16777216,256,1,0,25,50000,0,44609,5391,0,0,5391,0,0,16382,125.77,150.32,151.03,428.2,25.60
2,tokio,path,path,1,16,212992,425984,256,1,0,0,50000,0,48044,0,1956,0,0,0,0,76,119.08,200.99,201.12,461.2,3.07
2,tokio,path,path,1,16,relay,16777216,256,1,0,0,50000,0,48045,0,1955,0,0,0,0,24,119.01,200.96,202.06,461.2,3.60
2,uring,default,stall,1,16,relay,16777216,256,1,20,0,50000,0,50000,0,0,0,0,0,3,2558,0.01,19.43,22.02,480.0,1.55
2,uring,queue,stall,1,16,212992,425984,256,1,20,0,50000,0,43344,6656,0,0,6656,0,3,414,0.01,19.48,22.10,416.1,1.70
2,uring,queue,stall,1,16,1048576,2097152,256,1,20,0,50000,0,49043,957,0,0,957,0,3,2047,0.01,19.43,21.68,470.8,1.53
2,uring,queue,stall,1,16,4194304,8388608,256,1,20,0,50000,0,50000,0,0,0,0,0,3,2515,0.02,19.42,21.61,480.0,1.51
2,uring,stall,stall,1,16,relay,16777216,256,1,2,0,50000,0,50000,0,0,0,0,0,3,506,0.01,1.58,3.67,480.0,2.17
2,uring,stall,stall,1,16,relay,16777216,256,1,100,0,50000,0,50000,0,0,0,0,0,3,11628,3.71,98.81,101.76,480.0,1.24
2,uring,pool,stall,1,16,relay,16777216,16,1,20,0,50000,0,50000,0,0,0,0,0,510,2306,0.01,19.11,20.12,480.0,1.58
2,uring,pool,stall,1,16,212992,425984,16,1,20,0,50000,0,43303,6697,0,0,6697,0,236,414,0.01,19.17,20.87,415.7,1.90
2,uring,pool,stall,1,16,212992,425984,4096,1,20,0,50000,0,43370,6630,0,0,6630,0,3,414,0.01,19.48,21.52,416.4,1.69
2,uring,workers,stall,4,16,relay,16777216,256,1,20,0,50000,0,50000,0,0,0,0,0,12,643,0.01,19.05,20.49,480.0,3.44
2,uring,workers,stall,4,16,212992,425984,256,1,20,0,50000,0,47936,2064,0,0,2064,0,12,418,0.01,19.05,20.47,460.2,3.79
2,uring,flows,stall,1,1,relay,16777216,256,1,20,0,50000,0,50000,0,0,0,0,0,3,2490,0.01,19.39,21.88,480.0,2.00
2,uring,flows,stall,1,256,relay,16777216,256,1,20,0,50000,0,50000,0,0,0,0,0,3,2569,0.01,19.44,21.96,480.0,1.69
2,uring,gso,stall,1,16,212992,425984,256,16,20,0,50000,0,44704,331,0,4965,331,0,1,413,0.04,19.01,20.06,429.2,0.43
2,uring,contend,contend,1,16,212992,425984,256,1,0,0,50000,0,49534,466,0,0,466,0,3,414,0.44,1.70,14.13,475.5,0.85
2,uring,contend,contend,1,16,relay,16777216,256,1,0,0,50000,0,50000,0,0,0,0,0,3,1865,0.61,6.79,16.39,480.0,0.66
2,uring,overload,overload,1,16,212992,425984,256,1,0,25,50000,0,38942,11058,0,0,11058,0,3,414,4.00,4.46,4.75,373.8,25.72
2,uring,overload,overload,1,16,1048576,2097152,256,1,0,25,50000,0,39503,10497,0,0,10497,0,3,2047,18.58,19.59,19.88,379.2,25.75
2,uring,overload,overload,1,16,relay,16777216,256,1,0,25,50000,0,44620,5380,0,0,5380,0,3,16382,130.92,151.17,151.88,428.4,25.74
2,uring,path,path,1,16,212992,425984,256,1,0,0,50000,0,48041,0,1959,0,0,0,0,20,119.10,201.01,201.18,461.2,2.84
2,uring,path,path,1,16,relay,16777216,256,1,0,0,50000,0,48045,0,1955,0,0,0,0,22,119.19,201.00,201.19,461.2,2.57
just bench-shard "0 1 4" "16 64 256"
Shard sweep (0 shards is the shared runtime on 12 threads)
workload connections  shards  recv-Mbps   recv-fps   p99-ms  loss-%      CPU  CPU/conn   RSS-MiB sock-drops gen-drops
video             16       0      9.907     1032.0   3969.0   0.000    0.136   0.00848      31.0          0         0
video             16       1      9.677     1008.0   3969.0   0.000    0.052   0.00324      29.2          0         0
video             16       4      9.905     1031.8   3969.0   0.000    0.080   0.00498      30.8          0         0
video             64       0     39.170     4080.2   3969.0   0.000    0.410   0.00641      65.1          0         0
video             64       1     37.760     3933.3   3969.0   0.000    0.457   0.00713      61.6          0         0
video             64       4     37.786     3936.0   3970.0   0.000    1.620   0.02531      66.2          0         0
video            256       0    154.620    16106.2   3970.0   0.000    3.255   0.01271     251.4          0         0
video            256       1    157.062    16360.6   3972.0   0.000    0.790   0.00309     246.9          0         0
video            256       4    150.033    15628.4   3976.0   0.000    2.382   0.00930     254.4          0         0
fanout            16       0      0.480      150.0   1642.0   0.000    0.217   0.01358      25.3          0         0
fanout            16       1      0.480      150.0   1631.0   0.000    0.037   0.00229      24.2          0         0
fanout            16       4      0.480      150.0   1641.0   0.000    0.087   0.00542      24.9          0         0
fanout            64       0      2.016      630.0   1692.0   0.118    1.051   0.01642      37.5          0         0
fanout            64       1      2.016      630.0   1690.0   0.000    0.147   0.00230      36.0          0         0
fanout            64       4      2.016      630.0   1672.0   0.000    0.380   0.00594      36.8          0         0
fanout           256       0      8.160     2550.0   1682.0   0.052    1.297   0.00507      85.2          0         0
fanout           256       1      8.160     2550.0   1695.0   0.000    0.173   0.00068      82.7          0         0
fanout           256       4      8.160     2550.0   1672.0   0.000    1.624   0.00635      84.6          0         0

(Written by Claude Opus 5.5)

@kixelated kixelated changed the title Attribute UDP queue loss before tuning buffers perf(sock): attribute UDP queue loss and keep the 8 MiB socket buffers Nov 1, 2026
@kixelated
kixelated marked this pull request as ready for review November 1, 2026 09:55
@coderabbitai

coderabbitai Bot commented Nov 1, 2026 •

Copy link
Copy Markdown
Contributor

Warning

Review limit reached

You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository.

Next included review available in 26 minutes.

Check out review usage here.

View limit details

Limit details: You’ve used all 4 included reviews currently available.

Learn how review limits work.

Review configuration:

Run configuration
  • Source mode: Auto
  • Repository: Unavailable
  • Branch: Unavailable
  • File: No configuration file from this repository applied
  • Commit: Unavailable
  • Layers: Organization UI
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: 5cec3ac6-4544-4171-afe3-c2aaf16de2c8
Commits

Reviewing files that changed from the base of the PR and between 945aec5 and 9f5f356.

Files ignored due to path filters: 1
  • Cargo.lock is excluded by !**/*.lock
Files selected for processing: 17
  • bench/README.md
  • bench/run.sh
  • bench/summary.py
  • bench/summary.test.py
  • quest/m2/perf/shard-default.md
  • quest/m2/performance-survey/README.md
  • quest/m2/performance-survey/socket-queues.md
  • rs/moq-bench/Cargo.toml
  • rs/moq-bench/README.md
  • rs/moq-bench/src/host.rs
  • rs/moq-bench/src/host/udp.rs
  • rs/moq-sock/src/bind.rs
  • rs/moq-uring/Cargo.toml
  • rs/moq-uring/README.md
  • rs/moq-uring/tests/integration/main.rs
  • rs/moq-uring/tests/integration/socket_queues.rs
  • sh/gh/nightly.sh
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

Share

CodeRabbit Verify

  • Run CodeRabbit Verify to test the changes in this pull request.

@kixelated kixelated left a comment

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Automated review by review (OpenAI)

Reviewed commit: e1d3b60435bc443d190e02ebbfb896138caa53a6.

P2: Preserve CPU/RSS sampling when UDP inode enumeration is denied (rs/moq-bench/src/host.rs:249). A non-root sampler can read a service's stat/task/status files while its other-UID /proc/<pid>/fd directory is inaccessible. The new udp::inodes(&target.proc)? then fails the whole sample; retain_mut reports the still-running process as exited and terminates when it was the only target. Treat unavailable per-target UDP enumeration like the already-optional sock_diag dump: report its absence and retain ordinary samples. Cover an accessible target whose fd enumeration is denied.

Overall direction: keeping production buffer settings unchanged and adding private loss attribution is appropriately scoped; no public API or wire change is needed. The optional instrumentation should not narrow the existing sampler's usable targets.

Verification: static GitHub review, including an independent sampler check; no builds, tests, or benchmark measurements run. No earlier published review findings to carry forward.

(Written by OpenAI)

@pullfrog pullfrog Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ℹ️ No critical issues — two small robustness notes inline.

Reviewed changes — the measured no-win that keeps the relay's 8 MiB UDP buffer request and adds only benchmark/sampler instrumentation, docs, and quest cleanup.

  • rs/moq-bench/src/host/udp.rs (new): a sock_diag netlink dump matched against /proc/<pid>/fd inodes, emitting flattened udp_* sampler fields; Drops keeps a cumulative per-inode total across a 32-bit wrap and a closed socket.
  • rs/moq-bench/src/host.rs: one dump per sampler round, passed to each target's sample; a refused dump drops only the UDP fields, once and loudly.
  • bench/summary.py / bench/run.sh: new udp() diffs the bracket samples so a drop is never split, and the shard table prints sock-drops/gen-drops.
  • rs/moq-uring/tests/integration/socket_queues.rs (new, ignored/nightly): accounts for every datagram across the kernel queue, pool depth, workers, flows, GSO and four load patterns on both receive paths.
  • Docs/quest: moq-uring, moq-bench and bench READMEs; the survey, shard-default and uring-pool-memory quests record the verdict and delete socket-queues.md.

No production behavior, wire, API, or config change: the bind.rs hunk is a doc comment only.

Pullfrog  | Fix all ➔ | Fix 👍s ➔ | View workflow run | Using deepseek-v4.1-flash (free via Pullfrog for OSS) | 𝕏

Comment thread rs/moq-bench/src/host/udp.rs Resolved
Comment thread rs/moq-bench/src/host/udp.rs Resolved
kixelated and others added 2 commits November 1, 2026 09:33
An unreadable /proc/<pid>/fd (another user's process) now drops only the
UDP fields for that target instead of reporting it as exited. A short
NLMSG_ERROR in the sock_diag dump is rejected instead of indexing past
the datagram.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@kixelated

Copy link
Copy Markdown
Collaborator Author

On the OpenAI review P2, an unreadable fd table failing the whole sample: fixed in 45ee9c10bc. udp::inodes keeps PermissionDenied distinct from other errors. udp_sample then drops only that target's UDP fields, warns once, and stops retrying it, and any other fd error still counts as the target exiting. denied_fd_table_drops_only_udp covers it. I also ran it by hand against pid 1 as a normal user: it keeps sampling CPU and RSS without the udp_* fields, and bench/summary.py already leaves out UDP for a target whose rows lack them.

(Written by Claude Opus 5.5)

@kixelated kixelated left a comment

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Automated review by review (OpenAI)

Reviewed commit: 45ee9c10bc004ccfde0c7bcbeb0311f69d4c05fc (incremental review since e1d3b60435bc443d190e02ebbfb896138caa53a6, accounting for the main-branch merge).

Fixed: the previous P2. udp::inodes preserves permission denial, and udp_sample now disables only the target's UDP accounting while CPU/RSS sampling continues; the new regression covers the subsequent sample. The independently reported short netlink error is also bounded by the message length and covered by a regression.

No new actionable bugs found in the update. The focused fallback and parser fix are appropriate, without expanding production API/configuration; the summary merge resolution preserves the existing UDP calculations.

Verification: static review of the changed code, surrounding sampling/parser paths, tests, and merge resolution on GitHub. No builds, tests, or benchmark measurements run.

@pullfrog pullfrog Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ No new issues found.

Reviewed changes: the incremental delta since the prior pullfrog review (e1d3b60435), covering the fd-denied fix, the bounded NLMSG_ERROR read, and the merge of origin/main.

  • Kept sampling targets whose fd table is denied: /proc/<pid>/fd returning PermissionDenied now drops only that target's UDP fields, once and loudly, instead of failing the whole sample and reporting the process as exited; any other fd error still means it exited.
  • Bounded the NLMSG_ERROR code read: the code is read through data[..len].get(16..20), so a malformed short error at the end of a datagram returns InvalidData rather than indexing past the slice.
  • Documented exact inode keying in Drops and merged origin/main (ruff reformat of bench/summary.py and bench/summary.test.py).

Both prior pullfrog threads are addressed (the panic is fixed; inode reuse is declined with the get_next_ino() argument), and the OpenAI P2 finding is resolved. python3 bench/summary.test.py and cargo test -p moq-bench (including denied_fd_table_drops_only_udp and short_error_is_rejected) pass.

Pullfrog  | View workflow run | Using deepseek-v4.1-flash (free via Pullfrog for OSS) | 𝕏

@kixelated
kixelated enabled auto-merge (squash) November 1, 2026 18:12
@kixelated
kixelated disabled auto-merge November 3, 2026 06:20
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

@kixelated kixelated left a comment

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Automated review by review (OpenAI)

Reviewed commit: 9f5f356

No new actionable issue found. Accounting for main's removed shard sweep and completed pool quest, the socket-queue benchmark remains nightly and the shard sweep is documented as local-only. The earlier permission-denied and short-netlink fixes remain in place. The PR's opening summary still says both are nightly; its later Nightly section correctly distinguishes them.

Static GitHub review only; I did not run tests or reproduce measurements.

@kixelated
kixelated added this pull request to the merge queue Nov 3, 2026

@pullfrog pullfrog Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ No new issues found.

Reviewed changes — the incremental delta since the prior pullfrog review (45ee9c10): a merge of origin/main that resolves conflicts and folds in main's newer content. No change to this PR's own code, benchmark, or sampler.

  • Merged origin/main with conflict resolution: sh/gh/nightly.sh keeps both this PR's benchmark_socket_queues line and main's benchmark_datagram_delivery (main's moq-archive line intact); bench/README.md keeps main's local-only wording alongside the new sock-drops/gen-drops description; the survey README.md records the no-win verdict and drops the deleted socket-queues.md link.
  • Deleted quests stay deleted: quest/m2/perf/uring-pool-memory.md (finished on main by #7233) and quest/m2/performance-survey/socket-queues.md (finished by this PR); no remaining references to either.

Both prior pullfrog threads are resolved and the OpenAI P2 finding is fixed on the reviewed head.

Pullfrog  | View workflow run | Using deepseek-v4.1-flash (free via Pullfrog for OSS) | 𝕏

Merged via the queue into main with commit e38d2e6 Nov 3, 2026
9 of 10 checks passed
@kixelated
kixelated deleted the quest/m2/performance-survey/socket-queues branch November 3, 2026 07:29
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant