LSF实践专题(32):对作业的内存和CPU使用进行限制

本文详细介绍了如何在LSF中设置作业的内存和CPU限制,包括在queue、application和作业提交时的设置方法,以及LSF的各种配置参数如LSB_MEMLIMIT_ENFORCE和LSB_JOB_MEMLIMIT的作用。此外,还讨论了LSF与LinuxCGROUP的集成,以实现更精确的资源控制。
摘要由CSDN通过智能技术生成

我们曾经在LSF实践专题(4):如何限制作业的最大内存中探讨过:在LSF集群中运行作业的时候,存在某些作业使用的程序出现问题,或者没有规划好,导致其他进程无法分配到足够内存的情况。

这次我们继续延伸话题:这样的错误不仅会占用内存,还会浪费CPU资源。如果当前的计算节点并不是作业独占模式,这种情况甚至会影响别的作业正常运行,这时,管理员可以设置作业的“能够使用的内存大小和CPU时间”,来防止某些作业占用过多的内存和CPU资源。

通常,我们可以在queue和application,或者提交作业的时候来设置内存或CPU时间限制,即MEMLIMIT或CPULIMIT的参数值,来限制所有提交到该队列或者application中的作业可以使用的内存大小和CPU时间。

例如设置在queue中:

图片

如图,队列queue1中设置了CPULIMIT=10,表示队列queue1中的作业所使用的CPU时间不能超过10分钟。队列queue2中设置了MEMLIMIT=200,表示队列queue2中的作业使用的内存不能超过200MB。

提示:CPULIMIT的默认单位是分钟,MEMLIMIT的默认单位是MB。

使用badmin mbdrestart命令重启LSF管理节点上的mbatchd服务后,我们通过bqueues -l命令查看两个队列,可以看到生效的LIMIT中写明了对应的单位。

图片

图片

在CPULIMIT中显示了节点名称,是因为在以前不同的CPU架构的效能差异比较大,在比较快的CPU上运行10分钟的工作,可能需要在较差的CPU上运行15到20分钟,所以LSF具有根据不同节点上不同的CPU架构来动态修改CPULIMIT的功能。

但是现在的CPU基本已经没有这个问题,LSF在安装时就自动设置了ABS_RUNLIMIT=Y来去掉这个功能,只是在界面上仍然保留了节点名称的显示,作为兼容老版本的考虑。

接下来我们在application中设置,这次我们尝试一下不同的格式:

图片

我们在app3中设置了CPULIMIT=1:30,这表示设置CPU时间的LIMIT为1小时30分钟,如果写成CPULIMIT=90其实也是一样的效果。同时我们也设置了MEMLIMIT=1G,这里我们带了单位,表示设置内存LIMIT为1GB。

用badmin mbdrestart重启管理节点的mbatchd服务后,我们通过bapp -l来看一下设置效果。

图片

同时,我们也可以在提交作业时通过-M和-c来指定MEMLIMIT和CPULIMIT,例如:

图片

在bsub命令中指定时,也可以使用带单位和小时加分钟的方式,例如:

图片

我们可以通过bjobs -l来查看当前作业<621>指定的CPU和内存LIMIT:

图片

但是这些MEMLIMIT里面有什么奥秘?又是怎么产生作用的呢?我们一起来看一看。

LSF_PROCESS_TRACKING和LSF_LINUX_CGROUP_ACCT

LSF可以通过自己的一个名为pim的服务进程来收集当前节点上内存、CPU等资源的消耗情况,并结合正在运行的作业PID信息来为每个运行的作业收集内存和CPU使用情况。

不过这种方式有一些效率上的弊端,如果每秒不停的收集,会拿到相对准确的数据,但是对节点造成了额外的压力;所以这里会间隔15秒收集,但是对于某些比较短的作业来说,反应不够迅速,而且对于峰值的抓取会有所偏差。

LSF实践专题(4):如何限制作业的最大内存中提到过LSF支持通过LINUX CGROUP进行作业的内存限制,需要在lsf.conf文件中配置:

