基于 Linux cgroup 内存子系统的内存和交换限制实施

所有 LSF 作业进程都由 Linux cgroup 系统控制,因此不能超过 cgroup 内存和交换限制。 在 Red Hat Enterprise Linux (RHEL) 6.2 或更高版本以及 SuSe Linux Enterprise Linux 11 SP2 或更高版本上,将对每个作业和每个主机 (而不是每个任务) 实施这些限制。 LSF 通过定期收集作业使用情况并将其与用户设置的限制进行比较,对作业实施内存和交换限制。 LSF 可以对支持 Linux cgroup v1cgroup v2 cgroups 的系统施加严格的主机级内存和交换限制。

集群中的不同 LSF 主机可以使用不同版本的 cgroup ,只要每个单独的 LSF 主机仅运行一个版本的 cgroup。 如果在主机中同时启用了两个版本的 cgroup ,那么必须禁用其中一个版本。 例如, hostA 可以使用 cgroup v1 , hostB 可以使用 cgroup v2 ,只要每个主机仅运行一个版本的 cgroup即可。

要通过 Linux cgroup 内存子系统启用内存实施,请在 lsf.conf 文件中配置 LSB_RESOURCE_ENFORCE="memory" 参数。

如果主机操作系统为 Red Hat Enterprise Linux 6.3 或更高版本,那么将实施 cgroup 内存限制,并通知 LSF 终止作业。 通过 bhist –l显示的特定终止原因向用户提供更多通知。

要更改 (例如,减少) 正在运行的作业的 cgroup 内存限制,请使用 bmod -M 来更改作业的内存限制,并使用 bmod -v 来更改作业的交换限制。 请注意,当您请求更改作业的内存或交换限制时, LSF 会修改作业的需求以适应您的请求,并修改作业的 cgroup 限制设置。 如果操作系统拒绝 cgroup 内存或交换限制修改,那么 LSF 会向作业发布一条消息以指示 cgroup 未更改。 cgroup 限制更改后,操作系统可以调整作业的内存或交换分配。 作为最佳实践,请勿将 cgroup 内存或交换限制降低到低于应用程序使用范围。

如果在升级现有 LSF 集群后通过 Linux cgroup 内存子系统启用内存或交换实施,请确保在 lsf.conf 文件中设置以下参数:
  • LSF_PROCESS_TRACKING=Y
  • LSF_LINUX_CGROUP_ACCT=Y

设置 LSB_RESOURCE_ENFORCE="memory" 将自动开启 cgroup 记帐 (LSF_LINUX_CGROUP_ACCT=Y) ,以便为内存和交换实施检查提供更准确的内存和交换消耗数据。 设置 LSF_PROCESS_TRACKING=Y 使 LSF 能够在超过内存和交换限制后完全终止作业。

注: 如果配置了 LSB_RESOURCE_ENFORCE="memory" ,那么将忽略所有现有的 LSF 内存限制相关参数,例如 LSF_HPC_EXTENSIONS="TASK_MEMLIMIT"LSF_HPC_EXTENSIONS="TASK_SWAPLIMIT""LSB_JOB_MEMLIMIT""LSB_MEMLIMIT_ENFORCE"

示例

提交具有 3 个任务且内存限制为 100 MB 的并行作业, span [ptile=2] ,以便 2 个任务可以在一个主机上运行, 1 个任务可以在另一个主机上运行:

bsub -n 3 -M 100 –R "span[ptile=2]" blaunch ./mem_eater 

应用程序 mem_eater 不断增加内存使用量。

LSF 会在作业耗用的总内存超过 200 MB 的任何时间点终止该作业hosta或总内存超过 100 MBhostb例如,如果在任何时候 2 任务运行于hosta和 1 任务运行于hostb,仅当 2 任务耗用的内存总量hosta超过 200 MBhosta或 100 MBhostb.

LSF 不支持针对 cgroups 的每个任务内存实施。 例如,如果其中一个任务位于hosta使用 150 MB 内存,而另一个任务仅使用 10 MB ,不会终止该作业,因为在该时间点,该作业所耗用的总内存hosta只有 160 MB。

内存实施不适用于累积内存使用情况。 例如,两个任务在以下时间最多使用 250 MB:hosta总数。 task1 的最大内存使用量hosta是 150 MB , task2 的最大内存使用量hosta为 100 MB ,但这从不同时发生,因此在任何给定时间,这两个任务的耗用时间都小于 200M ,并且不会终止此作业。 仅当在特定时间点,两个任务的耗用时间超过 200M 时,才会终止该作业。hosta.

注: cgroup 内存子系统不会单独实施内存使用情况和交换使用情况。 如果指定了交换限制,那么限制实施与先前的 LSF 行为不同。 bjobs -l 将 SWAP 显示为 0。 这是正确的,因为未单独收集交换设备使用情况与内存使用情况。

例如,对于以下作业提交:

bsub -M 100  -v 50 ./mem_eater

在应用程序使用超过 100 MB 的内存后, cgroup 将开始对作业进程使用交换。 直到应用程序达到 150 MB 内存使用量 (100 MB 内存 + 50 MB 交换) 之后,才会终止该作业。

以下作业仅指定交换限制:

bsub -v 50 ./mem_eater

由于未指定内存限制,因此 LSF 将内存限制视为与交换限制相同。 当达到 50 MB 的组合内存和交换使用率时,将终止该作业。

Linux cgroups 实施基于主机的内存和交换限制

lsf.conf 文件中配置 LSB_RESOURCE_ENFORCE="memory" 参数时,当为作业指定内存和交换限制时 (在作业级别使用 -M-v,或者在 lsb.queueslsb.applications 中使用 MEMLIMIT 和 SWAPLIMIT) ,将计算内存和交换限制并强制实施为执行主机上运行的任务数的倍数。

bsub -hl 选项启用基于作业级别主机的内存和交换限制实施,而不考虑在执行主机上运行的任务数。 必须在 lsf.conf 中使用 -hl 选项为基于主机的内存和交换限制实施指定 LSB_RESOURCE_ENFORCE="memory" 参数才能生效。

如果没有为作业指定内存或交换限制 (如果指定了作业,队列和应用程序概要文件的合并限制) ,或者未指定 LSB_RESOURCE_ENFORCE="memory" 参数,那么不会为作业设置基于主机的内存限制。 -hl 选项仅适用于内存和交换限制; 它不适用于任何其他资源使用限制。

局限性与已知问题

  • 对于并行作业,仅对通过 LSF blaunch 框架启动的作业实施 cgroup 限制。 不支持通过 LSF PAM/taskstarter 启动的并行作业。
  • 在 RHEL 6.2上, LSF 无法从 cgroup 接收到超过内存和交换限制的通知。 当超过作业内存和交换限制时, LSF 无法保证该作业已终止。 在 RHEL 6.3上, LSF 会接收通知并终止作业。
  • 在 RHEL 6.2上,如果应用程序由于内存强制实施而被 cgroup 杀死,那么多线程应用程序将成为僵尸进程。 因此, LSF 无法等待用户应用程序退出状态,并且 LSF 进程挂起。 LSF 识别该作业未退出,并且该作业始终运行。