LSF作业内存分配环境变量及bash十六进制值转GB问题
LSF作业内存分配环境变量与十六进制内存值转换问题
问题描述
哪位知道LSF用于存储作业内存分配的环境变量?LSF文档中列出了$LSB_JOB_MEMLIMIT,但该变量在LSF批处理或交互式会话中不存在。目前找到最接近的是$LSB_CG_MEMLIMIT,其值为0x200000000,如何在bash中将这个十六进制值转换为8或8G?需要把这个最大内存分配值作为参数传给批处理脚本中的工具。
相关环境信息
> echo $LS $LSB_ACCT_FILE $LSB_DJOB_RANKFILE $LSB_EXIT_REQUEUE $LSB_JOBRES_CALLBACK $LSB_SUB_HOST $LSF_BINDIR $LSFUSER $LSB_AFFINITY_HOSTFILE $LSB_DOCKER_JOB_STARTTS $LSB_HOSTS $LSB_JOBRES_PID $LSB_SUB_RES_REQ $LSF_CGROUP_TOPDIR_KEY $LSF_VERSION $LSB_APPLICATION_NAME $LSB_ECHKPNT_RSH_CMD $LSB_INTERACTIVE $LSB_MAX_NUM_PROCESSORS $LSB_SUB_USER $LSF_ENVDIR $LS_JOBPID $LSB_BATCH_JID $LSB_EEXEC_REAL_GID $LSB_JOB_EXECUSER $LSB_MCPU_HOSTS $LSB_TRAPSIGS $LSF_INVOKE_CMD $LS_SUBCWD $LSB_BIND_CPU_LIST $LSB_EEXEC_REAL_UID $LSB_JOBEXIT_STAT $LSB_OUTDIR $LSB_UNIXGROUP_INT $LSF_JOB_TIMESTAMP_VALUE $LSB_CG_MEMLIMIT $LSB_EFFECTIVE_RSRCREQ $LSB_JOBFILENAME $LSB_PROJECT_NAME $LSB_XFER_OP $LSF_LIBDIR $LSB_CHKFILENAME $LSB_EXEC_CLUSTER $LSB_JOBID $LSB_QUEUE $LS_COLORS $LSF_LIM_API_NTRIES $LSB_DJOB_HOSTFILE $LSB_EXEC_HOSTTYPE $LSB_JOBINDEX $LSB_RES_GET_FANOUT_INFO $LS_EXECCWD $LSF_LOGDIR $LSB_DJOB_NUMPROC $LSB_EXIT_PRE_ABORT $LSB_JOBNAME $LSB_SHMODE $LS_EXEC_T $LSF_SERVERDIR > echo $LSB_CG_MEMLIMIT 0x200000000 > bsub -V IBM Spectrum LSF 10.1.0.0 build 545500, Apr 10 2020 Copyright International Business Machines Corp. 1992, 2016.
解决方案
1. 十六进制转十进制字节数
bash支持直接对十六进制值进行算术运算,先将$LSB_CG_MEMLIMIT转换为十进制字节数:
mem_bytes=$(( $LSB_CG_MEMLIMIT )) echo $mem_bytes # 输出:8589934592
2. 转换为GB单位(整数结果)
1GB等于1024^3字节(即1073741824字节),以此为基准计算:
# 得到整数GB值 mem_gb=$(( mem_bytes / 1073741824 )) echo $mem_gb # 输出:8 # 输出带单位的格式 echo "${mem_gb}G" # 输出:8G
3. 一行命令直接获取结果
如果需要简化步骤,可直接合并为一行:
mem_limit=$(echo "$(( $LSB_CG_MEMLIMIT / 1073741824 ))G") echo $mem_limit # 输出:8G
环境变量补充说明
在LSF 10.1.0版本中,$LSB_JOB_MEMLIMIT未生效时,$LSB_CG_MEMLIMIT是基于cgroup的实际内存限制值,是当前可用的最准确内存分配环境变量。若需要更详细的作业资源信息,也可通过bjobs -l <JOBID>命令查看作业详情,从中提取内存配置。
内容的提问来源于stack exchange,提问作者RodrigoGM
相关产品推荐
相关产品推荐

