From d717c7b46c25f80888693b0163a09466f4669dc1 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Wed, 1 Apr 2026 08:54:30 -1000 Subject: [PATCH] [api] Use large socket buffers and remove mid-loop draining Increase socket buffer to 16MB so benchmarks never hit WOULD_BLOCK during an inner loop iteration. Remove per-iteration drain_socket calls that were adding noise and causing the immediate path to fall back to batching. Drain only between outer iterations. --- tests/benchmarks/components/api/bench_helpers.h | 5 +++-- .../components/api/bench_plaintext_frame.cpp | 6 ------ .../components/api/bench_send_sensor_state.cpp | 10 ---------- 3 files changed, 3 insertions(+), 18 deletions(-) diff --git a/tests/benchmarks/components/api/bench_helpers.h b/tests/benchmarks/components/api/bench_helpers.h index 53987f0eab..c25fe57177 100644 --- a/tests/benchmarks/components/api/bench_helpers.h +++ b/tests/benchmarks/components/api/bench_helpers.h @@ -55,8 +55,9 @@ inline std::pair, int> create_tcp_loopback() { flags = ::fcntl(read_fd, F_GETFL, 0); ::fcntl(read_fd, F_SETFL, flags | O_NONBLOCK); - // Increase socket buffer sizes to reduce drain frequency - int bufsize = 1024 * 1024; + // Use large socket buffers so benchmarks never hit WOULD_BLOCK + // during a single outer iteration (2000 × ~15 byte messages = ~30KB). + int bufsize = 16 * 1024 * 1024; ::setsockopt(write_fd, SOL_SOCKET, SO_SNDBUF, &bufsize, sizeof(bufsize)); ::setsockopt(read_fd, SOL_SOCKET, SO_RCVBUF, &bufsize, sizeof(bufsize)); diff --git a/tests/benchmarks/components/api/bench_plaintext_frame.cpp b/tests/benchmarks/components/api/bench_plaintext_frame.cpp index 6347cf0a43..0caa50c748 100644 --- a/tests/benchmarks/components/api/bench_plaintext_frame.cpp +++ b/tests/benchmarks/components/api/bench_plaintext_frame.cpp @@ -49,9 +49,6 @@ static void PlaintextFrame_WriteSensorState(benchmark::State &state) { msg.encode(writer); helper->write_protobuf_packet(SensorStateResponse::MESSAGE_TYPE, writer); - - if ((i & 0xFF) == 0) - drain_socket(read_fd); } drain_socket(read_fd); benchmark::DoNotOptimize(helper.get()); @@ -96,9 +93,6 @@ static void PlaintextFrame_WriteBatch5(benchmark::State &state) { } helper->write_protobuf_messages(ProtoWriteBuffer(&buffer, 0), std::span(messages, 5)); - - if ((i & 0xFF) == 0) - drain_socket(read_fd); } drain_socket(read_fd); benchmark::DoNotOptimize(helper.get()); diff --git a/tests/benchmarks/components/api/bench_send_sensor_state.cpp b/tests/benchmarks/components/api/bench_send_sensor_state.cpp index e0d6336e38..815d612049 100644 --- a/tests/benchmarks/components/api/bench_send_sensor_state.cpp +++ b/tests/benchmarks/components/api/bench_send_sensor_state.cpp @@ -54,9 +54,6 @@ static void SendSensorState_Immediate(benchmark::State &state) { for (auto _ : state) { for (int i = 0; i < kInnerIterations; i++) { conn->send_sensor_state(&sensor); - - if ((i & 0xFF) == 0) - drain_socket(read_fd); } drain_socket(read_fd); benchmark::DoNotOptimize(conn.get()); @@ -137,12 +134,8 @@ static void ProcessBatch_SingleSensor(benchmark::State &state) { for (auto _ : state) { for (int i = 0; i < kInnerIterations; i++) { - // Queue the sensor state, then process the batch conn->send_sensor_state(&sensor); bench_process_batch(conn.get()); - - if ((i & 0xFF) == 0) - drain_socket(read_fd); } drain_socket(read_fd); benchmark::DoNotOptimize(conn.get()); @@ -179,9 +172,6 @@ static void ProcessBatch_5Sensors(benchmark::State &state) { for (auto &s : sensors) conn->send_sensor_state(&s); bench_process_batch(conn.get()); - - if ((i & 0xFF) == 0) - drain_socket(read_fd); } drain_socket(read_fd); benchmark::DoNotOptimize(conn.get());