LSF实践专题(6):CPU亲和性调度

目录

如何启用LSF的CPU亲和性调度?

如何提交CPU/内存绑定作业?

示例1:

示例2:

示例3:

示例4:

如何查看LSF的亲和性资源及作业?

CPU亲和性调度举例


Linux、AIX等操作系统支持CPU亲和性(affinity)调度,即可以将进程/线程与CPU进行绑定,提高CPU cache的命中率,减少内存访问损耗,从而提升应用程序的运行性能。要实现CPU亲和性绑定,我们可以通过系统工具手动分配进程到不同的 CPU 上,也可以通过LSF将作业进程绑定到指定的CPU上。本文将以实例说明LSF如何实现对CPU亲和性绑定的控制。

如何启用LSF的CPU亲和性调度?

先介绍LSF中设置CPU亲和性调度的两个配置文件。

1. 通过lsb.hosts中的AFFINITY关键字来配置是否启用这台host的CPU亲和性调度功能:

HOST_NAME MXJ r1m AFFINITY
hostA      !   ()   (Y)

2. 在lsb.modules中设置是否启用CPU亲和性调度插件schmod_affinity:

Begin PluginModule
SCH_PLUGIN         RB_PLUGIN      SCH_DISABLE_PHASES
schmod_default       ()              ()
...
schmod_affinity      ()              ()
End PluginModule

LSF也支持在Linux Cgroup的cpuset子系统上强制执行CPU绑定。当启用Linux Cgroup的CPU affinity绑定时,如果作业有亲和性资源需求,LSF将创建一个包含作业进程的Cgroup,并确保作业进程无法从该Cgroup中脱离。每个affinity作业的Cgroup只包括LSF分配的CPU和内存节点。

LSF会自动采集计算节点的CPU拓扑结构,包括NUMA、CPU socket、CPU core和硬件超线程HT等信息。用户提交作业时可以指定作业进程如何绑定到这些计算单元。

要启用Linux Cgroup的CPU和内存绑定,除了需要设置之前提到的lsb.hosts和lsb.modules外,还需要在 lsf.conf中配置以下3个参数:   

LSF_PROCESS_TRACKING=Y
LSF_LINUX_CGROUP_ACCT=Y
LSB_RESOURCE_ENFORCE="cpu"

注释:

1)前两个参数用于在LSF中使能Cgroup,第三个参数用于使能CPU强制执行;

2)以上配置设置后,需要重启LSF集群来生效。

如何提交CPU/内存绑定作业?

LSF中通过bsub -R选项的affinity[]关键字来指定CPU亲和性资源需求,也可以在lsb.queues或lsb.applications中通过RES_REQ参数进行指定。 

affinity[]资源需求字符串的详细语法如下:

affinity[pu_type[*count] | [pu_type(pu_num[,pu_options])[*count]] [:cpubind=numa | socket | core | thread] [:membind=localonly | localprefer] [:distribute=task_distribution]]

关于affinity关键字的详细说明可以参考下面的官方文档:

IBM Documentation

下面举几个例子说明一下:

示例1:
bsub -n 6 -R "span[hosts=1] affinity[core(1):distribute=pack]" myjob

该作业请求提供6个slots,以启动6个tasks在一个节点上运行。每个slot/task都映射到一个CPU core上。LSF会尽可能在单个NUMA或CPU socket上分配6个core。如果无法满足任务分配,则作业无法启动。

示例2:
bsub -n 6 -R "span[hosts=1] affinity[core(1):distribute=pack(socket=1)]" myjob

该作业请求6个slots,以启动6个tasks在一个节点上运行。每个slot/task映射到一个CPU core上,并且所有CPU core必须来自同一个CPU socket,否则作业无法启动。

示例3:
bsub -n 2 -R "span[hosts=1] affinity[core(2, same=socket, exclusive=(socket, injob))]" myjob

该作业请求分配一个计算节点上的两个slots,以启动两个tasks,每个slot映射到两个CPU core上。第一个slot/task的两个CPU core必须来自同一个CPU socket,第二个slot/task的两个CPU core必须位于另外一个CPU socket上。

