diff --git a/backend/windmill-common/src/worker.rs b/backend/windmill-common/src/worker.rs index 81c3537c8aa84..f1c51bd870ad4 100644 --- a/backend/windmill-common/src/worker.rs +++ b/backend/windmill-common/src/worker.rs @@ -512,16 +512,43 @@ pub fn get_vcpus() -> Option { } } +fn get_memory_from_meminfo() -> Option { + let memory_info = parse_file::("/proc/meminfo")?; + if memory_info.contains("MemTotal") { + let memory_total = memory_info + .split("MemTotal:") + .nth(1)? + .split("kB") + .next()? + .trim() + .parse::() + .ok()?; + return Some(memory_total * 1024); + } + None +} + pub fn get_memory() -> Option { - if Path::new("/sys/fs/cgroup/memory/memory.limit_in_bytes").exists() { - // cgroup v1 - parse_file("/sys/fs/cgroup/memory/memory.limit_in_bytes") - } else { - // cgroup v2 - let cgroup_path = get_cgroupv2_path()?; - let memory_max_path = format!("{cgroup_path}/memory.max"); + let memory_limit: Option = + if Path::new("/sys/fs/cgroup/memory/memory.limit_in_bytes").exists() { + // cgroup v1 + parse_file("/sys/fs/cgroup/memory/memory.limit_in_bytes") + } else { + // cgroup v2 + let cgroup_path = get_cgroupv2_path()?; + let memory_max_path = format!("{cgroup_path}/memory.max"); + + parse_file(&memory_max_path) + }; - parse_file(&memory_max_path) + // if memory_max is super high, read machine total memory (meminfo) + if memory_limit + .as_ref() + .is_some_and(|x| x > &(1024 * 1024 * 1024 * 1024 * 1024)) + { + get_memory_from_meminfo() + } else { + memory_limit } }