尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

openlava 4.0集群调度系统部署实战:从源码编译到作业管理

openlava 4.0集群调度系统部署实战:从源码编译到作业管理 简介openlava 4.0源码安装包面向集群管理入门与进阶用户适合希望理解作业调度、资源管理及分布式计算底层机制的技术人员。该版本虽已停止维护但作为IBM LSF的前身其设计思想与实现方式仍具参考价值可帮助读者掌握开源集群调度器的核心架构与实际部署流程。资源共501个文件以C语言源码和头文件为主辅以automake构建脚本、配置模板及man帮助文档整体压缩包仅1.65MB。从源码目录可清晰看到作业提交、队列管理、资源监控等模块的实现脉络。目前已有1593人学习适合想从源码层剖析集群管理工具或准备搭建轻量级调度环境的开发者。通过阅读和编译该源码包读者既能熟悉Linux环境下开源项目的编译安装流程也能借鉴其任务分发与负载均衡设计为理解更复杂的商业集群产品打下基础。1. openlava 4.0到底是什么为什么值得折腾看到这个项目标题我第一反应是很多人第一次接触到 openlava是因为手里攒了一堆服务器或者实验室刚买了几台GPU节点不想让人肉排队跑任务也不想花大钱买商用调度器。那个openlava-4.0.tar.gz就是这套开源集群作业调度系统的最后正式版本源码包。openlava 是基于 IBM Platform LSF 4.0 模型衍生出来的开源实现简单说它就是一套帮助你统一管理计算集群、把用户提交的作业自动分配到空闲节点上去跑的系统。你不需要知道哪台机器忙哪台机器闲也不需要自己写脚本轮询CPU负载只需要用 bsub 提交一个作业剩下的事全部交给它。它解决的核心问题有三个一是把多台机器的算力变成一个资源池二是让多个用户提交的作业按策略排队互相不抢三是当某台机器宕机或者负载异常时作业能被迁移或重新调度保证整体稳定。这套系统适合谁我觉得主要有三类人。第一类是高校和科研机构的计算平台管理员他们手里有十几台到上百台服务器要支撑各种仿真、生信、机器学习任务。第二类是公司内部的HPC运维工程师需要用一套稳定可控的调度方案把GPU、CPU资源利用起来。第三类就是像我这样喜欢折腾的人想在自己小集群上复现一套类似LSF的调度体验不愿意每年交几万块钱授权费。如果你正在规划集群建设或者觉得集群利用率一直上不去openlava 是一个值得认真研究的方案。2. 安装部署从tar.gz到一台能跑的调度服务器2.1 编译前的准备依赖、用户、目录规划想把这个tar.gz变成能用的系统第一件事不是解压而是想清楚部署形态。openlava 的架构是典型的master-slave模式一台管理节点多台计算节点。管理节点负责调度和收集状态计算节点负责实际跑作业。如果你只想在一台机器上体验那这台机器既是管理节点也是计算节点完全可以。依赖方面我最常用的组合是 gcc、make、libxml2-devel、ncurses-devel。如果你装的是精简版Linux发行版没有编译工具链先执行类似 yum groupinstall Development Tools 的命令把基础环境补齐。这一步骤很少有人强调但实际踩坑率极高很多人在编译阶段报错都是因为缺了某个开发库。解压源码包之后我习惯先看一眼 README 和 INSTALL 文件openlava 的安装脚本写得比较简单核心步骤就三步tar -zxvf openlava-4.0.tar.gz cd openlava-4.0 ./configure --prefix/opt/openlava make make install这里有一个关键决策点prefix 路径选哪里。我不建议装在 /usr/local因为openlava运行时要写日志、写作业输出最好给它一个独立的目录后续做权限控制和备份都方便。我习惯用 /opt/openlava然后把日志目录单独指到 /var/log/openlava避免系统根分区被作业日志占满。编译过程很顺利大概两分钟左右就能完成所以我这里想多说一句如果在make阶段报了类似 cannot find -lxml2 的错误大概率是 libxml2-devel 没有安装而不是代码有问题。我见过不少新手在这一步卡住其实装一下依赖就行了别急着换版本、改源码。2.2 配置文件的第一个门槛理解四个关键文件编译安装完成只是热身真正体现功力的是配置。openlava 的配置文件集中在安装目录的 etc 子目录下核心文件我用一张表说明配置文件作用最需要改的内容lsf.conf全局配置定义集群名、主节点、端口LSF_MASTER_LIST、OPENLAVA_CLUSTER_NAMElsf.cluster.openlava定义集群里有哪些机器哪些是server哪些是client替换主机名和IP标记计算节点lsb.hosts定义主机组把机器分组管理计算节点的host组归属lsb.queues定义队列比如normal、priority、idle队列所属host组、作业优先级、资源限制第一次配置时我建议你打开 lsf.cluster.openlava 看看里面内置了一个名为 hpc 的用户入口。很多人不知道openlava 默认认为存在一个 hpc 用户作为管理用户。如果系统里没有最简单的方式是用 root 创建这个用户然后在配置里把管理员换成自己的实际用户名或者干脆建一个 hpc 用户。这一步当年折腾了我一个晚上后来才搞清楚这个 hpc 用户不是硬性的但配置文件里默认的管理员名称就是它不改配置又不建用户管理命令执行时权限检测会过不去。修改主机列表的时候有一个细节值得专门强调主机名必须和 /etc/hosts 里配置的主机名完全一致不能写IP也不能用 localhost。因为openlava内部会用主机名作为唯一标识符凡是出现过主机名对不上的情况轻则节点显示不可用重则master都起不来。2.3 环境变量与首次启动配置文件改完后别急着启动服务先把环境变量搞定。openlava 的 etc 目录下自带了一个 openlava.sh 文件里面定义了所有需要的环境变量你需要把它复制到 /etc/profile.d/ 或者手动source 一下。核心的环境变量包括OPENLAVA_CONF指向配置文件目录OPENLAVA_BINDIR指向可执行文件目录OPENLAVA_SERVERDIR指向服务器启动文件目录OPENLAVA_ADMIN指定管理员用户名然后按照官方推荐的顺序启动服务。我这里的经验是先启动 LIMLoad Information Manager再启动 sbatchd最后启动 mbatchd。你可以分别执行两条 lint 命令来确认LIM和mbatchd是否在运行也可以直接用 badmin hrestart 做一次热重启。如果你发现 LIM 起不来十有八九是端口被占用。openlava 默认用的 UDP 端口是 7869你可以用 netstat 或者 ss 命令检查。我遇到过一台测试机上面装过别的分布式系统结果端口冲突LIM 反复启动失败最后通过修改 lsf.conf 里的 LSF_LIM_PORT 才解决。这个排查思路值得记下来。3. 日常使用作业提交、队列管理、资源限制3.1 bsub 提交作业的几种方式和参数选择服务跑起来之后第一件让人有成就感的事就是成功提交一个作业。最简单的命令是 bsub sleep 60它会默认把作业丢到 normal 队列。但我实际用下来最常用的提交模式有这么几种# 提交一个需要4核、每个节点最多2核的作业 bsub -q normal -n 4 -R span[ptile2] ./myjob.sh # 提交一个申请GPU的作业 bsub -q gpu -n 2 -R select[ngpus0] ./train.py # 指定作业输出和错误日志文件 bsub -o /home/user/logs/%J.out -e /home/user/logs/%J.err ./run_analysis.py参数说明一下-q 指定队列-n 申请核数-R 是资源约束表达式。其中 -R span[ptile2] 的意思是让4个核分布在最多2台机器上也就是每台机器最多分配2个核。这个约束对并行任务特别重要因为如果你跑的是MPI程序节点间通信的开销往往比多核并行大得多最好让所有核尽量集中在少数节点上。GPU 队列的情况稍微特殊。openlava 本身不直接识别GPU它需要在 lsb.queues 里给队列设置资源类型然后在计算节点上用 lsload 命令查看 ngpus 这个指标。我第一次配置GPU支持时也是一头雾水后来才发现关键在于把 lsb.resources 里定义好资源映射关系。不过如果你只是小规模测试可以直接在作业脚本里检查 GPU 设备文件不过这就失去了调度器统一管理的作用所以还是建议把GPU资源纳入调度。还有一个容易被忽略的参数是 -J它给作业起名字。集群上一旦作业多起来bjobs 显示一长串ID你根本分不清哪个是哪个给作业起名字是提升运维效率最重要的习惯。3.2 从 bjobs 到 bqueues如何观察集群健康度作业提交之后最重要的事就是观察状态。bjobs 是最常用的命令我用一张表列出输出里最关键的几个状态码状态含义常见原因PEND排队中队列繁忙或者在等待资源RUN运行中正常DONE已完成正常退出退出码为0EXIT异常退出脚本报错、资源超限、被killSSUSP系统挂起队列被临时关闭或机器故障这些状态码每一个我都遇到过其中最让人头大的就是 PEND 很久不跑。排查的顺序我一般是这样先用 bqueues 看队列当前有多少作业在排队再用 bhosts 看节点资源是否充足最后用 bjobs -p 查看作业详情看是不是资源请求有问题。另外日常巡检主要看两个指标。第一是用 bhosts 看节点的负载等级如果显示 unavail 或者 closed说明节点有问题或者被手动关闭了。第二是用 lsload 看每台机器的CPU、内存、交换分区使用率这里我们通常利用 openlava 的负载指数来判断节点是否健康传统的 load平均负载其实很容易骗人因为CPU核心数多的机器load本来就会高一些看 loadSched 和 loadStop 这类归一化指标才更贴近实际调度效果。3.3 队列与用户组的管理逻辑队列是openlava里我喜欢折腾的地方因为它直接决定不同业务怎么共享资源。比如我给交互式任务开了一个 max 队列给批处理任务开了 normal 队列给需要大内存的任务开了 bigmem 队列。每个队列可以设置不同的优先级比如 normal 队列优先级默认为0调试队列优先级可以设到20这样调试任务可以更快抢占资源。配置队列的要点在于 lsb.queues 里几个关键参数QUEUE_NAME 定义队列名PRIORITY 定义队列优先级NICE 定义对运行中作业的NICE值RUNLIMIT 定义单个作业运行时间上限HOSTS 定义哪些主机组可以用这个队列。这里最容易踩坑的是当你没有给 HOSTS 指定具体主机组时所有节点都能接收这个队列的作业这在生产环境里可能引发资源挤占所以建议每个队列都明确限定主机组。用户组的配置在 lsb.users 里它决定了各个用户对不同队列的访问权限。默认情况下只有管理员可以操作所有队列普通用户只能使用自己用户组被授权访问的队列。我实际配置的时候喜欢把不同课题组划分到一个用户组然后给每个组一个偏好的队列这样既隔离资源又保留共享能力。4. 常见问题与排查技巧实录4.1 三个必遇到的坑以及对应的处理办法第一坑LIM 起不来或者起来之后各个节点之间互相看不到。这个问题最大的可能性是主机名和IP解析不一致。openlava 对网络环境非常敏感集群内每台机器的 /etc/hosts 都需要有所有节点的主机名映射否则就算同一个机房内网才能通信它也不会认。遇到这个情况我通常先做两件事检查 lsf.cluster.openlava 里的主机名拼写再在每台机器上 ping 一下彼此的主机名确认能解析通。第二坑作业一直处于PEND状态但 bhosts 显示节点有大量空闲资源。这种情况八成是资源请求配置有问题。比如你在 bsub 里用 -R select[typeX] 但节点上根本没有定义这个资源类型作业就会永远等待调度器认为它无法被满足。处理方法是用 lsinfo 查看当前所有资源类型然后和你的请求条件比对。第三坑作业以EXIT状态退出但应用本身并没有报错。这往往是因为内存超限或者运行时间超限。openlava 队列默认对内存和运行时长有限制如果作业超过限制调度器会直接杀掉进程。排查时先看 bjobs -l 的详细输出里面会有关闭作业的具体原因。我遇到过好几次类似情况把 RUNLIMIT 从200分钟调长到2000分钟就解决了。4.2 日志分析的思路和几个调试手段配置完 openlava 之后如果系统不像预期那样跑起来千万别乱猜直接看日志。管理节点上最重要的日志是 mbatchd.log 和 lim.log计算节点上是 sbatchd.log。它们的路径在 lsf.conf 里可以通过 LSF_LOG_MASK 和 LSF_DEBUG_OPT 控制默认情况下日志输出量不多但关键错误信息一定能看到。我建议你把 LSF_LOG_MASK 设置成 INFO 级别这样既能看到正常启动过程也能看到错误堆栈。还有一个非常实用的调试手段是执行 badmin idle 或者 badmin resume 切换服务质量级别的命令这个操作不会中断正在运行的作业只是控制后续作业的调度节奏非常适合在高峰期做资源调整。如果你确实遇到过程序崩溃级别的异常重置调度器的终极手段是 badmin shutdown 然后重新启动所有服务。虽然在生产环境轻易不要这样做但是在测试环境尝试验证配置是很常见的手法特别是你在改动了队列配置后重启 mbatchd 是让配置生效最稳妥的方式。5. 结合实践经验谈一谈选型与扩展思路openlava 4.0 是最后一个正式版本后续没有太多大版本的更新很多人会好奇现在还有没有必要学它我的观点是有必要。原因有三点。第一很多超算中心和生物信息平台至今还在用它跑业务你如果能部署、调优 openlava等于掌握了一套非常贴合实际生产环境的技能。第二openlava 的源码量不大架构清晰完整非常适合用于理解调度器的核心原理读完代码之后再看 Slurm、PBS 之类的调度器会觉得轻松很多。第三它的资源管理和队列策略设计得很规范你可以在它基础上快速封装出自定义的调度方案比如把暂闲业务塞进default队列而把重要业务留给高优先级队列。我之前还做过一个尝试把 openlava 和一套内部自研的 Web 提交平台对接起来平台的用户界面上选择队列、填写资源申请后端调用 bsub 命令把作业提交到 openlava。整套链路跑通后团队里大部分人都可以自助提交计算任务而不用登录服务器操作。这个扩展方式其实很轻量因为 openlava 本身没有提供 REST API但只要把命令行封装成接口一样能实现不错的自动化效果。如果你现在正准备评估调度器我建议你可以先在一台虚拟机里跟着上面的内容安装体验一遍不需要真实物理集群也能完成大部分功能验证。等确认能满足需求之后再扩展到两台机器把管理节点和计算节点分开测试一下跨节点的调度、资源隔离和故障切换这一套流程走下来你对集群调度的理解会有质的提升。最后说一件我踩过的坑备份配置。openlava 本身的配置文件改动很频繁但很多人把它当成一次性配置不管了结果某台机器重装后集群里的节点全部失去联系需要手动一个个恢复。我用 openlava 的习惯是每次修改配置文件之前都把 etc 目录打一个带日期的压缩包比如 prev-openlava-etc-20250115.tar.gz这样出问题时可以快速回滚。运维就是这样很多看似无意义的备份关键时刻能替你省下半夜三点加班的痛苦。本文还有配套的精品资源点击获取
返回列表