示例4:
bsub -n 2 -R "affinity[core(2,same=socket,exclusive=(socket,injob|alljobs)): cpubind=socket]" myjob

该作业请求两个slots,以启动两个task,每个slot/task分配到不同的CPU socket上。每个task需要来自相同CPU socket的两个CPU core,并且在socket级别绑定每个task。分配的CPU socket是独占的,也就是说task之间不能共用相同的CPU socket。其它作业也不允许使用该作业占用的CPU socket。

如何查看LSF的亲和性资源及作业?

1. 查看具有affinity资源需求的作业信息

bjobs、bhist和bacct命令的-l选项再加上-aff选项可以显示作业的affinity资源信息,例如这是某个指定了affinity资源需求作业的bjobs -l -aff的输出:

AFFINITY:
                     CPU BINDING                          MEMORY BINDING
                    ------------------------             --------------------
 HOST                TYPE   LEVEL  EXCL   IDS             POL   NUMA SIZE
 hostA               core   socket socket /0/0/0          local 0    16.7MB
 hostA               core   socket socket /0/1/0          local 0    16.7MB
 hostA               core   socket socket /0/2/0          local 0    16.7MB
 hostA               core   socket socket /0/3/0          local 0    16.7MB
 hostA               core   socket socket /0/4/0          local 0    16.7MB
 hostA               core   socket socket /0/5/0          local 0    16.7MB
 ...

2. 查看计算节点的affinity信息

lshosts命令的-T选项可以显示计算节点的CPU拓扑信息。

bhosts命令的-aff选项可以显示计算节点的CPU拓扑信息和作业占用情况。

对于不支持CPU亲和性调度的计算节点,bhosts -aff输出中的内存信息会显示为破折号(-),且不显示CPU拓扑信息。

CPU亲和性调度举例

我们以下面的作业为例说明LSF的CPU亲和性调度。

bsub -n 2 -R "affinity[core(3,same=numa):cpubind=numa:membind=localonly]" myjob

上面的作业请求两个slots以启动两个tasks,每个task都需要使用同一个NUMA节点上的3个CPU core,并进行CPU和内存绑定。

1. 配置参数使能亲和性绑定,重启LSF集群使其生效

2. 提交作业

$ bsub -n 2 -R "affinity[core(3,same=numa):cpubind=numa:membind=localonly]" sleep 1h
Job <22045> is submitted to default queue <normal>.

3. 使用bjobs -l -aff和bhist -l -aff查看作业绑定的CPU信息

$ bjobs -l -aff

Job <22045>, User <usr1>, Project <default>, Status <RUN>, Queue <normal>,
                     Command <sleep 1h>, Share group charged </usr1>
Tue Nov 30 14:44:41: Submitted from host <host1>, CWD <$HOME>, 2 Task(s), Requ
                     ested Resources <affinity[core(3,same=numa):cpubind=numa:m
                     embind=localonly]>;
Tue Nov 30 14:44:42: Started 2 Task(s) on Host(s) <2*host1>, Allocated 6 Slot(
                     s) on Host(s) <6*host1>, Execution Home </home/usr1>,
                      Execution CWD </home/usr1>;
Tue Nov 30 14:44:49: Resource usage collected.
                     MEM: 2 Mbytes;  SWAP: 0 Mbytes;  NTHREAD: 4
                     PGID: 16606;  PIDs: 16606 16607 16609


 MEMORY USAGE:
 MAX MEM: 2 Mbytes;  AVG MEM: 2 Mbytes

 SCHEDULING PARAMETERS:
           r15s   r1m  r15m   ut      pg    io   ls    it    tmp    swp    mem
 loadSched   -     -     -     -       -     -    -     -     -      -      -  
 loadStop    -     -     -     -       -     -    -     -     -      -      -  

 RESOURCE REQUIREMENT DETAILS:
 Combined: select[type == local] order[r15s:pg] affinity[core(3,same=numa)*1:cp
                     ubind=numa:membind=localonly]
 Effective: select[type == local] order[r15s:pg] affinity[core(3,same=numa)*1:c
                     pubind=numa:membind=localonly]

 AFFINITY:
                     CPU BINDING                          MEMORY BINDING
                     ------------------------             --------------------
 HOST                TYPE   LEVEL  EXCL   IDS             POL   NUMA SIZE
 host1               core   numa   -      /0/0/0          local 0    0.0MB
                                          /0/0/1        
                                          /0/0/2        
 host1               core   numa   -      /0/0/3          local 0    0.0MB
                                          /0/0/4        
                                          /0/0/5    

