☰
OpenLava 4.0开源作业调度器部署与集群管理实战指南
2026/10/17 3:09:01 网站建设 项目流程

简介:OpenLava 4.0 是一套源自 LSF 体系的开源集群管理与作业调度源码包,可看作 IBM LSF 的前身与简化实现,完整提供了作业调度与资源管理的核心机制。对于运维工程师、系统管理员以及希望理解调度系统中任务分发、队列控制、资源分配等底层逻辑的学习者,这都是一份难得且值得反复钻研的重要参考资料。压缩包共 501 个文件,以 C 源文件和头文件为核心,同时包含 configure 配置脚本、automake 模板、MPI 启动包装脚本、若干命令兼容脚本,以及覆盖作业提交与查询、队列查看、负载监控等主题的 man 手册页;整体体积仅 1.65MB,目录遵循 GNU 构建布局,非常适合本地编译、单步调试和二次开发。研读这套源码,可以梳理作业提交、队列管理、资源监控、负载采集等模块的代码组织,理解调度器如何通过优先级、配额和状态感知来协调多台计算节点,也能通过配套手册对照学习常用命令的输出结果,为掌握 IBM LSF 或自研调度工具打下坚实基础。由于 OpenLava 官方已不再维护,这份源码保留了早期调度系统的完整实现,既可作为高校集群课程的实验样例,也可作为评测自身调度逻辑的对照参考;目前已有 1603 人学习下载,是集群调度领域颇具参考价值的开源教学案例。

1. OpenLava 4.0 是什么:开源调度器选型里的一个实在选项

做集群管理的同事对“作业调度器”这个词多半不陌生:几十台服务器摆在一起,谁有 CPU、内存,任务往哪台机器上放,不能靠人去数,得有一个调度器来统一排队和分派。OpenLava 4.0 就是一个能直接落地的开源实现,它延续了商业调度器的命令行接口,bsub、bqueues、bhosts 这些命令用起来几乎不用学第二遍,底层是 BSD 风格的集群调度逻辑,适合已经有批量作业要跑、又不打算在许可证上花钱的团队。

这套源码包的价值在于,它把调度器拆成了你可以主动控制的部分:从编译安装、配置文件到多节点共享部署,每一步都是公开代码和文本配置,不再是黑匣子。对 Linux 管理员、HPC 入门用户以及维护工具链的开发来说,用它验证调度策略、批量提交作业、做资源打标,比直接上商业套件更直观。我主要会按“编译—配置—多节点—避坑—进阶标签调度”的顺序来拆,照着做能省掉不少试错时间。

2. 从源码包到可运行服务:OpenLava 4.0 的编译与单机部署

2.1 为什么拿源码包自己编,而不是直接找现成 rpm

OpenLava 没有进入 RHEL、Ubuntu 的官方软件源,能搜到的第三方 rpm 包版本经常滞后,有些还对发布渠道进行了二次裁剪,少了 init 脚本或某些管理命令。源码包则是完整的一棵源码树,编译参数自己说了算。更重要的是,在离线内网环境或者等保要求严格的机房,审计源码再编译比偷偷装第三方二进制更让人放心。

另一个实际原因是,调度器要跟内核版本、cgroup 配置、网卡名称这些东西耦合。发行版自带的预编译包往往固定了默认路径,一旦你的环境把用户目录挂载在 /data 下,配置文件就得跟着改路径。源码包方式下,所有脚本和配置文件都由你自己落盘,出了毛病更容易定位。我一般建议测试环境也用源码包,先在一台机器上跑通,再复制到计算节点。

2.2 编译环境准备:四个依赖和对应安装命令

OpenLava 4.0 是 C 语言写的,编译需要经典的编译器链,另外还要几个开发头文件包。不同发行版名称略有差异,但依赖类型基本一致。

依赖包作用缺失时的典型报错
gcc / gcc-c++编译 C/C++ 源码gcc: command not found
make解析 Makefile、执行编译make: command not found
ncurses-devel终端交互界面库curses.h: No such file or directory
libselinux-develSELinux 策略接口security/selinux.h找不到
libtirpc-develRPC 通信,跨节点消息传递rpc/rpc.h不存在

在 CentOS/RHEL 系的机器上,我一般先执行这么一行:

sudo yum install -y gcc gcc-c++ make ncurses-devel libselinux-devel libtirpc-devel

