server: a query that finds every permit taken waits for one instead of failing, the budget is 64, permit and upstream turns wait on a futex with one thread each, the thread pool has no task limit, and transparent huge pages are off for the process
This commit is contained in:
@@ -0,0 +1,36 @@
|
||||
//! Opting the process out of transparent huge pages.
|
||||
//!
|
||||
//! With THP set to `always`, the kernel backs any 2 MiB-aligned anonymous
|
||||
//! region with a huge page on first touch. Each worker thread's stack mapping
|
||||
//! qualifies, so a thread that touches a few KiB of stack can hold 2 MiB
|
||||
//! resident, and `std.Io.Threaded` never retires a worker: one burst on such a
|
||||
//! host left about 40 of 200 workers at 2 MiB each. nxdns's memory is sized
|
||||
//! for small pages, so the whole process opts out instead of chasing each
|
||||
//! mapping.
|
||||
|
||||
const std = @import("std");
|
||||
const linux = std.os.linux;
|
||||
|
||||
pub const DisableError = error{
|
||||
/// A kernel older than 3.15, which has no such switch.
|
||||
Unsupported,
|
||||
Unexpected,
|
||||
};
|
||||
|
||||
/// Sets `PR_SET_THP_DISABLE`, which covers every mapping of the process,
|
||||
/// existing and future, and is inherited across `fork`.
|
||||
pub fn disable() DisableError!void {
|
||||
const rc = linux.prctl(@intFromEnum(linux.PR.SET_THP_DISABLE), 1, 0, 0, 0);
|
||||
switch (linux.errno(rc)) {
|
||||
.SUCCESS => {},
|
||||
.INVAL => return error.Unsupported,
|
||||
else => return error.Unexpected,
|
||||
}
|
||||
}
|
||||
|
||||
test "disable takes effect for the process" {
|
||||
try disable();
|
||||
const rc = linux.prctl(@intFromEnum(linux.PR.GET_THP_DISABLE), 0, 0, 0, 0);
|
||||
try std.testing.expectEqual(linux.E.SUCCESS, linux.errno(rc));
|
||||
try std.testing.expectEqual(@as(usize, 1), rc);
|
||||
}
|
||||
Reference in New Issue
Block a user