LSF ESUB实现为任务默认添加内存需求和内存限制

集群管理 6 829 团子精英 收藏

需求来源:

1、任务在提交的时候不确定资源需求

2、很多人都有相同类型的任务

3、任务过程中开始吃内存,但是还未触及到host/queue的阈值,导致任务依旧可以提交

4、用户不喜欢使用-R的方式来预定内存。

解决:

1、通过esub来实现修改用户的提交来实现固定的申请一些内存。

2、可以通过判断任务类型来制定专用的esub,用户可以通过bsub -a 来实现选择

脚本示例:

2.1.这个脚本判断了用户是否提交的是vcs任务,如果是,则默认分配内存

#!/bin/bash
. $LSB_SUB_PARM_FILE
exec 1>&2

if [[ $LSB_SUB_COMMAND_LINE == *"vcs"* ]];then
####判断提交的命令中是否包涵vcs语句,如果包含,则使用此规则
 if [ -z $LSB_SUB_MAX_NUM_PROCESSORS ];then
 ####判断是否使用了-n来预定slot
  LSB_SUB_MAX_NUM_PROCESSORS=1
  ####判断如果没有-n参数,则默认-n参数为1
 fi
 slot=$LSB_SUB_MAX_NUM_PROCESSORS
 #### 赋予变量,方便计算,也可以直接参与计算
 mem=$(($slot*2000))
 #### 为每个slot分配默认2G的内存需求
 LSB_SUB_MEM_USAGE=$mem
   echo 'LSB_SUB_RES_REQ="rusage[mem='$mem']"' > $LSB_SUB_MODIFY_FILE
   #### 修正用户提交内容,添加内存需求
   echo 'LSB_SUB_RLIMIT_RSS='$mem >> $LSB_SUB_MODIFY_FILE
   #### 修正用户提交内容,添加内存限制
fi
echo "You has choose a Vcs Default memory job classic"
####输出注释
echo "Your Job has been allocated "$mem"M of Memory"
####输出注释

2.2下面的脚本则不判断任务类型

#!/bin/bash
. $LSB_SUB_PARM_FILE
exec 1>&2

if [ -z $LSB_SUB_MAX_NUM_PROCESSORS ];then
 ####判断是否使用了-n来预定slot
  LSB_SUB_MAX_NUM_PROCESSORS=1
  ####判断如果没有-n参数,则默认-n参数为1
fi
slot=$LSB_SUB_MAX_NUM_PROCESSORS
#### 赋予变量,方便计算,也可以直接参与计算
mem=$(($slot*2000))
#### 为每个slot分配默认2G的内存需求
LSB_SUB_MEM_USAGE=$mem
  echo 'LSB_SUB_RES_REQ="rusage[mem='$mem']"' > $LSB_SUB_MODIFY_FILE
  #### 修正用户提交内容,添加内存需求
  echo 'LSB_SUB_RLIMIT_RSS='$mem >> $LSB_SUB_MODIFY_FILE
  #### 修正用户提交内容,添加内存限制,如果无此要求,可以注释本行

echo "Your Job has been allocated "$mem"M of Memory"
####输出注释

使用方法:

1、具有判断类型的任务可以进行多次判断,来实现不同的任务直接进行默认的内存分配

#!/bin/bash
. $LSB_SUB_PARM_FILE
exec 1>&2

if [ -z $LSB_SUB_MAX_NUM_PROCESSORS ];then
 ####判断是否使用了-n来预定slot
  LSB_SUB_MAX_NUM_PROCESSORS=1
  ####判断如果没有-n参数,则默认-n参数为1
fi
slot=$LSB_SUB_MAX_NUM_PROCESSORS
#### 赋予变量,方便计算,也可以直接参与计算

 if [[ $LSB_SUB_COMMAND_LINE == *"vcs"* ]];then
  mem=$(($slot*2000))
  #### 为vcs任务每个slot分配默认2G的内存需求
 elif  [[ $LSB_SUB_COMMAND_LINE == *"pt_shell"* ]];then
  mem=$(($slot*4000))
  #### 为pt任务每个slot分配默认4G的内存需求
 elif  [[ $LSB_SUB_COMMAND_LINE == *"dc_shell"* ]];then
  mem=$(($slot*6000))
  #### 为dc任务每个slot分配默认6G的内存需求
 else
  mem=$(($slot*1000))
  #### 为其他类型任务每个slot分配默认1G的内存需求
 fi
 
LSB_SUB_MEM_USAGE=$mem
  echo 'LSB_SUB_RES_REQ="rusage[mem='$mem']"' > $LSB_SUB_MODIFY_FILE
  #### 修正用户提交内容,添加内存需求
  echo 'LSB_SUB_RLIMIT_RSS='$mem >> $LSB_SUB_MODIFY_FILE
  #### 修正用户提交内容,添加内存限制

echo "Your Job has been allocated "$mem"M of Memory"
####输出注释

2、不具有任务类型判断的esub脚本可以写多个

例如:

esub.vcs

esub.pt

esub.dc

在用户使用的时候可以直接指定esub来实现内存预先分配

bsub -a vcs

bsub -a pt

bsub -a dc

结论:

这么做的好处只有一个,大内存的任务,尤其是-n 20 这种对资源需求比较多的任务,在未指定内存需求的情况下不会提交到内存不足的服务器上。

请自行判断,参考使用,请勿照搬!!!!

相关推荐:

网友留言:

  1. enkeilean
    回复
    请问这个脚本写好了,但是bsub -a xx 并没有生效,是否需要改lsf的config配置?
    1. 团子精英
      回复
      似乎需要在lsf.conf文件中添加LSB_SUB_COMMAND_LINE=Y
  1. CAD
    CAD
    回复
    请问有没有CPU限制的esub?LSF可以查询当前job实际使用多少CPU吗?
    1. 团子精英
      回复
      使用bjobs -l jobid可以查询到job的具体资源信息
您需要 登录账户 后才能发表评论

我要评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。
验证码