每条依赖都有明确指向:gcc 和 make 负责把源码变成可执行文件;ncurses 负责 bqueues、bhosts 这类命令的交互列表渲染,缺了它编译到 libcurses 相关代码时必然报头文件缺失;libselinux 是应对强制访问控制环境的,部分国产化系统或加固过的服务器特别容易缺这一项;libtirpc 处理调度器节点间的远程过程调用,多节点通信全靠它。

Ubuntu 系则换成apt-get install -y build-essential libncurses-dev libselinux1-dev libtirpc-dev。我踩过的最坑情况是编译到 60% 报rpc/rpc.h不存在,此时已经花费了十几分钟编译时间,所以建议在 configure 之前就把四个依赖一次性装全。

2.3 configure、make 与安装落盘:我推荐的 prefix 与权限选择

进入源码目录后,标准的“三板斧”是 configure、make、make install。整个流程中,唯一必须想清楚的是安装前缀,我统一用/opt/openlava,理由在后面会体现:调度器的配置目录、日志目录、二进制目录都保持在同一个前缀下面,排查问题时不用来回切换路径。

# 解包源码包,解到 /usr/local/src 下,方便后边清理 sudo tar zxf openlava-4.0.tar.gz -C /usr/local/src cd /usr/local/src/openlava-4.0 # 生成 Makefile,指定安装根目录 ./configure --prefix=/opt/openlava # 并行编译,按 CPU 核数拉起编译任务 make -j "$(nproc)" # 安装到 /opt/openlava sudo make install

--prefix=/opt/openlava决定后续所有文件落盘位置,可执行文件在/opt/openlava/bin,管理端命令在/opt/openlava/sbin,配置模板在/opt/openlava/etc。这里没有把 prefix 指到/usr/local,主要原因是调度器服务启动脚本里写死了相对路径,放在独立目录下可以做到“卸载即删目录”,不会污染系统文件。

make -j "$(nproc)"表示用机器全部核数并行编译。四核机器一般一两分钟能编完,如果内存比较小,比如 2G,建议改成make -j2,否则 gcc 进程可能因内存不足互相杀进程,编译报出不规则的Killed错误。

编译完成后,先检查关键命令是否可执行:

/opt/openlava/sbin/lsadmin -v /opt/openlava/bin/bsub -h | head -n 5

如果 lsadmin 能打印版本而 bsub 后边接任何参数都不识别,多半是动态库版本不对,用ldd /opt/openlava/bin/bsub查看链接情况,缺库就回到依赖安装那一步。

2.4 环境变量与会话脚本:没有这一步 bsub 会直接罢工

调度器命令在运行时会查找配置目录,这个路径由环境变量LSF_ENVDIR指定。没有它,直接执行bsub会报类似“Cannot find configuration file”的错误。环境变量的写入文件我推荐放在/etc/profile.d/下,而不是塞进某个用户的.bashrc,因为多用户环境里每个提交作业的用户都需要同样的变量。

sudo tee /etc/profile.d/openlava.sh > /dev/null <<'EOF' export LSF_ENVDIR=/opt/openlava/etc export LSF_SERVERDIR=/opt/openlava/sbin export LSF_BINDIR=/opt/openlava/bin export PATH=$LSF_BINDIR:$LSF_SERVERDIR:$PATH export MANPATH=/opt/openlava/man:$MANPATH EOF # 当前终端直接生效 source /etc/profile.d/openlava.sh

这里三个变量分工很清晰:LSF_ENVDIR是大脑,指向 lsb.hosts、lsf.conf 等文本配置;LSF_SERVERDIR给管理端命令用,lsadmin、badmin 都在这;LSF_BINDIR是用户端命令入口,bsub 系列全在这里。PATH 拼接顺序刻意把这两个目录放在系统目录之前,避免某些系统自带的同名命令抢先占用。

验证环境变量是否生效:执行which bsub,看到输出是/opt/openlava/bin/bsub就说明路径没问题。这一章节做完,单机版的框架已经立住了,下一章把配置表和调度参数讲透。

3. 配置调度器:主机分组、用户限制和队列参数一处说清

3.1 lsf.cluster.openlava 怎么定义节点

OpenLava 的集群拓扑核心文件是lsf.cluster.openlava,它定义了两类信息:集群由哪些主机组成、每台主机有多少计算资源。这个文件在/opt/openlava/etc/下,源码包安装好之后自带一份模板,但模板里的主机名是占位符,必须改成实际环境的名字。

