X-Git-Url: https://git.proxmox.com/?p=proxmox-backup.git;a=blobdiff_plain;f=pbs-tools%2Fsrc%2Flib.rs;h=939ba7e6b16bba0eb6ea03f31b2bae3e0ebdf4a4;hp=8ac322dd78a6c353181c483aa41eb66574c97742;hb=d91a0f9fc90aecabc4f359d968f716a14562ce78;hpb=890b88cbef006ddec08ddc74c8fad0ac7cccf5e7 diff --git a/pbs-tools/src/lib.rs b/pbs-tools/src/lib.rs index 8ac322dd..939ba7e6 100644 --- a/pbs-tools/src/lib.rs +++ b/pbs-tools/src/lib.rs @@ -1,34 +1,29 @@ -pub mod acl; -pub mod blocking; -pub mod borrow; -pub mod broadcast_future; pub mod cert; -pub mod cli; -pub mod compression; -pub mod crypt; pub mod crypt_config; pub mod format; -pub mod fd; -pub mod fs; -pub mod io; pub mod json; -pub mod logrotate; pub mod lru_cache; pub mod nom; -pub mod percent_encoding; -pub mod process_locker; pub mod sha; -pub mod str; -pub mod stream; -pub mod sync; -pub mod sys; -pub mod task; pub mod ticket; -pub mod tokio; -pub mod xattr; -pub mod zip; pub mod async_lru_cache; -mod command; -pub use command::{command_output, command_output_as_string, run_command}; +/// Set MMAP_THRESHOLD to a fixed value (128 KiB) +/// +/// This avoids the "dynamic" mmap-treshold logic from glibc's malloc, which seems misguided and +/// effectively avoids using mmap for all allocations smaller than 32 MiB. Which, in combination +/// with the allocation pattern from our/tokio's complex async machinery, resulted in very large +/// RSS sizes due to defragmentation and long-living (smaller) allocation on top of the heap +/// avoiding that the (big) now free'd allocations below couldn't get given back to the OS. This is +/// not an issue with mmap'd memeory chunks, those can be given back at any time. +/// +/// Lowering effective MMAP treshold to 128 KiB allows freeing up memory to the OS better and with +/// lower latency, which reduces the peak *and* average RSS size by an order of magnitude when +/// running backup jobs. We measured a reduction by a factor of 10-20 in experiments and see much +/// less erratic behavior in the overall's runtime RSS size. +pub fn setup_libc_malloc_opts() { + unsafe { + libc::mallopt(libc::M_MMAP_THRESHOLD, 4096*32); + } +}