在 IBM Spectrum LSF 的日常使用中,”资源预留”(Resource Reservation)是一个经常被提及但也容易被混淆的概念。同事们常常将两种完全不同的机制混为一谈:Advance Reservation(提前预留) 和 rusage 资源预留(作业级资源预留)。本文将详细解析这两种机制的区别、使用场景和最佳实践。
核心概念对比
在深入探讨之前,让我们先明确这两种资源预留机制的本质区别:
| 特性 | Advance Reservation | rusage 资源预留 |
|---|---|---|
| 用途 | 为特定用户/组预留时间窗口内的资源 | 防止作业调度时的资源超额承诺 |
| 操作主体 | 管理员或授权用户 | 提交作业的用户 |
| 生效时间 | 指定的时间窗口 | 作业等待调度期间 |
| 主要命令 | brsvadd, brsvs, brsvdel |
bsub -R "rusage[...]" |
| 典型场景 | 重要项目专用资源、维护窗口 | 大内存作业、License 管理 |
Advance Reservation(提前预留)详解
什么是 Advance Reservation?
Advance Reservation 允许管理员或授权用户提前预留集群中的特定资源(主机或 slot),在指定的时间窗口内专供特定用户或用户组使用。这类似于会议室预订系统。
关键命令
1. 创建预留:brsvadd
1
2
3
4
5
# 为用户 john 预留 10 个 slot,从明天上午 9 点到下午 5 点
brsvadd -n 10 -u john -b "2026-01-23 09:00" -e "2026-01-23 17:00" my_reservation
# 预留特定主机 host01 和 host02,给项目组 proj_team
brsvadd -m "host01 host02" -u "proj_team" -b "2026-01-25 00:00" -e "2026-01-26 00:00" urgent_project
关键参数说明:
-n: 预留的 slot 数量(基于 slot)-m: 预留的具体主机列表(基于 host)-u: 有权使用此预留的用户或用户组-b: 预留开始时间(begin time)-e: 预留结束时间(end time)
2. 查询预留:brsvs
1
2
3
4
5
# 查看所有预留
brsvs
# 查看特定预留的详细信息
brsvs -l my_reservation
典型输出:
1
2
RSVID USER/GROUP NCPUS TIME_WINDOW STATUS
my_reserva john 10/10 Jan 23 09:00 - 17:00 ACTIVE
3. 删除预留:brsvdel
1
2
# 删除预留
brsvdel my_reservation
4. 修改预留:brsvmod
1
2
3
4
5
# 添加更多用户到现有预留
brsvmod -uadd alice my_reservation
# 延长预留时间
brsvmod -e "2026-01-23 19:00" my_reservation
使用预留提交作业
创建预留后,用户需要显式指定使用该预留:
1
2
# 使用 -U 参数指定预留 ID
bsub -U my_reservation -q normal ./run_simulation.sh
[!WARNING] 重要提醒:作业不会自动分配到预留!即使用户有权限使用某个预留,也必须通过
-U参数明确指定。
预留类型与行为
Closed vs. Open 预留
- Closed Reservation(默认):当预留时间窗口结束时,LSF 会自动终止在该预留中运行的所有作业
- Open Reservation:预留时间结束后,作业会继续作为普通作业运行
1
2
# 创建 Open 预留
brsvadd -o -n 10 -u john -b "2026-01-23 09:00" -e "2026-01-23 17:00" flexible_rsv
One-time vs. Recurring 预留
- One-time:仅在指定的时间窗口生效一次
- Recurring:定期重复的预留(如每天、每周)
1
2
# 创建每日 2 小时的维护窗口
brsvadd -R "FREQ=DAILY;DTSTART=20260123T020000" -d 120 maintenance_window
System Reservation(系统预留)
系统预留通常用于维护窗口,在预留期间不允许任何其他作业使用这些资源:
1
2
# 创建系统维护预留
brsvadd -s -m "host01 host02" -b "2026-01-25 02:00" -e "2026-01-25 06:00" system_maintenance
配置要求
要启用 Advance Reservation 功能,需要:
- 启用
schmod_advrsv模块
编辑 $LSF_ENVDIR/lsb.modules:
1
schmod_advrsv
- 配置权限(可选)
如果要允许非管理员创建预留,在 lsb.resources 中配置:
1
2
3
4
5
Begin ResourceReservation
USER_NAME GROUP_NAME MAX_RSVS MAX_JOBS
john - 5 100
- proj_team 10 500
End ResourceReservation
- 重启 mbatchd
1
badmin mbdrestart
rusage 资源预留(作业级资源预留)详解
什么是 rusage?
rusage(Resource Usage)是作业提交时指定的资源需求参数,用于告诉 LSF 调度器该作业需要多少资源。LSF 使用这些信息来避免资源超额承诺(overcommitment)。
核心机制
当一个大作业在等待某些资源时,LSF 可以”保留”已经可用的部分资源,防止小作业”偷走”这些资源:
1
2
3
4
场景:host01 有 64GB 内存
- 作业 A 需要 64GB,但当前只有 40GB 可用
- 如果不使用 rusage 预留,10 个小作业(每个 4GB)可能会占用这 40GB
- 使用 rusage 预留后,LSF 会"保留"这 40GB 给作业 A,等待剩余 24GB 释放
基本语法
1
bsub -R "rusage[resource_name=value:duration=time]" command
参数说明:
resource_name:资源类型(如mem、scratch、自定义资源)value:需要的资源量duration:保留时长(分钟),可选
实用示例
1. 内存预留
1
2
3
4
5
# 预留 64GB 内存
bsub -R "rusage[mem=64000]" -M 64000000 ./large_memory_job.sh
# 预留 32GB 内存,保留 60 分钟
bsub -R "rusage[mem=32000:duration=60]" -M 32000000 ./data_analysis.py
[!TIP] 最佳实践:同时使用
-R "rusage[mem=X]"和-M参数:
rusage[mem=X]:告诉调度器预留资源-M:设置作业的内存限制(防止超用)
2. License 预留
1
2
3
4
5
# 预留 5 个 Synopsys VCS license
bsub -R "rusage[vcs_lic=5]" ./run_vcs.sh
# 同时预留 license 和内存
bsub -R "rusage[vcs_lic=2,mem=16000]" ./simulation.sh
3. 临时存储预留
1
2
# 预留 100GB 的临时存储空间
bsub -R "rusage[scratch=100000]" ./generate_temp_data.sh
4. 自定义资源预留
假设你在 lsf.shared 中定义了自定义资源 gpu_mem:
1
2
# 预留 16GB GPU 内存
bsub -R "select[gpu] rusage[gpu_mem=16000]" ./gpu_training.py
duration 参数的作用
duration 参数指定 LSF 应该保留资源的时长。如果在这个时间内无法满足所有资源需求,LSF 可能会释放已保留的资源以供其他作业使用。
1
2
3
4
5
# 保留 10 分钟,如果 10 分钟内凑不齐资源就放弃
bsub -R "rusage[mem=128000:duration=10]" ./quick_analysis.sh
# 不设置 duration,LSF 会一直保留直到资源满足
bsub -R "rusage[mem=128000]" ./important_job.sh
两种机制的对比与选择
使用 Advance Reservation 的场景
✅ 适合的场景:
- 重要项目需要在特定时间独占资源
- 计划中的系统维护窗口
- 为付费客户提供 SLA 保证的资源
- 定期的大规模并行任务(如每周回归测试)
❌ 不适合的场景:
- 临时提交的普通作业
- 资源需求不确定的探索性任务
- 需要灵活调度的日常工作负载
示例:月度大型回归测试
1
2
3
4
5
6
# 每月 1 号为回归测试预留 100 个 slot
brsvadd -R "FREQ=MONTHLY;BYMONTHDAY=1" -n 100 \
-u regression_team \
-b "2026-02-01 00:00" \
-d 1440 \
monthly_regression
使用 rusage 的场景
✅ 适合的场景:
- 大内存作业(避免被小作业”饿死”)
- License 受限的作业(确保 license 可用时作业能立即运行)
- 需要大量临时存储的作业
- 任何对资源有明确需求的作业
❌ 不适合的场景:
- 资源需求极小且灵活的作业
- 对调度时间不敏感的后台任务
示例:大内存数据分析
1
2
3
4
# 分析作业需要 256GB 内存和 10 个 license
bsub -R "rusage[mem=256000:duration=30,matlab_lic=10]" \
-M 256000000 \
./big_data_analysis.m
常见混淆点澄清
误解 1:”设置了 rusage,资源就会被保留给我的作业”
真相:rusage 只在作业已经处于 PEND 状态且部分资源可用时才会”预留”资源。它不会提前锁定资源。
误解 2:”我有 Advance Reservation,所以不需要指定 -U”
真相:必须用 -U reservation_id 显式指定,否则作业会作为普通作业调度。
误解 3:”Closed Reservation 会在时间到了后暂停作业”
真相:Closed Reservation 会终止(kill)作业,不是暂停。如果需要作业继续运行,使用 Open Reservation(-o 参数)。
误解 4:”rusage[mem=X] 就会限制作业的内存使用”
真相:rusage 只影响调度决策,不强制限制。要限制内存,还需要使用 -M 参数或 cgroup。
实战组合技巧
技巧 1:Advance Reservation + rusage
在预留的时间窗口内提交需要大资源的作业:
1
2
3
4
5
# 在预留中提交大内存作业
bsub -U critical_project \
-R "rusage[mem=128000]" \
-M 128000000 \
./critical_simulation.sh
技巧 2:定期预留 + 自动化脚本
为定期任务创建周期性预留,并配合 cron 自动提交:
1
2
3
4
5
6
7
8
# 创建每天凌晨 2-4 点的维护窗口
brsvadd -R "FREQ=DAILY;DTSTART=20260123T020000" \
-d 120 \
-u maintenance_user \
daily_backup
# crontab 配置
0 2 * * * source /path/to/lsf/conf/profile.lsf; bsub -U daily_backup ./backup.sh
技巧 3:License 感知调度
结合 License Scheduler 和 rusage:
1
2
3
4
# 只在有足够 license 时才调度作业
bsub -R "rusage[vcs=5]" \
-Lp vcs_project \
./run_vcs_sim.sh
配置文件示例
lsf.shared 中定义资源
1
2
3
4
5
6
7
Begin Resource
RESOURCENAME TYPE INTERVAL INCREASING DESCRIPTION
mem Numeric 60 Y Memory in MB
scratch Numeric 60 Y Scratch space in MB
vcs_lic Numeric 10 N VCS license tokens
gpu_mem Numeric 30 Y GPU memory in MB
End Resource
lsb.queues 中配置队列 rusage 限制
1
2
3
4
5
6
7
Begin Queue
QUEUE_NAME = bigmem
PRIORITY = 50
DESCRIPTION = Queue for large memory jobs
RES_REQ = rusage[mem>64000] # 要求至少 64GB
MEMLIMIT = 512000 # 最大 512GB
End Queue
监控与调试
查看 Reservation 状态
1
2
3
4
5
6
7
8
# 查看所有预留
brsvs
# 查看预留的详细信息
brsvs -l reservation_id
# 查看在预留中运行的作业
bjobs -U reservation_id
调试 rusage 问题
1
2
3
4
5
6
7
8
# 查看作业为什么 PEND
bjobs -p job_id
# 查看集群资源可用性
lsload -R "rusage[mem=64000]"
# 查看主机的资源配置
lsload -l host01
典型 PEND 原因:
1
2
3
PEND REASONS:
Not enough slots to meet resource requirement (rusage[mem=64000])
Resource requirement not satisfied: 3 hosts
最佳实践建议
[!TIP] Advance Reservation 最佳实践
- 为 Closed Reservation 预留额外时间缓冲,避免作业被突然终止
- 使用 Open Reservation 处理运行时间不确定的作业
- 定期审查和清理不再使用的循环预留
- 为重要预留设置邮件通知
- 记录预留的使用率,优化资源规划
[!TIP] rusage 最佳实践
- 始终为内存密集型作业设置
rusage[mem=X]和-M参数- 为 License 密集型作业设置合理的
duration,避免无限期锁定调度- 定期分析作业实际资源使用,调整 rusage 值
- 在队列级别设置默认 rusage,简化用户操作
- 使用
bhist -l分析历史作业的资源使用情况
[!WARNING] 常见陷阱
- ❌ 创建 Closed Reservation 后忘记告知用户时间限制
- ❌ rusage 设置过大导致作业永远无法调度
- ❌ 忘记在 bsub 中使用
-U参数导致预留资源闲置- ❌ duration 设置过短导致 rusage 预留频繁失效
- ❌ 只使用
-M不使用rusage[mem=X],调度器无法正确规划
配置检查清单
在启用资源预留功能前,确认以下项:
1
2
3
4
5
6
7
8
☐ 启用了 schmod_advrsv 模块(仅 Advance Reservation)
☐ 在 lsf.shared 中定义了所需的资源类型
☐ 配置了 ResourceReservation 权限(如果需要非管理员创建预留)
☐ 测试了 Reservation 的创建、查询、删除流程
☐ 验证了 rusage 参数对调度的影响
☐ 设置了监控和告警(如预留即将到期)
☐ 培训了用户如何使用 -U 参数
☐ 文档化了团队的资源预留策略
总结
LSF 的两种资源预留机制服务于不同的目的:
- Advance Reservation:管理层面的时间维度资源规划,适合已知的、重要的、定期的工作负载
- rusage:调度层面的资源维度优化,适合所有对资源有明确需求的作业
理解并正确使用这两种机制,可以显著提升集群的资源利用率和用户满意度。关键是根据实际场景选择合适的工具:
| 你的需求 | 推荐方案 |
|---|---|
| 为重要项目独占资源 | Advance Reservation |
| 系统维护窗口 | System Reservation |
| 大内存作业避免饥饿 | rusage[mem=X] |
| License 密集型作业 | rusage[license=X] + License Scheduler |
| 定期回归测试 | Recurring Reservation + cron |
| 临时大规模任务 | One-time Reservation |
| 日常作业优化 | rusage + 队列级配置 |
希望本文能帮助你理清 LSF 资源预留的概念,减少生产环境中的配置错误和资源浪费!