# lsf.cluster.openlava 关键片段 LSF_CLUSTER_NAME="openlava" Begin Cluster HostName HPC_CPU HPC_GPU MAX_CPUS MAX_GPU RESOURCES master 16 0 16 0 any node01 16 0 16 0 any node02 16 0 16 0 any End Cluster Begin Host HOSTNAME model type server r1m RESOURCES master ServerR Linux + 3.5 (mg) node01 ServerR Linux + 3.5 (mg) node02 ServerR Linux + 3.5 (mg) End Host

Begin Cluster 段里的 MAX_CPUS 定义这台主机纳入调度计算的最大核数,注意它不等于物理核数。如果你想让某台机器保留一部分 CPU 给系统进程,可以把 MAX_CPUS 调低,调度器不会把超出 MAX_CPUS 的算力分配给作业。

Begin Host 段则是给调度器提供每台主机的“动态属性”:server 字段填+表示这台机器可以同时可以作为执行服务器;r1m 表示最近一分钟负载指数,调度器在计算资源可用性时参考这个数字;RESOURCES 里的(mg)是管理主机标记,带 mg 的机器通常是 master。

一个常见困惑是:修改 MAX_CPUS 之后,bhosts显示未变化。原因是集群文件只在 LIM 守护进程启动或lsadmin reconfig时重新加载,修改后必须执行之一,不是即时动态读取。所以这个文件的改动流程一定是“改文件 → 重载或重启 LIM → 验证”。

3.2 队列和用户限制写入 lsb.queues / lsb.users

批处理系统最核心的排队策略,在 OpenLava 里分别落到lsb.queues和lsb.users两个文件。队列定义了作业的默认优先级、并发数量和可运行主机范围,用户表则定义单个用户或用户组的提交上限。

# lsb.queues 片段 Begin Queue QUEUE_NAME=normal PRIORITY=50 NICE=0 MAX_JOBS=100 HOSTS=all End Queue Begin Queue QUEUE_NAME=high PRIORITY=80 MAX_JOBS=20 HOSTS=all End Queue

这里的数字处处有讲究。PRIORITY 决定多个队列同时有任务时谁先被调度,数值大的优先;MAX_JOBS 是该队列同时在跑和挂起的最大作业总数,如果业务方经常同时提一百多个并行批处理任务,100 就偏紧。NICE 会影响作业进程的 nice 值,对计算密集型任务一般填 0,保持默认优先级即可。

# lsb.users 片段 Begin User USER_GROUP=default DEFAULT_QUEUE=normal MAX_JOBS=50 PEND_JOB=10 End User Begin User USER_GROUP=hpc_group DEFAULT_QUEUE=high MAX_JOBS=200 PEND_JOB=50 End User

MAX_JOBS=50限制的是该组用户同时提交的作业总数,PEND_JOB=10限制挂起等待状态的任务数量,这两者要小心:挂起限制设小之后,业务方批量投任务,后边的任务直接报“No job slot available”,不一定是资源不够,而是用户级限制卡住了。

有个极容易被忽略的参数是 HOSTS。HOSTS=all表示该队列能跑在集群全部主机上;如果某个队列只面向特定计算分区,比如 GPU 机器,可以写HOSTS=gpu_host,但前提是主机组定义在lsb.hosts里。队列配到不存在的组名时,OpenLava 不会在启动时立刻报错,而是在任务提交后才拒绝执行,所以每次改完队列文件,顺手跑一条bqueues -l确认所有队列的状态不是“closed”很有必要。

3.3 启动服务并跑第一个 bsub 任务

配置填好后,启动调度器服务。OpenLava 的启动脚本位于源码包内,安装后已经复制到/opt/openlava/etc/init.d/下,单机上直接调用即可:

# 启动全部调度守护进程 sudo /opt/openlava/etc/init.d/openlava start # 用 lsid 确认集群配置加载成功 lsid # 检查 LIM(负载信息管理)是否就绪 lsadmin limready # 检查 Master 批处理守护进程状态 badmin mbdstatus

lsid输出中的集群名必须和lsf.cluster.openlava里的LSF_CLUSTER_NAME一致,出现不一致时,LIM 会拒绝启动,因为配置文件里的集群归属对不上。lsadmin limready返回 ready 说明主机的负载上报通道是通的,badmin mbdstatus则确认主调度守护进程在线。

守护进程全部就绪后,提交第一个测试作业:

# 用当前用户向 normal 队列提交一个睡眠任务 bsub -q normal -n 2 -J test_job sleep 300 # 查看作业状态 bjobs

