在 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 功能,需要:

  1. 启用 schmod_advrsv 模块

编辑 $LSF_ENVDIR/lsb.modules

1
schmod_advrsv
  1. 配置权限(可选)

如果要允许非管理员创建预留,在 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
  1. 重启 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:资源类型(如 memscratch、自定义资源)
  • 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 最佳实践

  1. 为 Closed Reservation 预留额外时间缓冲,避免作业被突然终止
  2. 使用 Open Reservation 处理运行时间不确定的作业
  3. 定期审查和清理不再使用的循环预留
  4. 为重要预留设置邮件通知
  5. 记录预留的使用率,优化资源规划

[!TIP] rusage 最佳实践

  1. 始终为内存密集型作业设置 rusage[mem=X]-M 参数
  2. 为 License 密集型作业设置合理的 duration,避免无限期锁定调度
  3. 定期分析作业实际资源使用,调整 rusage 值
  4. 在队列级别设置默认 rusage,简化用户操作
  5. 使用 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 资源预留的概念,减少生产环境中的配置错误和资源浪费!

参考资料

  1. IBM Spectrum LSF 10.1.0 - Advance Reservation
  2. IBM Spectrum LSF 10.1.0 - Resource Requirements
  3. LSF Command Reference - brsvadd
  4. LSF Configuration Files - lsb.resources