在SLURM环境下用C++获取节点可用内存的技术咨询
没问题,我来帮你梳理下在SLURM环境下获取节点可用内存的几种实用方法,包括SLURM自带的环境变量,以及用C++直接读取系统信息的具体实现:
一、SLURM自带的环境变量
SLURM会在作业运行时自动设置一系列环境变量,其中和内存相关的核心变量有这些:
SLURM_MEM_PER_NODE:SLURM分配给当前作业每个节点的总内存额度(单位为MB)。如果你的作业是独占节点运行,这个值基本等于节点的物理总内存;如果是共享节点,那就是分配给你的作业的内存上限。SLURM_MEM_PER_CPU:每个CPU核心分配到的内存额度(单位MB)。你可以结合SLURM_CPUS_PER_TASK或SLURM_NTASKS_PER_NODE计算单节点的总分配内存:总内存 = SLURM_MEM_PER_CPU * SLURM_CPUS_PER_TASK * SLURM_NTASKS_PER_NODE。
⚠️ 注意:这些环境变量都是SLURM分配的额度,不是节点实时可用的内存。如果要获取当前节点的实时空闲内存,得靠系统工具或代码读取。
二、用SLURM命令行工具获取实时内存信息
在作业脚本或运行中的作业里,你可以用SLURM的scontrol工具查询当前节点的详细内存状态:
- 首先通过
SLURMD_NODENAME环境变量获取当前运行的节点名 - 执行以下命令提取总内存和可用内存:
scontrol show node $SLURMD_NODENAME | grep -E '(RealMemory|FreeMemory)'
输出示例:
RealMemory=131072
FreeMemory=98765
其中RealMemory是节点物理总内存(MB),FreeMemory是当前节点的空闲内存(MB)。
三、用C++实现获取可用内存
在Linux系统中,内存信息会暴露在/proc/meminfo文件里,这是最可靠的获取实时内存状态的方式。下面是两种实用的实现方式:
方式1:读取/proc/meminfo文件(推荐)
这种方式可以直接获取总内存和可用内存(包含可回收的缓存/缓冲区),非常适合用来判断缓存空间的可扩展上限:
#include <iostream> #include <fstream> #include <string> #include <regex> int main() { std::ifstream meminfo_file("/proc/meminfo"); if (!meminfo_file.is_open()) { std::cerr << "Failed to open /proc/meminfo" << std::endl; return 1; } std::string line; std::regex mem_pattern(R"((MemTotal|MemAvailable):\s+(\d+)\s+kB)"); std::smatch match_result; long long total_mem_kb = 0; long long available_mem_kb = 0; while (std::getline(meminfo_file, line)) { if (std::regex_search(line, match_result, mem_pattern)) { const std::string key = match_result[1]; const long long value = std::stoll(match_result[2]); if (key == "MemTotal") { total_mem_kb = value; } else if (key == "MemAvailable") { available_mem_kb = value; } } } meminfo_file.close(); if (total_mem_kb > 0 && available_mem_kb > 0) { std::cout << "Total node memory: " << total_mem_kb / 1024 << " MB" << std::endl; std::cout << "Available memory (for cache): " << available_mem_kb / 1024 << " MB" << std::endl; } else { std::cerr << "Failed to parse memory information" << std::endl; return 1; } return 0; }
方式2:用sysconf获取总内存(仅总内存)
sysconf函数可以获取系统的物理总内存,但无法直接获取可用内存,适合只需要知道节点总内存的场景:
#include <iostream> #include <unistd.h> int main() { const long page_size = sysconf(_SC_PAGESIZE); const long total_pages = sysconf(_SC_PHYS_PAGES); if (page_size == -1 || total_pages == -1) { std::cerr << "Failed to get memory information via sysconf" << std::endl; return 1; } const long long total_mem_kb = (static_cast<long long>(page_size) * total_pages) / 1024; std::cout << "Total node memory: " << total_mem_kb / 1024 << " MB" << std::endl; return 0; }
内容的提问来源于stack exchange,提问作者Anurag Peshne
相关产品推荐
相关产品推荐