-q normal指定队列;-n 2表示申请两个 CPU 核;-J test_job给作业起名字,方便后续 bjobs 时辨认。提交后 bjobs 会显示这个作业处于 PEND 或 RUN 状态。初次看到 PEND 不必慌张,调度周期是从 LIM 收集到资源信息开始的,几秒内变化才合理。

如果 bjobs 几十秒还停在 PEND,排除配置问题的最快办法是执行bqueues normal,查看该队列是否 pending 太多,以及lsadmin reslimit查看各活跃主机可分配的 CPU 数。

3.4 把验证命令串成一套健康检查

单机部署完成后,建议把这些命令串成一段五分钟的健康检查,而不是每次都手动敲一遍:

# 检查守护进程是否存在 ps -ef | grep -E 'lim|mbatchd|sbatchd' | grep -v grep # 查看所有主机的资源视图 bhosts -l # 查看已配置队列 bqueues -l # 查看最近完成作业的返回码 bacct -l

bhosts -l会列出每台机器的 CPU 数、load、status 等全套信息,状态列出现unavail时,基本可以断定 LIM 上报链路或本机 sbatchd 进程出了问题。bacct对排查“作业明明报告成功,业务方却说结果不对”这类问题很有用,它能看到作业的结束码。

健康检查的输出值得留成模板,每次变更配置前后各跑一次,前后对比能快速暴露改动引发的副作用。这也是我后来处理多节点问题时的固定套路。

4. 多节点集群的关键一步:共享安装、主机解析与服务发现

4.1 划分服务角色:master、计算节点、存储各管一摊

多节点部署之前,先划清角色:一台主节点跑 mbatchd、LIM、PIM,负责接收任务和决策;其余计算节点跑 sbatchd、LIM,负责上报自己的负载并执行作业。不要把主节点的角色和计算节点混在一起做“兼任”,虽然 OpenLava 支持 master 也跑任务,但生产环境里 master 越干净,调度决策越稳定。

存储角色往往是最晚被想到的。用户的程序和数据共享挂载,例如/home通过 NFS 统一挂载,保证作业在主节点提交、在计算节点上的可执行路径一致。我自己踩过一次数据路径不统一的坑:主节点把目录挂在/data/proj,计算节点挂载点写成了/data/proj2024,作业一跑到计算节点就说找不到文件,排查了大半天才发现。规划阶段就把挂载点固定下来,永远不要在一套集群里出现两套挂载路径。

4.2 三种部署方式:独立安装、本地 rsync、NFS 共享

OpenLava 的二进制目录分发到各计算节点,常见有三种方式,各有适用场景。

方式优点缺点适用场景
每台机器从源码包独立编译路径完全可控、不依赖后续网络每台都等编译时间,出错要逐台处理节点数量少或架构不完全一致
主节点作好目录后 rsync 推送一次编译多处使用、速度快rsync 过程中节点处于不一致状态10~100 个同构节点
NFS 挂载 /opt/openlava升级只需改主节点网络 IO 抖动时调度器命令卡顿,且日志和 spool 共享易冲突纯管理场景、少量交互

我一般用 rsync 推送方案,因为它兼顾了效率和独立性。编译一次,然后用下面这条命令把整个目录同步给计算节点:

# 同步 OpenLava 安装目录到 node01 sudo rsync -av --delete /opt/openlava/ root@node01:/opt/openlava/ # 在 node01 上启动服务 ssh node01 "sudo /opt/openlava/etc/init.d/openlava start" # 确认 node01 的守护进程已经起来 ssh node01 "/opt/openlava/sbin/lsadmin limready"

--delete参数很关键,它会让计算节点上多出来的旧文件被删掉,保证两边目录严格一致。但这个参数也是双刃剑:如果主节点正在写日志,rsync 会把更新中的日志同步过去,让计算节点的日志出现半截内容。我的习惯是先停掉计算节点上的 openlava 服务,再做 rsync,最后启动。

不要共享安装目录的同时共享日志目录log和状态目录spool。这两个目录在不同节点上有不同的 PID 和子进程状态,硬塞到 NFS 上会出现互踩锁文件的乱象。rsync 方式天然规避了这个问题,因为每台机器都有自己的本地 spool。

4.3 /etc/hosts 一致性:多节点最容易翻车的地方

多节点调度器通信靠主机名解析。OpenLava 守护进程之间会通过主机名找对方,如果 master 的 /etc/hosts 里 node01 解析成 192.168.1.11,而 node01 自己把主机名解析成了 127.0.0.1 或另一个地址,LIM 上报就会失败。这个问题的隐蔽之处在于,登录 node01 敲hostname看到的主机名没问题,但hostname -i返回的地址和 master 眼里不一致。

