OpenLava 完全入门(二):作业提交与管理全解
OpenLava 完全入门(二):作业提交与管理全解
摘要:掌握作业管理是使用 OpenLava 的核心。本文系统讲解 bsub、bjobs、bkill、bstop/bresume、bpeek、bmod、bhist 等常用命令,覆盖作业提交、查询、控制、查看历史完整生命周期,并结合大量生产场景示例。读完你能自如地提交、监控和调试各种作业。
上一篇我们搭好了 OpenLava 集群并跑通了第一个 sleep 作业。这一篇系统讲解作业管理。
零、读前必看
0.1 适合谁
- ✅ 已经有一套可用的 OpenLava 集群
- ✅ 想系统掌握作业管理命令
- ✅ 从 LSF 迁移过来,想找命令对照
0.2 你需要知道的
| 命令 | 作用 | 级别 |
|---|---|---|
| bsub | 提交作业 | 🔥🔥🔥 必会 |
| bjobs | 查看作业 | 🔥🔥🔥 必会 |
| bkill | 杀掉作业 | 🔥🔥🔥 必会 |
| bstop / bresume | 挂起 / 恢复 | 🔥🔥 常用 |
| bpeek | 实时看输出 | 🔥🔥 常用 |
| bmod | 修改作业参数 | 🔥🔥 常用 |
| bhist | 历史记录 | 🔥🔥 常用 |
| bbot / btop | 调整优先级 | 🔥 偶尔用 |
一、bsub:提交作业
1.1 最简形式
# 提交一个命令
bsub sleep 100
# Job <1001> is submitted to default queue <normal>.
# 提交一个脚本
bsub < my_job.sh
# 注意用重定向,脚本里可以写 #BSUB 指令
**两种提交方式区别**:`bsub command` 直接传命令,`bsub < script.sh` 读脚本(脚本里可以用 `#BSUB` 写参数)。生产环境推荐第二种,可追溯。
1.2 常用参数
bsub \
-q normal # 队列名
-n 4 # 需要的 CPU 核数(slot 数)
-R "rusage[mem=4096]" # 资源需求(每核 4G 内存)
-J my_job_name # 作业名
-o output.log # 标准输出文件
-e error.log # 标准错误文件
-W 2:00 # 运行时间上限(小时:分钟)
-u user@example.com # 邮件通知
-N # 作业完成发邮件
-w "done(1001)" # 依赖条件(等 1001 完成)
-P projectA # 项目组
-m "compute01 compute02" # 指定运行节点
sleep 100
每个参数用一张表说清楚:
| 参数 | 含义 | 示例 |
|---|---|---|
-q |
队列 | -q normal |
-n |
申请的 CPU 槽位数 | -n 8 |
-R |
资源需求(后面细讲) | -R "rusage[mem=8192]" |
-J |
作业名 | -J build_kernel |
-o |
stdout 输出文件 | -o build.out |
-e |
stderr 输出文件 | -e build.err |
-oo |
输出文件(追加) | -oo build.log |
-W |
运行时长上限 | -W 1:30(1小时30分) |
-cwd |
工作目录 | -cwd /data/build |
-w |
依赖条件 | -w "done(1001)" |
-m |
指定主机 | -m "compute01 compute02" |
-u |
通知邮箱 | -u ops@example.com |
-N |
完成发邮件 | -N |
-P |
项目归属 | -P chipA |
1.3 脚本里写 #BSUB 指令
推荐写法:把参数写进脚本,方便版本管理。
#!/bin/bash
#BSUB -q normal
#BSUB -n 4
#BSUB -R "rusage[mem=4096]"
#BSUB -J compile_job
#BSUB -o compile.out
#BSUB -e compile.err
#BSUB -W 2:00
echo "开始编译..."
cd /data/src
make -j4
echo "编译完成"
提交:
bsub < job.sh
1.4 交互式作业
有时需要登录到计算节点上调试(比如程序跑起来报奇怪的错):
# 申请一个交互式 shell
bsub -Is /bin/bash
# 系统会分配一个节点,你直接进入该节点的 shell
# 带参数的交互式
bsub -Is -n 2 -R "rusage[mem=2048]" /bin/bash
**调试神器**:程序在节点上跑才报错、本地复现不了时,用 `bsub -Is` 直接进节点排查。
二、bjobs:查看作业
2.1 基本用法
# 查看自己所有作业
bjobs
# JOBID USER STAT QUEUE FROM_HOST EXEC_HOST JOB_NAME SUBMIT_TIME
# 1001 lsf RUN normal master compute01 sleep 100 Jan 15 10:00
# 1002 lsf PEND normal master - sleep 200 Jan 15 10:01
# 查看指定作业
bjobs 1001
# 查看所有用户的作业(管理员)
bjobs -u all
2.2 常用过滤参数
# 按状态过滤
bjobs -r # 只看 RUN 状态
bjobs -p # 只看 PEND 状态
bjobs -s # 只看 SUSP 状态
bjobs -d # 只看最近完成的(DONE/EXIT)
# 按用户
bjobs -u user1
bjobs -u all # 所有用户
bjobs -u all -q high # 所有用户 + high 队列
# 按队列
bjobs -q normal
# 按作业名
bjobs -J "build*" # 通配符匹配
# 详细模式
bjobs -l 1001 # 长格式,显示所有细节
bjobs -w # 宽格式(不换行)
2.3 长格式详解
bjobs -l 1001
输出的关键字段:
| 字段 | 含义 |
|---|---|
Job <1001> |
作业 ID |
User |
提交用户 |
Project |
项目 |
Queue |
队列 |
Command |
执行命令 |
CWD <...> |
工作目录 |
PIDs |
进程 ID |
Execution Home |
执行节点家目录 |
Submitted from host |
从哪台机器提交的 |
Started at |
开始时间 |
Run time |
已运行时长 |
Cpu time |
累计 CPU 时间 |
MEM: |
当前内存使用 |
2.4 看 PEND 原因
bjobs -p 1002
# Job <1002>, User <lsf>, Project <default>, Status <PEND>
# Waiting for scheduling: ...
# Job is waiting for the following resources:
# 1 host with ncpus>=4 and mem>=8196
常见 PEND 原因:
| 原因 | 说明 |
|---|---|
Not enough job slots |
节点槽位跑满了 |
No eligible host |
没有满足资源要求的节点 |
Queue job limit |
队列上限到了 |
User job limit |
用户作业上限到了 |
Pending for dependency |
等依赖作业完成 |
三、bkill:杀掉作业
3.1 基本用法
# 杀掉单个作业
bkill 1001
# Job <1001> is being terminated
# 杀掉多个
bkill 1001 1002 1003
# 按作业名杀
bkill -J "build_*"
# 杀掉用户所有作业
bkill -u user1 0
# 0 表示所有作业
# 强制杀(杀不掉时用 -r,发 SIGKILL)
bkill -r 1001
**杀不掉的作业**:先试 `bkill`(发 SIGTERM,给进程清理时间),还不行再用 `bkill -r`(发 SIGKILL,强制结束)。
3.2 管理员操作
# 杀掉队列里所有作业
bkill -q normal 0
# 杀掉某节点上所有作业
bkill -m compute01 0
四、bstop / bresume:挂起与恢复
4.1 用户操作自己的作业
# 挂起(暂停)一个作业
bstop 1001
# Job <1001> is being stopped
# 恢复
bresume 1001
# Job <1001> is being resumed
4.2 什么时候用挂起
- 节点负载太高,先暂停一些低优先级作业腾资源
- 调试其他问题,不想让作业占着资源又不想杀掉(杀了重跑浪费时间)
- 管理员临时抢占资源
4.3 三种挂起状态区别
| 状态 | 含义 | 触发方式 |
|---|---|---|
| PSUSP | 用户挂起 | bstop(用户自己挂的) |
| USUSP | 系统挂起(用户级) | 管理员挂起 |
| SSUSP | 调度器挂起 | 调度器自动挂起(资源不足被抢占) |
恢复都用 bresume。
五、bpeek:实时看输出
作业正在跑,想知道跑到哪了:
# 看作业 stdout
bpeek 1001
# 显示作业到目前为止的 stdout 输出
# 持续跟踪(类似 tail -f)
bpeek -f 1001
# 看 stderr
bpeek -c 1001 # 不一定都支持,看版本
**调试图神器**:跑时间长的任务,用 `bpeek -f` 盯着看进度,不用等跑完。
六、bmod:修改作业参数
作业已经提交了,发现参数写错了,不想杀掉重跑——用 bmod 改。
6.1 常见修改
# 修改作业名
bmod -J new_name 1001
# 修改队列(PEND 状态的作业可以改队列)
bmod -q high 1001
# 修改运行时限
bmod -W 3:00 1001 # 改成 3 小时上限
# 修改资源需求
bmod -R "rusage[mem=8192]" 1001
# 修改输出文件
bmod -o new_output.log 1001
# 修改通知邮箱
bmod -u new@example.com 1001
6.2 什么能改什么不能改
| 可以改(PEND 状态) | 可以改(RUN 状态) | 不能改 |
|---|---|---|
作业名 -J |
作业名 -J |
提交命令 |
队列 -q |
运行时限 -W(只能延长,不能缩短) |
-n 核数 |
资源需求 -R |
输出文件 -o |
执行节点 |
运行时限 -W |
通知邮箱 -u |
-m 指定节点 |
输出文件 -o |
||
依赖 -w |
**注意**:RUN 状态的作业很多参数改不了,能改的也有限制(比如运行时限只能加不能减)。
七、bhist:查看历史
7.1 基本用法
# 看最近完成的作业
bhist 1001
# Job <1001>, User <lsf>, Project <default>, Command <sleep 100>
# Tue Jan 15 10:00:00: Submitted from host <master>, CWD <...>
# Tue Jan 15 10:00:01: Dispatched to 1 Hosts/Processors <compute01>
# Tue Jan 15 10:01:40: Done successfully.
#
# Summary of time in seconds spent in various states:
# JOBID USER JOB_NAME PEND PSUSP RUN USUSP SSUSP TOTAL
# 1001 lsf sleep 100 1 0 100 0 0 101
7.2 常用参数
# 指定时间范围
bhist -b "2024:01:01:00:00" -e "2024:01:31:23:59" -u all
# 看最近 N 天
bhist -n 7 -u user1 # 最近 7 天
# 长格式(所有细节)
bhist -l 1001
# 看失败的作业
bhist -d -u user1 # -d 显示最近完成的,然后 grep EXIT
7.3 结合 bacct 看统计
# 看用户作业统计
bacct -u user1 -b "2024:01:01" -e "2024:01:31"
# 输出:提交数、完成数、失败数、总 CPU 时间等
八、其他常用命令
8.1 btop / bbot:调整排队顺序
# 把某个 PEND 作业移到最前面
btop 1002
# Job <1002> has been moved to top of queue
# 移到最后面
bbot 1002
管理员可以调整其他用户的,用户只能调自己的。
8.2 bjobs -sum:统计
bjobs -sum -u all
# 按用户统计各状态作业数
8.3 bchkpnt / brestart:检查点
# 给作业做检查点(需要应用支持 checkpoint)
bchkpnt 1001
# 从检查点恢复
brestart 1001
这个需要应用支持 BLCR 或应用自身的 checkpoint 机制,EDA 工具很多支持。
九、生产场景示例
场景 1:批量提交 100 个任务
for i in $(seq 1 100); do
bsub -J "task_$i" -o "task_$i.out" "echo task $i; sleep 10"
done
# 查看全部
bjobs -J "task_*"
场景 2:跑一个大作业,完成发邮件
bsub -q normal -n 8 -R "rusage[mem=8192]" \
-J big_simulation \
-o sim.out -e sim.err \
-N -u engineer@example.com \
"./run_simulation.sh input_$i.dat"
场景 3:交互式调试
# 本地跑正常,集群上跑就崩 → 进节点调试
bsub -Is -n 2 -R "rusage[mem=4096]" -m compute01 /bin/bash
# 进去后手动跑命令,看报错
场景 4:批量杀失败的作业
# 杀掉所有 EXIT 状态的自己的作业
bkill $(bjobs -d | grep EXIT | awk '{print $1}')
场景 5:看昨天谁用的 CPU 最多
bacct -u all -b "2024:01:14:00:00" -e "2024:01:14:23:59" | sort -k1
十、速查表
一张表记住所有常用命令:
| 操作 | 命令 |
|---|---|
| 提交作业 | bsub command 或 bsub < script.sh |
| 看自己的作业 | bjobs |
| 看所有作业 | bjobs -u all |
| 看 PEND 原因 | bjobs -p |
| 看详细信息 | bjobs -l |
| 杀作业 | bkill |
| 强制杀 | bkill -r |
| 挂起 | bstop |
| 恢复 | bresume |
| 看实时输出 | bpeek -f |
| 改参数 | bmod -J new_name |
| 看历史 | bhist |
| 提到队首 | btop |
| 扔到队尾 | bbot |
十一、写在最后
作业管理是 OpenLava 最常用的功能。日常开发用 bsub / bjobs / bkill 三件套基本够了,做运维再加上 bmod / bhist / btop 这些。
下一篇我们讲队列与资源管理:怎么配置队列、怎么定义和使用自定义资源(GPU、license 等)、资源限制、优先级策略。学完你就能根据业务需求灵活规划集群了。
你最喜欢用哪个命令?最常用的参数是什么? 评论区聊聊。
OpenLava #LSF #作业调度 #bsub #bjobs #HPC #运维
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。







