概述
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):
MEMLIMIT、SWAPLIMIT - 应用配置文件(lsb.applications):
MEMLIMIT、SWAPLIMIT
重要:内存和交换空间限制是按槽位/任务强制执行的。
示例一:多槽位内存限制
请求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
工作原理:
- 当程序使用超过100MB内存,cgroup 开始使用交换空间
- 直到总使用量达到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 | 交换空间限制 |