add cgroup version detect

This commit is contained in:
Zonghang Li 2024-11-30 09:48:19 +04:00
parent 3074763ed4
commit 1a7237636e

View file

@ -410,18 +410,47 @@ static uint64_t device_host_physical_memory(bool available) {
} }
static uint64_t device_cgroup_physical_memory(bool available) { static uint64_t device_cgroup_physical_memory(bool available) {
const char * file_path = available uint64_t memory_info = 0;
const char * file_path = nullptr;
std::ifstream cgroup_file("/proc/cgroups");
bool is_cgroup_v2 = false;
if (cgroup_file.is_open()) {
std::string line;
while (std::getline(cgroup_file, line)) {
if (line.find("0") != std::string::npos) {
is_cgroup_v2 = true;
break;
}
}
cgroup_file.close();
}
if (is_cgroup_v2) {
file_path = available
? "/sys/fs/cgroup/memory.current"
: "/sys/fs/cgroup/memory.max";
} else {
file_path = available
? "/sys/fs/cgroup/memory/memory.usage_in_bytes" ? "/sys/fs/cgroup/memory/memory.usage_in_bytes"
: "/sys/fs/cgroup/memory/memory.limit_in_bytes"; : "/sys/fs/cgroup/memory/memory.limit_in_bytes";
uint64_t memory_info = 0; }
std::ifstream file(file_path); std::ifstream file(file_path);
if (file.is_open()) { if (file.is_open()) {
std::string line; std::string line;
if (std::getline(file, line)) { if (std::getline(file, line)) {
try {
memory_info = std::stoull(line); memory_info = std::stoull(line);
} catch (const std::exception &e) {
memory_info = 0;
}
} }
file.close(); file.close();
} else {
memory_info = 0;
} }
return memory_info; return memory_info;
} }
@ -503,15 +532,41 @@ static uint64_t device_cgroup_swap_memory(bool available) {
if (available) return 0; if (available) return 0;
#if defined(__linux__) #if defined(__linux__)
const char * file_path = nullptr;
uint64_t swap_limit = 0; uint64_t swap_limit = 0;
std::ifstream mem_swap_file("/sys/fs/cgroup/memory/memory.memsw.limit_in_bytes");
std::ifstream cgroup_file("/proc/cgroups");
bool is_cgroup_v2 = false;
if (cgroup_file.is_open()) {
std::string line;
while (std::getline(cgroup_file, line)) {
if (line.find("0") != std::string::npos) {
is_cgroup_v2 = true;
break;
}
}
cgroup_file.close();
}
if (is_cgroup_v2) {
file_path = "/sys/fs/cgroup/memory.swap.max";
} else {
file_path = "/sys/fs/cgroup/memory/memory.memsw.limit_in_bytes";
}
std::ifstream mem_swap_file(file_path);
if (mem_swap_file.is_open()) { if (mem_swap_file.is_open()) {
std::string line; std::string line;
if (std::getline(mem_swap_file, line)) { if (std::getline(mem_swap_file, line)) {
try {
swap_limit = std::stoull(line); swap_limit = std::stoull(line);
} catch (const std::exception &e) {
swap_limit = 0;
}
} }
mem_swap_file.close(); mem_swap_file.close();
} }
return swap_limit; return swap_limit;
#else #else
return 0; // Unsupported on non-Linux platforms return 0; // Unsupported on non-Linux platforms