概述

Linux 控制组(cgroups)可以限制、统计和隔离进程组的资源使用(CPU、内存、交换空间、磁盘 I/O 等)。通过将任务及其子进程聚合到具有特定行为的层级组中实现资源控制。

内核版本要求

功能 最低内核版本
cgroup 基础支持 2.6.24
eventfd 状态通知 2.6.34

说明:使用 eventfd 通知机制,LSF 能够在作业进程超过内存限制时收到通知,然后终止作业并在账户文件和 bjobs -l 中记录具体的终止原因。

配置步骤

步骤一:检查 cgroup 支持

确认 Linux 系统支持 cgroup:

1
2
3
4
5
$ grep cgroup /proc/mounts
cgroup /cgroup/cpuset cgroup rw,relatime,cpuset 0 0
cgroup /cgroup/memory cgroup rw,relatime,memory 0 0
cgroup /cgroup/freezer cgroup rw,relatime,freezer 0 0
cgroup /cgroup/cpuacct cgroup rw,relatime,cpuacct 0 0

如果显示四个 cgroup 子系统(cpuset、memory、freezer、cpuacct),则已正确挂载。

步骤二:挂载 cgroup 子系统

如果未挂载,在 /etc/fstab 中添加以下内容:

1
2
3
4
cgroup /cgroup/freezer cgroup freezer 0 0
cgroup /cgroup/cpuacct cgroup cpuacct 0 0
cgroup /cgroup/memory cgroup memory 0 0
cgroup /cgroup/cpuset cgroup cpuset 0 0

以 root 身份执行挂载:

1
# mount -a -t cgroup

步骤三:启用 LSF 内存和交换空间强制

$LSF_ENVDIR/lsf.conf 文件中添加:

1
LSB_RESOURCE_ENFORCE="memory"

以 LSF 管理员身份重启集群:

1
lsfrestart

使用方法

指定内存和交换空间限制

选项 说明
bsub -M <MB> 指定内存限制(每槽位)
bsub -v <MB> 指定交换空间限制(每槽位)

也可以在以下位置配置限制:

  • 队列(lsb.queues):MEMLIMITSWAPLIMIT
  • 应用配置文件(lsb.applications):MEMLIMITSWAPLIMIT

重要:内存和交换空间限制是按槽位/任务强制执行的。

示例一:多槽位内存限制

请求2个槽位,每槽位100MB内存限制,在单主机上运行:

1
$ bsub -n 2 -M 100 -R "span[hosts=1]" my_program

LSF 会设置 cgroup 内存子系统限制为 200MB(2 × 100MB)。作业使用超过200MB时将被终止。

示例二:内存+交换空间限制

请求100MB内存和50MB交换空间:

1
$ bsub -M 100 -v 50 my_program

工作原理:

  1. 当程序使用超过100MB内存,cgroup 开始使用交换空间
  2. 直到总使用量达到150MB(100MB内存 + 50MB交换)时,作业才会被终止

查看作业终止原因

使用 bjobs -l 查看因内存超限被终止的作业:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
$ bjobs -l 950
Job <950>, User <user1>, Project <default>, Status <EXIT>, Queue <normal>, Comm
                     and <./eatmem 200>
Thu Oct 17 02:25:49: Submitted from host <hostA>, CWD </home/user1>;
 MEMLIMIT
    100 M
Thu Oct 17 02:25:49: Started on <hostA>, Execution Home </home/user1>,
                     Execution CWD </home/user1>;
Thu Oct 17 02:26:01: Exited with exit code 137. The CPU time used is 0.7 second
                     s.
Thu Oct 17 02:26:01: Completed <exit>; TERM_MEMLIMIT: job killed after reaching
                      LSF memory usage limit.
 MEMORY USAGE:
 MAX MEM: 100 Mbytes
 SCHEDULING PARAMETERS:
           r15s   r1m  r15m   ut      pg    io   ls    it    tmp    swp    mem
 loadSched   -     -     -     -       -     -    -     -     -      -      - 
 loadStop    -     -     -     -       -     -    -     -     -      -      - 
 RESOURCE REQUIREMENT DETAILS:
 Combined: select[type == any] order[r15s:pg]
 Effective: select[type == any] order[r15s:pg]

关键信息

  • 退出码 137:表示进程被信号终止(128 + 9 = SIGKILL)
  • TERM_MEMLIMIT:终止原因为超出 LSF 内存使用限制
  • MAX MEM:显示作业的最大内存使用量

配置位置汇总

配置项 配置文件 说明
LSB_RESOURCE_ENFORCE lsf.conf 启用资源强制
MEMLIMIT lsb.queues 或 lsb.applications 内存限制
SWAPLIMIT lsb.queues 或 lsb.applications 交换空间限制

参考资料

  1. IBM Documentation - Enforcing job memory and swap with Linux cgroups
  2. IBM Documentation - Best practices and tips for LSF