统一的解决思路是在每台机器上固定同样的 hosts 表:

# 每台节点执行,保持本机 IP 与主机名映射一致 sudo tee -a /etc/hosts <<'EOF' 192.168.1.10 master 192.168.1.11 node01 192.168.1.12 node02 EOF # 逐个节点验证解析是否一致 for h in master node01 node02; do echo "=== $h ===" ssh "$h" "getent hosts $h && hostname -i" done

验证时注意输出中每个主机名对应的 IP 必须和规划一致,出现 127.0.0.1 或映射到了其他主机名,服务起来之后状态会很诡异地互相报 not available。

防火墙也要同步放开调度器的服务端口。各版本的默认端口不一定相同,我每次都在lsf.conf里显式配置端口段,然后根据配置去放行,避免“照搬网上防火墙端口发现还是不通”的尴尬。

4.4 多节点调度的验收:从单机任务到跨节点分布

多节点部署完成后的验收,我关心的不是任务能不能跑,而是调度器有没有真的把任务“分散”到所有节点。给每个节点一个明显不同的工作负载,用以下方式观察分布:

# 向默认队列提交多个短任务 for i in {1..30}; do bsub -q normal -n 4 -J "load_$i" "sleep 120" done # 看作业都跑在哪些主机上 bjobs -r -o hostname exec_cwd submit_time

正常情况下,30 个作业会相对均匀地分布在 master 以外的计算节点上。如果 bjobs 输出中所有任务的执行主机都落在同一台机器,不要急着怀疑“调度器坏了”,先用bhosts -l看其他节点的状态。经常出现计算节点unavail、closed或者负载显示异常高的情况,这类问题我在下一章集中讲。

验收通过的标准是:任务能跨节点跑、各节点 load 呈平滑分布、主节点 mbatchd 的内存占用在任务高峰时没有明显暴涨。达到这三条,多节点集群才算真正可交付。

5. OpenLava 4.0 避坑指南:五个常见故障的现象、原因与解决顺序

5.1 lsid 正常但 LIM 一直等不到:先查端口和主机解析

现象:lsid能打印集群信息,但lsadmin limready输出 waiting,整个服务像卡住一样。

原因:lsid 从本地配置文件读取信息,不需要网络;limready 要和本机或远程 LIM 进程建立实际通信。最常见的是防火墙阻挡了 LIM 的端口,或者 /etc/hosts 中主机名解析指向了不正确的 IP。

解决顺序:先ps -ef | grep lim确认进程确实活着;然后看监听端口ss -lntp | grep -i lim;再用lsadmin linfo查看 LIM 实际报告的地址。端口没听说明启动参数不对,端口监听中但 limready 连不上就是防火墙策略问题,把该 TCP 端口加入白名单即可。如果这两步都没问题,回到上一章 hosts 检查流程确认所有节点主机名解析一致。

5.2 作业一直 PEND 不跑,日志还没有明显错误

现象:bjobs显示作业 PEND 好几分钟,bpeek又看不到任何 stdout。

原因:资源条件不满足。常见有两类:一是 MAX_CPUS 总和小于节点物理核数,调度器判断没有可用资源;二是队列 HOSTS 限制把所有节点排除掉了,作业请求的资源标签 no resource match。

解决:bqueues -l检查队列是否 open、HOSTS 字段是否为 all;bhosts -l看可分配 CPU 是否为零;badmin mbdstatus看 master 调度锁开关是否被 hold。最容易被忽略的是用户级限制,lsb.users里的 MAX_JOBS 或 PEND_JOB 太小,任务被压在那里排队等待用户配额,而不是等待节点资源。此时lshosts -l帮不上忙,必须复读用户配置。

5.3 计算节点全部停了,任务堆在主节点上

现象:节点负载并不高,但调度器把所有作业都固定发到 master 一台机器上,其他节点 bhosts 显示无作业。

原因:计算节点的 sbatchd 与 master 的 mbatchd 通信中断,或计算节点的资源上报字段为空,调度器认为这些节点不能接受作业。

解决:先看bhosts -l中计算节点的 status,若一直是unavail,检查该节点 limp 是否起来;接着在 master 上badmin mbdstatus看工作队列中的主机状态是否ok。如果节点端没问题,最有可能的是计算节点本地时间偏差过大,调度器以时间戳判断心跳,时间不同步会让 master 丢弃节点的资源上报结果。解决就是把 NTP 配置到每台机器,并重启 openlava 服务。

