5479: Allow gathering memory stats on non-jemalloc Linux r=matklad a=jonas-schievink

I could also parse `/proc/$PID/statm` to get the resident set size, but decided against that for now as it isn't terribly useful.

Note that `mallinfo()` is incredibly slow for some reason, and unfortunately this will be exposed to users via the "Memory Usage" command (even worse, the opened document will show the outdated values while the server is processing). So, not very ideal, but it keeps me from recompiling r-a with different feature sets all the time.

Co-authored-by: Jonas Schievink <jonas.schievink@ferrous-systems.com>
This commit is contained in:
bors[bot] 2020-07-22 11:00:17 +00:00 committed by GitHub
commit 2e73ba1b49
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 19 additions and 10 deletions

2
Cargo.lock generated
View file

@ -1198,8 +1198,10 @@ name = "ra_prof"
version = "0.1.0"
dependencies = [
"backtrace",
"cfg-if",
"jemalloc-ctl",
"jemallocator",
"libc",
"mimalloc",
"once_cell",
"ra_arena",

View file

@ -14,6 +14,8 @@ ra_arena = { path = "../ra_arena" }
once_cell = "1.3.1"
backtrace = { version = "0.3.44", optional = true }
mimalloc = { version = "0.1.19", default-features = false, optional = true }
cfg-if = "0.1.10"
libc = "0.2.73"
[target.'cfg(not(target_env = "msvc"))'.dependencies]
jemallocator = { version = "0.3.2", optional = true }

View file

@ -1,5 +1,6 @@
//! FIXME: write short doc here
use cfg_if::cfg_if;
use std::fmt;
pub struct MemoryUsage {
@ -8,19 +9,23 @@ pub struct MemoryUsage {
}
impl MemoryUsage {
#[cfg(all(feature = "jemalloc", not(target_env = "msvc")))]
pub fn current() -> MemoryUsage {
jemalloc_ctl::epoch::advance().unwrap();
MemoryUsage {
allocated: Bytes(jemalloc_ctl::stats::allocated::read().unwrap()),
resident: Bytes(jemalloc_ctl::stats::resident::read().unwrap()),
cfg_if! {
if #[cfg(all(feature = "jemalloc", not(target_env = "msvc")))] {
jemalloc_ctl::epoch::advance().unwrap();
MemoryUsage {
allocated: Bytes(jemalloc_ctl::stats::allocated::read().unwrap()),
resident: Bytes(jemalloc_ctl::stats::resident::read().unwrap()),
}
} else if #[cfg(target_os = "linux")] {
// Note: This is incredibly slow.
let alloc = unsafe { libc::mallinfo() }.uordblks as u32 as usize;
MemoryUsage { allocated: Bytes(alloc), resident: Bytes(0) }
} else {
MemoryUsage { allocated: Bytes(0), resident: Bytes(0) }
}
}
}
#[cfg(any(not(feature = "jemalloc"), target_env = "msvc"))]
pub fn current() -> MemoryUsage {
MemoryUsage { allocated: Bytes(0), resident: Bytes(0) }
}
}
impl fmt::Display for MemoryUsage {