$ bhist -l -aff
Job <22045>, User <usr1>, Project <default>, Command <sleep 1h>
Tue Nov 30 14:44:41: Submitted from host <host1>, to Queue <normal>, CWD <$HOM
                     E>, 2 Task(s), Requested Resources <affinity[core(3,same=n
                     uma):cpubind=numa:membind=localonly]>;
Tue Nov 30 14:44:42: Dispatched 2 Task(s) on Host(s) <2*host1>, Allocated 6 Sl
                     ot(s) on Host(s) <6*host1>, Effective RES_REQ <select[typ
                     e == local] order[r15s:pg] affinity[core(3,same=numa)*1:cp
                     ubind=numa:membind=localonly] >;

AFFINITY:
                    CPU BINDING                          MEMORY BINDING
                    ------------------------             --------------------
HOST                TYPE   LEVEL  EXCL   IDS             POL   NUMA SIZE
host1               core   numa   -      /0/0/0          local 0    0.0MB
                                         /0/0/1        
                                         /0/0/2        
host1               core   numa   -      /0/0/3          local 0    0.0MB
                                         /0/0/4        
                                         /0/0/5        

Tue Nov 30 14:44:42: Starting (Pid 16606);
Tue Nov 30 14:44:42: Running with execution home </home/usr1>, Execution CW
                     D </home/usr1>, Execution Pid <16606>;


Summary of time in seconds spent in various states by  Tue Nov 30 14:45:36
  PEND     PSUSP    RUN      USUSP    SSUSP    UNKWN    TOTAL
  1        0        54       0        0        0        55

作业完成后可以使用bacct -l -aff查看作业CPU和内存绑定信息。

4. 使用bhosts -aff查看作业绑定的CPU信息

$ bhosts -aff

Host[125.7G] host1
    NUMA[0: 0M / 62.7G]
        Socket0
            core0(*0 16)
            core1(*1 17)
            core2(*2 18)
            core3(*3 19)
            core4(*4 20)
            core5(*5 21)
            core6(6 22)
            core7(7 23)
    NUMA[1: 0M / 62.9G]
        Socket1
            core0(8 24)
            core1(9 25)
            core2(10 26)
            core3(11 27)
            core4(12 28)
            core5(13 29)
            core6(14 30)
            core7(15 31)

bhosts -aff输出中的*号表示有作业绑定了这个CPU core。

lshosts -T也可以查看节点的CPU拓扑信息。lshosts -T与bhosts -aff的区别在于前者不显示CPU是否有作业绑定,后者显示绑定信息。

$ lshosts -T
Host[125.7G] host1
    NUMA[0: 62.7G]
        Socket
            core(0 16)
            core(1 17)
            core(2 18)
            core(3 19)
            core(4 20)
            core(5 21)
            core(6 22)
            core(7 23)
    NUMA[1: 62.9G]
        Socket
            core(8 24)
            core(9 25)
            core(10 26)
            core(11 27)
            core(12 28)
            core(13 29)
            core(14 30)
            core(15 31)

由于篇幅有限,更多关于CPU亲和性调度的使用示例请参阅IBM官方文档,也欢迎给我们留言。

IBM Documentation

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

