diff --git a/Cargo.lock b/Cargo.lock index 505263c6458..2bd8897f05c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1170,6 +1170,7 @@ dependencies = [ "once_cell", "perf-event", "tikv-jemalloc-ctl", + "winapi", ] [[package]] diff --git a/crates/profile/Cargo.toml b/crates/profile/Cargo.toml index 1a8c8f862c2..653d3d98399 100644 --- a/crates/profile/Cargo.toml +++ b/crates/profile/Cargo.toml @@ -20,6 +20,9 @@ jemalloc-ctl = { version = "0.4.1", package = "tikv-jemalloc-ctl", optional = tr [target.'cfg(target_os = "linux")'.dependencies] perf-event = "0.4" +[target.'cfg(windows)'.dependencies] +winapi = { version = "0.3.8", features = ["psapi"] } + [features] cpu_profiler = [] jemalloc = ["jemalloc-ctl"] diff --git a/crates/profile/src/memory_usage.rs b/crates/profile/src/memory_usage.rs index 2917ded60f4..6ef58c9c14e 100644 --- a/crates/profile/src/memory_usage.rs +++ b/crates/profile/src/memory_usage.rs @@ -35,6 +35,22 @@ pub fn now() -> MemoryUsage { // Note: This is incredibly slow. let alloc = unsafe { libc::mallinfo() }.uordblks as isize; MemoryUsage { allocated: Bytes(alloc) } + } else if #[cfg(windows)] { + // There doesn't seem to be an API for determining heap usage, so we try to + // approximate that by using the Commit Charge value. + + use winapi::um::processthreadsapi::*; + use winapi::um::psapi::*; + use std::mem::{MaybeUninit, size_of}; + + let proc = unsafe { GetCurrentProcess() }; + let mut mem_counters = MaybeUninit::uninit(); + let cb = size_of::(); + let ret = unsafe { GetProcessMemoryInfo(proc, mem_counters.as_mut_ptr(), cb as u32) }; + assert!(ret != 0); + + let usage = unsafe { mem_counters.assume_init().PagefileUsage }; + MemoryUsage { allocated: Bytes(usage as isize) } } else { MemoryUsage { allocated: Bytes(0) } }