Cache align hot buffers

This commit is contained in:
2026-01-10 16:54:25 -05:00
parent a93a1f0906
commit 8a2bcebd60

View File

@@ -164,19 +164,19 @@ fn handleConnection(
server_allocator; server_allocator;
// Set up client writer // Set up client writer
const w_buffer: []u8 = try alloc.alloc(u8, w_buf_size); const w_buffer: []u8 = try alloc.alignedAlloc(u8, .@"64", w_buf_size);
defer alloc.free(w_buffer); defer alloc.free(w_buffer);
var writer = stream.writer(io, w_buffer); var writer = stream.writer(io, w_buffer);
const out = &writer.interface; const out = &writer.interface;
// Set up client reader // Set up client reader
const r_buffer: []u8 = try alloc.alloc(u8, r_buf_size); const r_buffer: []u8 = try alloc.alignedAlloc(u8, .@"64", r_buf_size);
defer alloc.free(r_buffer); defer alloc.free(r_buffer);
var reader = stream.reader(io, r_buffer); var reader = stream.reader(io, r_buffer);
const in = &reader.interface; const in = &reader.interface;
// Set up buffer queue // Set up buffer queue
const qbuf: []u8 = try alloc.alloc(u8, r_buf_size); const qbuf: []u8 = try alloc.alignedAlloc(u8, .@"64", 256 * 1024 * 1024);
defer alloc.free(qbuf); defer alloc.free(qbuf);
var recv_queue: Queue(u8) = .init(qbuf); var recv_queue: Queue(u8) = .init(qbuf);
defer recv_queue.close(io); defer recv_queue.close(io);
@@ -443,14 +443,18 @@ fn unsubscribe(
} }
} }
// TODO: The probed system value is too low.
// Setting the value higher leads to higher throughput.
// Find a more appropriate value.
// It should be the probed value at a minimum.
/// Probes the system for an appropriate buffer size. /// Probes the system for an appropriate buffer size.
/// Try to match the kernel socket buffers to maximize /// Try to match the kernel socket buffers to maximize
/// the amount of data we push through each syscall. /// the amount of data we push through each syscall.
fn getBufferSizes(io: Io) @Tuple(&.{ usize, usize }) { fn getBufferSizes(io: Io) @Tuple(&.{ usize, usize }) {
const default_size = 128 * 1024 * 1024; const default_size = 4 * 1024;
const default = .{ default_size, default_size }; const default = .{ default_size, default_size };
if (true) return default; // if (true) return default;
const dir = Dir.openDirAbsolute(io, "/proc/sys/net/core", .{}) catch { const dir = Dir.openDirAbsolute(io, "/proc/sys/net/core", .{}) catch {
log.warn("couldn't open /proc/sys/net/core", .{}); log.warn("couldn't open /proc/sys/net/core", .{});
@@ -459,8 +463,8 @@ fn getBufferSizes(io: Io) @Tuple(&.{ usize, usize }) {
var buf: [64]u8 = undefined; var buf: [64]u8 = undefined;
const rmem_max = readBufferSize(io, dir, "rmem_max", &buf, default_size); const rmem_max = readBufferSize(io, dir, "rmem_max", &buf, default_size) * 2;
const wmem_max = readBufferSize(io, dir, "wmem_max", &buf, default_size); const wmem_max = readBufferSize(io, dir, "wmem_max", &buf, default_size) * 2;
return .{ rmem_max, wmem_max }; return .{ rmem_max, wmem_max };
} }