HPC常青园

  • 12
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
### 回答1: LSF(Load Sharing Facility)是一种用于资源管理和作业调度的软件工具,其中的LSF license调度是指对LSF软件的许可证的管理和调度。 在使用LSF软件时,用户需要获得相应的许可证才能正常使用软件的全部功能。而LSF license调度就是对这些许可证的分配和调度,以确保每个用户都能够按照自己的需求使用软件。 LSF license调度通常涉及以下几个方面: 1.许可证分配:LSF管理员会根据用户的需求和优先级,将可用的许可证分配给不同的用户。通常将许可证分配给具有高优先级或需求的用户,以确保他们能够在需要时优先使用软件。 2.许可证回收:当一些用户不再需要使用LSF软件时,拥有许可证的管理员可以及时收回许可证,以便重新分配给其他用户。这样可以最大限度地提高许可证的利用率和效率。 3.许可证管理:LSF管理员还需要定期监控和管理许可证的使用情况,确保许可证的数量和使用情况与实际需求相符。如果发现许可证不足或者存在滥用的情况,管理员需要及时采取相应的措施。 总之,LSF license调度是对LSF许可证进行合理分配和管理的过程,旨在最大程度地满足用户的需求,提高许可证的利用效率,确保软件系统的正常运行。 ### 回答2: LSF(Load Sharing Facility)是一个用于集群计算的作业调度和管理系统,可以帮助高能计算(HPC)环境下的任务有效地分配和使用资源。在LSF中,license调度是指对软件许可证资源的优化调度和管理。 在一个HPC环境中,常常需要使用各种不同的软件工具和库,这些工具和库通常需要相应的许可证才能合法使用。而软件许可证往往是有限的,所以对许可证资源进行调度是非常重要的。 LSF通过对许可证的分配和释放进行智能调度,以最大程度地利用许可证资源并最小化等待时间。它根据作业的需求和许可证的可用,动态地分配许可证给需要它们的作业,尽量避免许可证的过度分配或浪费。同时,当一个作业不再需要许可证时,LSF会将其释放,以便其他作业能够利用这些许可证资源。 LSF还可以通过许可证的限制和优先级设置,来确保重要的作业能够获得所需的许可证资源,而次要的作业则可能会被推迟或降低许可证的使用。这样可以确保关键任务的顺利执行,同时最大限度地提高整个集群的利用率。 总而言之,LSF的license调度功能是为了合理、高效地管理和调度许可证资源,以确保HPC环境中的作业能够得到所需的许可证,并在最短的时间内完成任务。这样可以提高计算集群的利用率,提升工作效率和系统能。 ### 回答3: LSF(Load Sharing Facility)是一种用于分布式计算环境的作业调度和资源管理软件。在LSF中,license调度是指通过合理管理和分配软件许可证(license),以确保系统中所有用户能够合理使用软件许可证资源。 LSF License调度的主要目标是实现最大化利用软件许可证资源,同时确保用户的需求得到满足。为了实现这一目标,LSF会根据用户的需求和系统的实际情况进行许可证资源的分配和调度LSF License调度的过程通常包括以下几个步骤: 1. 许可证资源的监控和管理:LSF会监控系统中可用的许可证资源数量和使用情况,并对许可证资源进行管理。这包括许可证资源的获取、分配、释放和回收等操作。 2. 许可证资源的分配:根据用户提交的作业需求和当前系统的状况,LSF会决定如何分配许可证资源给不同的作业。通常,LSF会采用一定的算法和策略来进行许可证资源的分配,例如根据作业的优先级、作业的资源需求和系统的负载情况等。 3. 许可证资源的调度和冲突处理:由于许可证资源是有限的,可能会出现作业之间对许可证资源的竞争。LSF会根据系统的策略和规则来调度许可证资源的分配顺序,并解决因许可证资源冲突而导致的调度问题。 4. 许可证资源的回收和释放:当作业使用完许可证资源后,LSF会将这些许可证资源回收并释放给其他等待的作业使用。这样可以确保系统中许可证资源的充分利用。 总之,LSF License调度是为了合理分配和管理系统中的许可证资源,以实现最大化的资源利用和满足用户的需求。通过LSF License调度,可以提高系统的效率和资源利用效率,同时提升用户的使用体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Ivyent

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

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

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

打赏作者

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

抵扣说明:

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

余额充值