summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobby Zambito <contact@robbyzambito.me>2026-01-10 16:54:25 -0500
committerRobby Zambito <contact@robbyzambito.me>2026-01-10 20:14:42 -0500
commit8a2bcebd60cfad977ad8ff419a9878915d77df7b (patch)
tree3690c80a05d2f0b2a656f6d0a5b1a01641983407
parenta93a1f090610bed80260806475015210ec31239d (diff)
Cache align hot buffers
-rw-r--r--src/Server.zig18
1 files changed, 11 insertions, 7 deletions
diff --git a/src/Server.zig b/src/Server.zig
index ad07564..cc16408 100644
--- a/src/Server.zig
+++ b/src/Server.zig
@@ -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 };
}