需求来源:
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 这种对资源需求比较多的任务,在未指定内存需求的情况下不会提交到内存不足的服务器上。
请自行判断,参考使用,请勿照搬!!!!
网友留言: