如何使用SLURMCAPI获取内存使用信息?

如何使用SLURMCAPI获取内存使用信息?,c,api,memory,hpc,slurm,C,Api,Memory,Hpc,Slurm,我正在寻找使用C API从Slurm获取每个作业内存使用信息的方法,即已使用的内存和保留的内存。我想我可以通过调用slurm\u load\u jobs(…)来获得这样的统计数据,但是查看job\u step\u info\t类型定义,我看不到任何相关字段。也许在job\u resrcs中可能有一些东西,但它是一种不透明的数据类型,我不知道如何使用它。或者是否有另一个API调用可以为我提供详细的内存使用信息?请告知。这个问题的部分答案只集中在编译器错误上。代码的缺失部分是循环分配的内存和使用的内

我正在寻找使用C API从Slurm获取每个作业内存使用信息的方法,即已使用的内存保留的内存。我想我可以通过调用
slurm\u load\u jobs(…)
来获得这样的统计数据,但是查看
job\u step\u info\t
类型定义,我看不到任何相关字段。也许在
job\u resrcs
中可能有一些东西,但它是一种不透明的数据类型,我不知道如何使用它。或者是否有另一个API调用可以为我提供详细的内存使用信息?请告知。

这个问题的部分答案只集中在编译器错误上。代码的缺失部分是循环分配的
内存
和使用的
内存
数组,其大小取决于作业分配到的主机数量:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include "slurm/slurm.h"
#include "slurm/slurm_errno.h"


struct job_resources {
        bitstr_t *core_bitmap;
        bitstr_t *core_bitmap_used;
        uint32_t  cpu_array_cnt;
        uint16_t *cpu_array_value;
        uint32_t *cpu_array_reps;
        uint16_t *cpus;
        uint16_t *cpus_used;
        uint16_t *cores_per_socket;
        uint64_t *memory_allocated;
        uint64_t *memory_used;
        uint32_t  nhosts;
        bitstr_t *node_bitmap;
        uint32_t  node_req;
        char     *nodes;
        uint32_t  ncpus;
        uint32_t *sock_core_rep_count;
        uint16_t *sockets_per_node;
        uint16_t *tasks_per_node;
        uint8_t   whole_node;

};

int main(int argc, char** argv)
{
        int i, j, slurm_err;
        uint64_t mem_alloc, mem_used;
        job_info_msg_t *jobs;

        /* Load job info from Slurm */
        slurm_err = slurm_load_jobs((time_t) NULL, &jobs, SHOW_DETAIL);
        printf("job_id,cluster,partition,user_id,name,job_state,mem_allocated,mem_used\n");
        /* Print jobs info to the file in CSV format */
        for (i = 0; i < jobs->record_count; i++)
        {
                mem_alloc = 0;
                mem_used = 0;
                for (j = 0; j < jobs->job_array[i].job_resrcs->nhosts; j++)
                {
                        mem_alloc += jobs->job_array[i].job_resrcs->memory_allocated[j];
                        mem_used  += jobs->job_array[i].job_resrcs->memory_used[0];
                }
                printf("%d,%s,%s,%d,%s,%d,%d,%d\n",
                        jobs->job_array[i].job_id,
                        jobs->job_array[i].cluster,
                        jobs->job_array[i].partition,
                        jobs->job_array[i].user_id,
                        jobs->job_array[i].name,
                        jobs->job_array[i].job_state,
                        mem_alloc,
                        mem_used
                );
        }
        slurm_free_job_info_msg(jobs);
        return 0;
}
#包括
#包括
#包括
#包括“slurm/slurm.h”
#包括“slurm/slurm_errno.h”
结构作业资源{
bitstr_t*核心位图;
使用的比特串*核心比特;
uint32\u t cpu\u阵列\u cnt;
uint16_t*cpu_数组_值;
uint32_t*cpu_阵列_代表;
uint16_t*CPU;
uint16_t*使用的CPU;
uint16*每个插座的芯数;
uint64*分配的内存;
uint64_t*使用的内存;
uint32_t nhosts;
bitstr_t*节点_位图;
uint32节点请求;
字符*节点;
uint32_t ncpus;
uint32*sock\U core\U rep\U计数;
每个节点的uint16*sockets;
uint16每个节点的任务数;
uint8_t整个节点;
};
int main(int argc,字符**argv)
{
int i,j,slurm_err;
uint64内存分配,已使用内存;
作业信息消息*作业;
/*从Slurm加载作业信息*/
slurm_err=slurm_load_作业((time_t)NULL,&作业,显示详细信息);
printf(“作业id、集群、分区、用户id、名称、作业状态、分配的成员、使用的成员”);
/*以CSV格式将作业信息打印到文件中*/
对于(i=0;irecord\u count;i++)
{
mem_alloc=0;
使用的内存=0;
对于(j=0;jjob_数组[i]。job_resrcs->nhosts;j++)
{
mem_alloc+=jobs->job_array[i]。job_resrcs->memory_alloced[j];
mem_used+=jobs->job_数组[i]。job_resrcs->memory_used[0];
}
printf(“%d、%s、%s、%d、%s、%d、%d、%d\n”,
作业->作业数组[i]。作业id,
作业->作业数组[i]。群集,
作业->作业数组[i]。分区,
作业->作业数组[i]。用户id,
作业->作业数组[i]。名称,
作业->作业数组[i]。作业状态,
大家好,
记忆
);
}
slurm\u free\u job\u info\u msg(作业);
返回0;
}
这个程序编译和运行时没有错误。但我注意到的一点是
mem_used
要么等于0,要么等于
mem_alloc
,这有时与我从
sstat
命令中得到的结果不同。我将不得不进一步调查此事