图片

可以让LSF直接从CGROUP中收集每个作业的内存、CPU等资源使用情况,这种方式会更加准确和方便。

在全新安装的LSF10.1环境中,这两个参数被自动设置成了Y,也就是默认使用CGROUP来收集作业的资源使用情况。如果没有设置这两个参数,或者直接设置成了N,那么LSF会用自己的pim进程来收集这些资源使用情况。

不论是使用pim进程还是通过系统的CGROUP收集,每个计算节点的sbatchd服务进程都会将这些资源使用信息对应到每一个当前在该节点运行的作业上,并且汇报给LSF管理节点的mbatchd进程,方便用户通过bjobs -l和bhist -l等命令查看作业对资源的消耗情况。

LSB_MEMLIMIT_ENFORCE和LSB_JOB_MEMLIMIT

默认情况下,LSF并不会直接尝试终止内存使用量超过MEMLIMIT的作业,而是把作业对应的MEMLIMIT通过setrlimit()来设置到Linux系统的RLIMIT_RSS中,由系统来对作业进程使用的内存进行监控和管理。

系统级别的内存限制是基于进程级别的,当一个作业启动多个进程时,只有当单个进程的内存大小超出限制时才会终止这些进程。

如果我们希望限制的是整个作业使用的内存大小,可以通过以下两个参数来让LSF对每个作业使用的内存进行限制:

  • LSB_MEMLIMIT_ENFORCE

  • LSB_JOB_MEMLIMIT

这两个参数的区别及关系,可点击LSF实践专题(4):如何限制作业的最大内存进行回顾。

当开启这两个参数之一后,一旦计算节点上的sbatchd服务进程发现某个作业各个进程的内存使用总量超出了MEMLIMIT的限制,就会向该作业发送终止运行的信号,来结束这个作业。

示例

我们提交一个包含两个进程的作业<625>并指定MEMLIMIT为200MB,每个进程会消耗150MB内存,因此,单个进程没有超过LIMIT限制,而作业级别的内存使用则超过了LIMIT的限制。

图片

通过命令bjobs -l和bhist -l都可以看到,这个作业会退出,并且可以看到退出的原因是TERM_MEMLIMIT,和该作业在达到LSF内存使用限制后被终止的信息。

bjobs -l:

图片

bhist -l:

图片

LSB_JOB_CPULIMIT

CPU时间的限制和内存有一些区别,默认情况下,由LSF自己管理的作业级别CPU时间限制,以及由LSF设置到系统上的进程级别的CPU时间限制都会起作用,哪个先到哪个生效。

而如果将LSB_JOB_CPULIMIT这个参数设置成Y,则只有作业级别的CPULIMIT生效,如果设置成N,则只有进程级别的CPULIMIT生效,如果不设置这个参数,就是默认的效果,作业级别和进程级别都生效。

单个进程超出限制:

首先将LSB_JOB_CPULIMIT设置为N,然后提交一个作业<626>并设置CPULIMIT为1分钟。

图片

从bjobs -l和bhist -l的作业信息中看到作业已经消耗了60秒CPU时间,当作业使用的CPU时间累计到60秒的时候,就被系统终止了,因为是系统直接终止,所以LSF只能看到作业的退出码,并没有显示由于CPULIMIT超过被终止等信息。

bjobs -l:

图片

bhist -l:

图片

不过我们通过退出码也可以看出来,如果是LSF发出信号让作业退出,bjobs -l和bhist -l会显示LSF发出的signal号码,如果是由于系统发出退出信息让进程退出,LSF显示的退出码会在系统给的退出码基础上加上128,我们看到现在的退出码是152,减去128是24,而通过kill -l查看系统的退出码,发现24对应的signal是SIGXCPU,正是系统终止CPULIMIT超出的进程所使用的signal。

图片

同一个作业的多个进程总和超过限制:

图片

