问题
用户反应通过脚本提交大批量(数千个)任务时,会发生任务丢失的情况。查看用户的脚本,示例如下:
for i in task_list:
...
run(i.command)
...
def run(command):
lsf_cmd = f"bsub -q sim -R 'rusage[mem=500000]' {command}"
os.system(lsf_cmd)
...
可以看出这种方式是比较低效的,如果任务运行时间较长,且任务量超过用户最大文件数时,发生任务丢失就不奇怪了。
解决方法
LSF可以通过将任务打包提交的方式,在一次API调用中提交大量任务,从而提高大批量任务的提交效率。
需要做两项目工作:
1. 配置LSF参数
在lsf.conf中定义如下参数
LSB_MAX_PACK_JOBS=500
此参数是限制一次性打包提交的任务数量,数量太大会影响调度性能,比如一些高优先级任务的调度会延迟,LSF命令的响应时间延长。因此应根据具体情况设定。
2. 修改用户脚本
用户脚本应根据上面的参数修改,1)将大量任务按以上参数值切分,并分别形成任务文件;2)提交任务的命令要按LSF手册规范进行修改。
第一项的任务任务切分不再赘述,任务文件的格式按LSF手册中的说明生成,示例如下
-q sim -R 'rusage[mem=500000]' cmd1 cmd1_option1 cmd1_option2 ...
-q sim -R 'rusage[mem=500000]' cmd2 cmd2_option1 cmd2_option2 ...
...
任务文件中的任务数不能超过LSB_MAX_PACK_JOBS的值,在此例中为500.
第二项,提交任务时bsub命令按LSF手册规范修改为
bsub -pack sim_job.txt
结果
经过以上优化改造后,用户反映没有任务丢失的情况发生,提交速度大大提高。
参考
限制:
不支持的提交参数 -I, -Ip, -Is, -IS,-ISp, -ISs, -IX, -XF, -K, -jsdl, -h, -V
在任务文件中定义的作业数量不能超过lsf.conf中定义的LSB_MAX_PACK_JOBS。
如果任务总数超过LSB_MAX_PACK_JOBS,创建多个作业文件,然后分别提交。