diff --git a/src/server/dfly_main.cc b/src/server/dfly_main.cc index 9ec89c948..19f6318c9 100644 --- a/src/server/dfly_main.cc +++ b/src/server/dfly_main.cc @@ -462,20 +462,29 @@ bool UpdateResourceLimitsIfInsideContainer(io::MemInfoData* mdata, size_t* max_t /* Update memory limits */ // Start by reading global memory limits - constexpr auto base_mem = "/sys/fs/cgroup/memory"sv; - read_mem(StrCat(base_mem, "/memory.limit_in_bytes"), &mdata->mem_total); - read_mem(StrCat(base_mem, "/memory.max"), &mdata->mem_total); + auto parse_limits = [&](std::string_view base_mem) { + read_mem(StrCat(base_mem, "/memory.limit_in_bytes"), &mdata->mem_total); + read_mem(StrCat(base_mem, "/memory.max"), &mdata->mem_total); + }; + + // For v1 + constexpr auto base_mem_v1 = "/sys/fs/cgroup/memory"sv; + parse_limits(base_mem_v1); + // For v2 if the previous failed + constexpr auto base_mem_v2 = "/sys/fs/cgroup"sv; + parse_limits(base_mem_v2); + // For v2 under /user.slice + constexpr auto base_mem_v2_slice = "/sys/fs/cgroup/user.slice"sv; + parse_limits(base_mem_v2_slice); // Read cgroup-specific limits read_mem(StrCat(mem_path, "/memory.limit_in_bytes"), &mdata->mem_total); read_mem(StrCat(mem_path, "/memory.max"), &mdata->mem_total); read_mem(StrCat(mem_path, "/memory.high"), &mdata->mem_avail); - mdata->mem_avail = min(mdata->mem_avail, mdata->mem_total); /* Update thread limits */ - constexpr auto base_cpu = "/sys/fs/cgroup/cpu"sv; auto read_cpu = [&read_something](string_view path, size_t* output) { double count{0}, timeshare{1}; @@ -534,8 +543,13 @@ bool UpdateResourceLimitsIfInsideContainer(io::MemInfoData* mdata, size_t* max_t } }; + constexpr auto base_cpu = "/sys/fs/cgroup/cpu"sv; read_cpu(base_cpu, max_threads); // global cpu limits - read_cpu(cpu_path, max_threads); // cgroup-specific limits + constexpr auto base_cpu_v2 = "/sys/fs/cgroup"sv; + read_cpu(base_cpu_v2, max_threads); // global cpu limits + constexpr auto base_cpu_v2_slice = "/sys/fs/cgroup/user.slice"sv; + read_cpu(base_cpu_v2_slice, max_threads); // global cpu limits + read_cpu(cpu_path, max_threads); // cgroup-specific limits if (!read_something) { LOG(ERROR) << "Failed in deducing any cgroup limits with paths " << mem_path << " and "