概述

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)可以限制、统计和隔离进程组的资源使用。

配置步骤

  1. 检查 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
  1. 挂载 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. 提交带内存限制的作业
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 功能保护信息隐私

参考资料

  1. IBM Documentation - Best practices and tips for LSF
  2. IBM Documentation - Additional configuration settings
  3. IBM Documentation - Allocating CPUs as blocks for parallel jobs
  4. IBM Documentation - Cleaning up parallel job execution problems
  5. IBM Documentation - Enforcing job memory and swap with Linux cgroups
  6. IBM Documentation - LSF job directories
  7. IBM Documentation - Using ssh X11 forwarding