概述
IBM Spectrum LSF 是业界领先的高性能计算作业调度系统。本文整理了 IBM 官方文档中关于 LSF 的最佳实践和技巧,涵盖配置优化、并行作业管理、资源控制、作业目录管理等核心内容。
lsf.conf 推荐配置
以下是 lsf.conf 中常用的优化配置参数:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# CPU 核心定义方式
EGO_DEFINE_NCPUS=cores
# 启用交换空间报告
EGO_PIM_SWAP_REPORT=Y
# 作业年份显示
LSB_DISPLAY_YEAR=Y
# 启用性能指标日志
LSB_ENABLE_PERF_METRICS_LOG=Y
# 智能 CPU 绑定
LSF_INTELLIGENT_CPU_BIND=Y
# 日志队列大小
LSF_LOG_QUEUE_SIZE=100000
# 使用 SSH 进行 lslogin
LSF_LSLOGIN_SSH=Y
# 启用进程跟踪
LSF_PROCESS_TRACKING=Y
# SSH 配置
LSF_RSH="ssh -o 'PasswordAuthentication no' -o 'StrictHostKeyChecking no'"
# 严格检查模式(仅在集群完全关闭时更改)
LSF_STRICT_CHECKING=Y
lsb.params 推荐配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# 作业调度间隔
JOB_SCHEDULING_INTERVAL=0
#JOB_SCHEDULING_INTERVAL=250ms
# 账户文件归档设置
ACCT_ARCHIVE_AGE=30 # 30天
ACCT_ARCHIVE_SIZE=10000000 # 10 GB
MAX_ACCT_ARCHIVE_FILE=10
# 启用查询诊断
ENABLE_DIAGNOSE=query
# 启用主机交集
ENABLE_HOST_INTERSECTION=Y
# 扩展作业异常通知
EXTEND_JOB_EXCEPTION_NOTIFY=Y
# 预执行重试配置
LOCAL_MAX_PREEXEC_RETRY=5
LOCAL_MAX_PREEXEC_RETRY_ACTION=EXIT
# 作业重新排队限制
MAX_JOB_REQUEUE=5
# 孤儿作业终止宽限期
ORPHAN_JOB_TERM_GRACE_PERIOD=60
# 启用调度指标
SCHED_METRIC_ENABLE=Y
并行作业 CPU 分配策略
对于需要多个 CPU 的并行作业,合理的 CPU 分配方式可以显著提升性能。
方法一:span[ptile=N] - 每主机固定槽位
使用 span[ptile=N] 语法确保每个主机分配固定数量的槽位:
1
2
# 请求16个CPU,每主机分配4个
$ bsub -n 16 -R "span[ptile=4]" ./a.out
此方式确保每个主机最多有一组槽位,适合需要主机间负载均衡的场景。
方法二:span[block=N] - CPU 块分配
使用 span[block=N] 语法按块分配 CPU:
1
2
# 请求16个CPU,以4为单位分块
$ bsub -n 16 -R "span[block=4]" ./a.out
此方式会尽可能在一个主机上分配更多 CPU 块,减少跨节点通信开销。
并行作业清理机制
LSF 的分布式应用集成框架 blaunch 提供了完整的并行作业清理功能,处理以下异常情况:
- 节点崩溃
- 节点挂起
- 网络连接问题
- 网络延迟异常
- 任务异常退出
首执行节点崩溃处理
REMOVE_HUNG_JOBS_FOR 参数
当首执行节点崩溃时,默认情况下 LSF 会将作业标记为 UNKNOWN 状态。通过 REMOVE_HUNG_JOBS_FOR 参数可以自动移除挂起的作业:
1
REMOVE_HUNG_JOBS_FOR = runlimit:host_unavail
支持的条件关键字:
runlimit- 作业运行超时host_unavail- 主机不可用
心跳与超时配置
| 参数 | 说明 | 默认值 |
|---|---|---|
DJOB_HB_INTERVAL |
心跳消息发送间隔 | 120秒/1000节点 |
DJOB_RU_INTERVAL |
资源使用报告间隔 | 300秒/1000节点 |
LSF_RES_ALIVE_TIMEOUT |
心跳响应超时时间 | 60秒 |
使用 Linux cgroups 实施内存限制
Linux 控制组(cgroups)可以限制、统计和隔离进程组的资源使用。
配置步骤
- 检查 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 子系统(在
/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
- 提交带内存限制的作业:
1
$ bsub -M 100 -v 50 my_program
当作业进程使用的内存超过限制时,Linux cgroup 内存子系统会立即终止该作业。
作业目录管理
LSF 使用多种目录类型来支持作业执行:
作业当前工作目录 (JOBCWD)
默认使用提交目录,可通过 -cwd 选项指定:
1
2
3
4
5
6
7
# 使用默认提交目录
$ bsub -I pwd
/home/user1
# 指定自定义工作目录
$ bsub -I -cwd "/pcc/cust_data" pwd
/pcc/cust_data
动态工作目录
支持使用动态模式创建作业目录:
1
2
3
# 使用作业ID和数组索引创建动态目录
$ bsub -I -cwd "/tmp/%J_%I" pwd
/tmp/324_0
作业缓冲目录 (JOB_SPOOL_DIR)
默认使用 $HOME/.lsbatch,建议配置专用目录:
1
2
# 在 lsb.params 中配置
JOB_SPOOL_DIR=/tmp/smc
验证配置:
1
2
$ bparams -a | grep JOB_SPOOL_DIR
JOB_SPOOL_DIR = /tmp/smc
提示:如果有 GPFS 等并行文件系统,建议将
JOB_SPOOL_DIR指向并行文件系统目录;也可以使用/tmp来减少 I/O 竞争。
SSH X11 转发
对于需要图形界面的作业,LSF 支持通过 SSH 进行安全的 X11 转发。
前置条件
- 所有 LSF 主机已安装 SSH
- 本地桌面已安装 X Server
- SSH X11 转发已正确配置
- 用户脚本中不要手动设置
DISPLAY环境变量
使用步骤
1
2
3
4
5
6
7
8
9
10
11
12
# 1. 设置本地 DISPLAY
export DISPLAY=:0.0
# 2. 使用 SSH 连接集群
ssh -Y username@remote_host
# 3. 设置 LSF 环境
source $LSF_ENVDIR/cshrc.lsf # for csh/tcsh
. $LSF_ENVDIR/profile.lsf # for sh/ksh/bash
# 4. 提交带 X11 转发的作业
bsub -XF myXapp
Python API 封装
LSF 提供了 Python 封装器,允许通过 Python 调用 LSF API。使用 SWIG(Simplified Wrapper and Interface Generator)工具实现 C API 与 Python 的接口对接。
开源项目地址:https://github.com/PlatformLSF/platform-python-lsf-api
作业依赖跟踪
使用作业依赖可以在提交时指定作业执行顺序。LSF 会保持这些作业,定期评估依赖条件,当条件满足时开始寻找资源。
使用 bjdepinfo 命令可以查看作业依赖关系的层级视图:
1
$ bjdepinfo <job_id>
其他最佳实践专题
IBM 官方文档还涵盖以下专题:
| 专题 | 描述 |
|---|---|
| 账户文件管理 | lsb.acct 文件的归档和清理策略 |
| 浮动许可证管理 | 在 rusage 表达式中管理软件许可证 |
| 高查询负载下维护集群性能 | 使用 badmin perfmon 和 diagnose 命令 |
| 计算单元与拓扑调度 | 使用 CU 特性考虑网络拓扑 |
| NVIDIA DGX 系统集成 | GPU 资源调度配置 |
| 外部主机资源定义 | 自定义调度资源 |
| 作业访问控制 | ACL 功能保护信息隐私 |
参考资料
- IBM Documentation - Best practices and tips for LSF
- IBM Documentation - Additional configuration settings
- IBM Documentation - Allocating CPUs as blocks for parallel jobs
- IBM Documentation - Cleaning up parallel job execution problems
- IBM Documentation - Enforcing job memory and swap with Linux cgroups
- IBM Documentation - LSF job directories
- IBM Documentation - Using ssh X11 forwarding