You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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工具查询当前节点的详细内存状态:

  1. 首先通过SLURMD_NODENAME环境变量获取当前运行的节点名
  2. 执行以下命令提取总内存和可用内存:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 03:44:27