From d46b37f6a8639e25ff54ea1e264cc7cebdd03be9 Mon Sep 17 00:00:00 2001 From: Ben Noordhuis Date: Tue, 13 Apr 2021 16:24:45 +0200 Subject: feat(cli): raise file descriptor limit on startup (#10162) Raise the soft limit to the hard limit when possible. This is similar to what Node.js does to avoid running into "out of file descriptors" errors too quickly. On most Linux systems, raises the limit from 1,024 to 1,048,576. On most macOS systems, raises the limit from 256 to 10,240. Fixes #10148. --- cli/unix_util.rs | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 cli/unix_util.rs (limited to 'cli/unix_util.rs') diff --git a/cli/unix_util.rs b/cli/unix_util.rs new file mode 100644 index 000000000..4aa8ef55d --- /dev/null +++ b/cli/unix_util.rs @@ -0,0 +1,41 @@ +/// Raise soft file descriptor limit to hard file descriptor limit. +/// This is the difference between `ulimit -n` and `ulimit -n -H`. +pub fn raise_fd_limit() { + #[cfg(unix)] + unsafe { + let mut limits = libc::rlimit { + rlim_cur: 0, + rlim_max: 0, + }; + + if 0 != libc::getrlimit(libc::RLIMIT_NOFILE, &mut limits) { + return; + } + + if limits.rlim_cur == libc::RLIM_INFINITY { + return; + } + + // No hard limit? Do a binary search for the effective soft limit. + if limits.rlim_max == libc::RLIM_INFINITY { + let mut min = limits.rlim_cur; + let mut max = 1 << 20; + + while min + 1 < max { + limits.rlim_cur = min + (max - min) / 2; + match libc::setrlimit(libc::RLIMIT_NOFILE, &limits) { + 0 => min = limits.rlim_cur, + _ => max = limits.rlim_cur, + } + } + + return; + } + + // Raise the soft limit to the hard limit. + if limits.rlim_cur < limits.rlim_max { + limits.rlim_cur = limits.rlim_max; + libc::setrlimit(libc::RLIMIT_NOFILE, &limits); + } + } +} -- cgit v1.2.3