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;
// 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);
var writer = stream.writer(io, w_buffer);
const out = &writer.interface;
// 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);
var reader = stream.reader(io, r_buffer);
const in = &reader.interface;
// 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);
var recv_queue: Queue(u8) = .init(qbuf);
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.
/// Try to match the kernel socket buffers to maximize
/// the amount of data we push through each syscall.
fn getBufferSizes(io: Io) @Tuple(&.{ usize, usize }) {
const default_size = 128 * 1024 * 1024;
const default_size = 4 * 1024;
const default = .{ default_size, default_size };
if (true) return default;
// if (true) return default;
const dir = Dir.openDirAbsolute(io, "/proc/sys/net/core", .{}) catch {
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;
const rmem_max = readBufferSize(io, dir, "rmem_max", &buf, default_size);
const wmem_max = readBufferSize(io, dir, "wmem_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) * 2;
return .{ rmem_max, wmem_max };
}