将LSB_JOB_CPULIMIT改成Y,并通过badmin hrestart重启当前节点的sbatchd服务,提交一个包含两个进程的作业<627>,每个进程每分钟都会消耗60秒的CPU,而作业的CPULIMIT是2分钟,如果是单个进程,需要运行2分钟才会消耗掉足够的CPU时间,而通过bjobs -l和bhist -l可以看到,这个作业在1分钟后就由于CPULIMIT达到而退出了,因为这次是由LSF主动发出终止信号,所以可以看到作业退出的原因是TERM_CPULIMIT,并且显示作业在LSF CPU使用限制到达后退出。

bjobs  -l:

图片

bhist -l:

图片

LSF_UNIT_FOR_LIMITS

在LSF实践专题(4)中提到过:默认情况下,MEMLIMIT大小单位为MB,在lsf.conf文件中可以配置LSF_UNIT_FOR_LIMITS这个参数来设置其他单位(KB、GB、TB 、PB、EB或ZB)。

但是使用这个参数时要小心,其一是因为这个参数不止影响MEMLIMIT的设置,还会影响RUSAGE里面的内存申请,比如用bsub -R “rusage[mem=500]” sleep 123这个命令提交作业,默认情况下表示需要选一个能为该作业分配500MB内存的节点作为运行节点,但是如果设置了LSF_UNIT_FOR_LIMITS=GB,这条命令会变成需要选一个能分配500GB内存的节点。

其二是因为一旦设置或修改了这个参数,需要在集群内所有作业都结束的情况下,重启整个集群中节点上的所有LSF服务,包括管理节点和所有计算节点,如果有某些作业没有结束,那么设置和重启服务之后,可能会有一些行为和现实不匹配的问题,新提交的作业则不会受到影响。

LSB_RESOURCE_ENFORCE

我们还可以把对LSF中对作业内存的限制转交给CGROUP来实现:在LSB_RESOURCE_ENFORCE中设置mem或者cpu,就可以让系统的CGROUP自动监控作业的内存使用情况,一旦超出,CGROUP会负责将作业终止,并返回给LSF相应的信息。

因为CGROUP是系统内核级别的监控服务,所以它的响应很迅速,能够更加灵敏的掌控作业的资源使用情况。

这个参数必须要配合开启:

LSF_PROCESS_TRACKING=Y

LSF_LINUX_CGROUP_ACCT=Y 

才能生效,不过如果是全新安装的LSF 10.1, 这两个参数本身就是开启的。

示例

我们在lsf.conf中设置:LSB_RESOURCE_ENFORCE=”mem cpu”。

图片

这时,提交新的带有MEMLIMIT或者CPULIMIT的作业后(无论是bsub指定还是在queue或application中设置的limit),LSF就会将对应的LIMIT数值设置到CGROUP该作业对应的进程组上,一旦系统发现作业的使用超出限制,会立刻终止掉作业进程,并且返回相应的信息,LSF的服务进程获取到作业进程终止的信息后,会连同系统返回的信息一起报告给LSF管理节点,管理节点将这些信息写入日志文件,并且通知用户作业已经因为LIMIT超过而退出。

bjobs -l:

图片

总结

这里介绍的几个参数,是用于LSF计算节点对当前节点运行中的作业进行控制和管理的,所以在配置之后要重启所有想要应用该参数的节点上的sbatchd服务进程才可以产生效果,而且因为这些LIMIT是设置在作业进程上的,所以只有在更改参数并重启sbatchd之后运行的作业才会产生对应的效果。

可以用badmin hrestart hostA命令来重启某个或某些节点上的sbatchd服务,也可以用badmin hrestart all命令来重启当前集群内所有节点的sbatchd服务。

欢迎关注下方微信公众号【HPC常青园】,共同交流HPC集群管理经验和最佳实践。如果您有关于HPC集群的具体需求,欢迎邮件沟通交流:hpc@ivyent.cn。

HPC常青园

  • 45
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ivyent

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值