5.4 改 lsf.conf 后不生效,重启服务反而报错

现象:改了lsf.conf中的日志目录或参数,执行badmin reconfig没反应,重启服务直接启动失败。

原因:badmin reconfig并不会完整重读lsf.conf,它主要重读队列和用户配置,重新加载集群级配置需要重启 LIM。启动失败则往往是新参数语法不对,或文件权限被改动。

解决顺序:先badmin mbdstatus和lsadmin limready确认服务还活着;修改lsf.conf后不要只执行 reconfig,建议直接service openlava restart。若重启失败,立即查看/opt/openlava/log/lim.log和mbatchd.log最后 20 行,那里会指出哪个参数解析失败。改lsf.conf前先备份,是我给自己定的死规矩,有后悔药才能快速回退。

5.5 所有调度命令都找不到:环境变量没进登录会话

现象:手工执行 bsub 说 command not found,但/opt/openlava/bin/bsub --help能正常执行。

原因:环境变量只写进了当前 shell,没有写入全局 profile,每次登录都要重新手动 export。

解决:检查/etc/profile.d/openlava.sh是否存在且 has 读权限;如果是登录 shell 加载行为异常,可直接echo "source /etc/profile.d/openlava.sh" >> /etc/bashrc。还有一种情况是 sudo 到其他用户时 PATH 被重置,普通用户通过 sudo 执行调度命令会丢变量,这种情况建议用sudo -i并让目标用户重新加载 openlava.sh。

6. 进阶经验:用自定义 RESOURCES 字段把集群分区化调度

6.1 在主机表里定义自定义标签并验证

集群大了以后,按网段或硬件配置分区是刚需。OpenLava 的 RESOURCES 字段天然适合做这件事:不需要维护多台独立集群,只需要在主机表里给节点打上“标签”,提交作业时指定标签即可。

在lsf.cluster.openlava的 Begin Host 段里,给每台机器追加自定义标签:

Begin Host HOSTNAME model type server r1m RESOURCES master ServerR Linux + 3.5 (mg) node01 ServerR Linux + 3.5 (intel_sse gpu_v100) node02 ServerR Linux + 3.5 (intel_sse) node03 ServerR Linux + 3.5 (amd_epyc fast_disk) End Host

标签名字完全没有既定语法,只要是英文字母和下划线组合即可。但要注意,标签必须写进lsb.hosts引用的主机组或直接出现在 RESOURCES 中,并且重启 LIM 后才会生效。我见过把标签写进配置但没有重启,导致后续提交报 No resource match 的情况,改完文件务必lsadmin reconfig或重启服务。

验证标签是否被调度器识别,用这个命令:

bhosts -l | grep -A3 "node01"

输出中的 Resource Dictionary 或相似字段应能看到自定义标签。确认后即可进入提交环节。

6.2 用 bsub -R 精确指定资源组

调度器真正的灵活性在-R参数上,它让作业声明自己需要的资源标签,调度器只会把作业投放到带对应标签的节点:

# 只投放到带 gpu_v100 标签的节点 bsub -q normal -n 8 -R "gpu_v100" -J gpu_job "run_some_gpu_work.sh" # 同时指定两个标签 bsub -q normal -n 4 -R "fast_disk intel_sse" -J disk_job "run_disk_test.sh" # 指定标签且排除管理节点 bsub -q normal -n 4 -R "intel_sse && !master" -J filter_job "run_cpu_task.sh"

-R里的表达式支持逻辑与、逻辑非,用起来相当于给作业加了一道“只能在这些节点跑”的约束。资源标签也可以和队列 HOSTS 限制叠加:队列先圈定主机范围,-R在范围内继续过滤,两层条件同时满足才能接收作业。

从标签设计角度讲,我这些年形成的习惯是:标签只表达硬件属性,不表达业务归属。guassian 这类业务名称不要当作标签,原因是业务配额变化会频繁修改主机表,而硬件属性在采购周期内不变。把这个原则贯彻后,-R规则基本能长期稳定运行。

从那以后,我每次接手新集群,第一件事都不是先跑业务,而是先把所有节点按硬件属性打标签,再逐个用-R提交一次单作业验证标签匹配。这套流程虽然多花十来分钟,却帮我避开了很多“任务永远只在某几台机器跑”的隐性故障。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询