很多LSF管理员都遇到过这样的需求,希望用户在使用bsub提交作业时指定一些参数(例如-R "rusage[mem=xxx]"或者-P <project_name>或者-W <runtime_limit>),来实现资源控制和统计的目的。
LSF为我们提供了这样的机制,可以让管理员定制一些简单的脚本,插入到LSF的执行过程中,实现特殊的作业提交和执行需要。本篇介绍LSF最常用的esub脚本的使用方法。
esub脚本是LSF提供给管理员干预作业提交行为的一种机制。我们可以通过esub脚本对作业提交参数进行检查,或者根据某些规则,来自动补充作业提交参数,甚至拒绝作业的提交。我们接下来看一个具体的例子。
假设我们有如下需要,要求提交到某队列的作业必须设置内存预订(-R "rusage[mem=xxx]"),如果不预订内存,则拒绝作业提交。
我们可以通过esub脚本来检查提交到队列的作业选项,如果提交作业时设置了-R "rusage[mem=xxx]",则允许作业提交,否则拒绝。
esub脚本如下:
$ cat esub.memusage
#!/bin/sh
. $LSB_SUB_PARM_FILE
# Redirect stderr to stdout so echo can be used for error messages
exec 1>&2
if [[ "$LSB_SUB_QUEUE" = "queue1" || "$LSB_SUB_QUEUE" = "queue2" || "$LSB_SUB_QUEUE" = "queue3" ]]
then
if [ -z "$LSB_SUB_MEM_USAGE" ]
then
printf "ERROR: Please add -R \"rusage[mem=xxx]\" to bsub command line.\n"
exit $LSB_SUB_ABORT_VALUE
fi
fi
我们来解释一下上面这个esub脚本:
-
这个脚本检查提交到queue1、queue2、queue3这三个队列的作业是否指定了-R "rusage[mem=xxx]"选项来设置内存预订, 如果没有就通过“exit $LSB_SUB_ABORT_VALUE”退出脚本并拒绝提交作业,同时显示提示信息。其它队列的作业不受影响。
-
$LSB_SUB_MEM_USAGE变量仅限于检查-R的“rusage[mem=xxx]”设置,不检查-R的别的设置。
-
上面三个队列不能是默认队列。如果是默认队列, $LSB_SUB_QUEUE变量为空(LSF不设置这个变量),就需要对脚本做相应调整。
有关配置如下:
-
将上述esub脚本(文件名为esub.memusage)放到$LSF_SERVERDIR目录下,并设置可执行权限。
-
在lsf.conf里配置LSB_ESUB_METHOD="memusage"。
-
如果修改了这个esub脚本的扩展名memusage, 那么lsf.con里配置的LSB_ESUB_METHOD参数的值也要保持一致。
按照上述方法配置后,这个esub脚本就立即生效了,不需要执行badmin reconfig或重启LSF服务。我们来测试一下这个esub脚本的效果。
向queue1提交一个作业,不指定-R "rusage[mem=xxx""选项:
$ bsub -q queue1 sleep 10
ERROR: Please add -R "rusage[mem=xxx]" to bsub command line.
Request aborted by esub. Job not submitted.
可以看到,这个作业被LSF拒绝了,符合我们的预期。
再提交一个符合要求的作业:
$ bsub -q queue1 -R "rusage[mem=100]" sleep 10
Job <7587> is submitted to queue <normal>.
可以看到,这个作业提交成功了。
以上是关于esub脚本的一个简单使用,我们可以按照实际需要,写出检查作业提交参数和修改作业提交参数的esub脚本。关于esub的详细介绍,也可以进一步参考IBM在线文档:
欢迎关注下方微信公众号【HPC常青园】,共同交流HPC集群管理经验和最佳实践。如果您有关于HPC集群的具体需求,欢迎邮件沟通交流:hpc@ivyent.cn。