如何使用SLURMCAPI获取内存使用信息?
我正在寻找使用C API从Slurm获取每个作业内存使用信息的方法,即已使用的内存和保留的内存。我想我可以通过调用如何使用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调用可以为我提供详细的内存使用信息?请告知。这个问题的部分答案只集中在编译器错误上。代码的缺失部分是循环分配的内存和使用的内
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
命令中得到的结果不同。我将不得不进一步调查此事