简介:Torque 6.1.1.1 源码包面向高性能计算集群运维人员与作业调度系统开发者,用于搭建由管理节点与计算节点组成的 PBS 集群环境。管理节点运行 pbs_server,计算节点运行 pbs_mom,客户端命令可独立部署于任意主机,适合需要理解作业提交、调度与资源管理机制的中高级读者研读。压缩包共约 2000 个文件、13.45MB,以 C 源码为主体,辅以大量 Perl 脚本、头文件、模板与构建配置,另有 Makefile、日志样例、帮助文档及少量 Python、Tcl 辅助脚本,完整覆盖服务端、mom 端与调度器模块。内容预览可见 start_exec.c、mom_comm.c、mom_main.c、node_manager.c、svr_jobfunc.c 等核心文件,便于梳理作业启动、节点通信与请求处理链路。已有 841 人学习,适合作为集群部署、二次开发与故障排查的参考底本。
1. 从一台编译到一半就停下的机器说起
上周帮人收拾一台旧计算节点,系统盘里躺着半截torque-6.1.1.1.tar.gz解压出来的源码树,make日志停在找不到libssl头文件那一行。对方说“装了两天,节点就是连不上主控”。这场景太常见了:Torque 6.1.1.1 这套资源管理器在高校实验室、公司内部小集群里用得极广,但它的安装不是./configure && make install一把梭,编译期依赖、trqauthd守护进程、server_name解析、mom与pbs_server的端口握手,任何一环没对齐,表现都是“提交任务卡住”或“节点状态 down”。这篇笔记按我实际装机的顺序走一遍:先列清环境与版本取舍,再落到解压、编译、配置、启动,最后给一套能自证的验证方法。适合第一次搭 Torque 的开发者,也适合装过一次但被pbs_mom折腾过的熟手对照参数。
2. 装前把环境钉死:Torque 6.1.1.1 的依赖与版本取舍
Torque 6.1.1.1 是 6.1 分支的维护版本,源码包本身不带二进制,所有组件都要在本机编译。装之前最该做的不是急着解压,而是把编译器、加密库、主机名解析这三件事钉死,否则后面每一步都会以奇怪的方式失败。
2.1 编译工具链与系统库的最低要求
我一般先确认这几样:GCC 4.8 以上(6.1.1.1 的 C 代码用了部分 C99 特性,太老的 GCC 会在configure阶段报语法错)、GNU make、autoconf/automake(源码树里带了configure,但改过configure.ac后需要重新生成)、以及 OpenSSL 开发包。Torque 的pbs_server与trqauthd在认证路径上依赖 OpenSSL,缺头文件是最常见的翻车点。
# 以常见的 RHEL/CentOS 系为例,先补齐编译期依赖 yum install -y gcc gcc-c++ make autoconf automake libtool \ openssl-devel ncurses-devel libxml2-devel # Debian/Ubuntu 系对应包名不同,别照抄上面 apt-get install -y build-essential autoconf automake libtool \ libssl-dev libncurses-dev libxml2-dev这段命令的逻辑是:gcc/make负责编译,autoconf/automake/libtool应对源码树里可能触发的重新生成,openssl-devel(或libssl-dev)提供ssl.h与链接库,ncurses给qstat之类的交互输出用,libxml2在部分配置路径下会被探测。参数上没什么可调的,关键是开发包而不是运行时包——只装openssl不装openssl-devel,configure会静默跳过 SSL 支持,等到节点认证时才暴露。
提示:如果机器上有多套 OpenSSL(比如自编译过新版),
configure可能挑到非系统路径的那套。装完先用openssl version和ls /usr/include/openssl/ssl.h对一下,确认头文件与库是同一套。
2.2 主机名、hosts 与防火墙:三个装完才想起的隐形依赖
Torque 的节点发现完全靠主机名。pbs_server启动时读server_name,pbs_mom启动时读pbsserver,两边必须能互相用短主机名解析到同一个地址。我见过太多“配置全对但节点 down”的案例,最后都是/etc/hosts里只有127.0.0.1 localhost,没有本机短名。
# 主控与计算节点都要有可互相解析的条目,短名在前 cat >> /etc/hosts <<'EOF' 192.168.10.11 ctrl01 192.168.10.12 node01 192.168.10.13 node02 EOF # 验证:两边都要能解析出对方,且 hostname -s 返回短名 hostname -s getent hosts ctrl01 node01逻辑说明:hosts条目里短名放第一列,getent hosts走的是系统解析器,能同时验证 DNS 与hosts的合并结果。hostname -s必须返回不带域名的短名,因为 Torque 内部比较节点名时用的是短名,带域名会导致pbs_server认为节点不在自己管辖内。防火墙方面,pbs_server默认监听 15001,pbs_mom监听 15002,trqauthd用 15003,调度器通信还有一段动态端口;内网集群我一般直接在这些端口上放行,而不是关整个防火墙。
2.3 版本选择:为什么是 6.1.1.1 而不是更新的分支
6.1.1.1 属于 6.1 系列的补丁版本,相比 6.0 系列修了若干pbs_mom在节点重启后的状态同步问题,又不像后续大版本那样改动配置项命名。对已有脚本、已有qsub提交模板的环境,升级到 6.1.1.1 的迁移成本最低——server_name、pbsserver、mom_config这些键名都没变。如果你的集群已经在跑 6.0.x,直接换 6.1.1.1 的源码包重编译即可,配置文件基本可以原样搬。反过来,如果是从更老的 4.x 上来,trqauthd的引入是个分水岭:4.x 时代靠pbs_server自己做认证,6.x 之后认证拆到独立守护进程,这一步没配好,qsub会报Unauthorized Request。
3. 解压、编译与安装:把 torque-6.1.1.1.tar.gz 落到 /opt
源码包的安装路径我习惯统一放/opt/torque,而不是默认的/usr/local。原因很实际:集群里常有多个版本的调度组件并存,放/opt下按版本分目录,回滚时改个软链就行,不用去/usr/local/bin里翻哪些文件是这次装的。
3.1 解压与 configure 的关键参数
# 解压到构建目录,保持源码树干净 tar -xzf torque-6.1.1.1.tar.gz -C /usr/local/src cd /usr/local/src/torque-6.1.1.1 # 关键:指定安装前缀、开启守护进程、指定 SSL 路径 ./configure --prefix=/opt/torque \ --with-server-home=/opt/torque/spool \ --enable-daemon \ --with-ssl-dir=/usr \ --disable-gui逐项说:--prefix决定二进制与库的落点;--with-server-home是pbs_server存队列、作业、日志的 spool 目录,必须单独指定且可写,默认会塞进$prefix/spool,但生产上我倾向把它放到独立分区,避免作业日志写满根盘;--enable-daemon让pbs_mom、pbs_server以守护进程方式运行,不加这个参数它们会前台阻塞;--with-ssl-dir指向 OpenSSL 的安装前缀,/usr表示用系统包;--disable-gui跳过 X11 相关的图形工具,服务器上没必要装。configure跑完重点看末尾摘要里SSL support是否为yes,是no就回去补开发包。
3.2 make 与安装:并行编译的坑
# 并行编译,核数按机器来,别盲目 -j 拉满 make -j4 # 安装到前缀目录 make install # 装完确认关键二进制存在 ls -l /opt/torque/bin /opt/torque/sbinmake -j4的并行度按实际核数给,老机器给太高反而因为内存不足被 OOM killer 干掉,表现为make莫名其妙中断、没有报错行。安装后/opt/torque/bin下应有qsub、qstat、qdel,/opt/torque/sbin下应有pbs_server、pbs_mom、pbs_sched、trqauthd。如果sbin里缺trqauthd,多半是configure时认证相关依赖没探测到,回看config.log里trqauthd那段的结论。
3.3 环境变量与动态库路径
# 写入 profile,登录即生效 cat >> /etc/profile.d/torque.sh <<'EOF' export TORQUE=/opt/torque export PATH=$TORQUE/bin:$TORQUE/sbin:$PATH export LD_LIBRARY_PATH=$TORQUE/lib:$LD_LIBRARY_PATH export PBS_DEFAULT=ctrl01 EOF source /etc/profile.d/torque.sh which qsub pbs_serverPBS_DEFAULT指定默认连接的主控短名,客户端命令靠它找pbs_server;LD_LIBRARY_PATH让qsub等命令能找到$TORQUE/lib下的libtorque.so。这一步漏了,qsub会报error while loading shared libraries: libtorque.so.2,看着像没装成功,其实只是路径没配。装完先which一下,确认走的是/opt/torque而不是系统里残留的旧版本。
4. 配置 pbs_server 与 pbs_mom:让主控和节点对上话
编译装完只是有了可执行文件,Torque 真正跑起来靠的是几个配置文件加守护进程的启动顺序。这一章按“主控先起、节点后连”的顺序配,顺序反了会出现节点注册不上、要手动pbs_server -t create重建的麻烦。
4.1 初始化 serverdb 与 server_name
# 首次安装需要初始化 serverdb,-t create 表示新建 pbs_server -t create # 确认 spool 下生成了 serverdb 与相关目录 ls -l /opt/torque/spool/server_priv/ # 设置主控名,必须与 hosts 里的短名一致 qmgr -c "set server server_name = ctrl01" qmgr -c "set server scheduling = true" qmgr -c "set server acl_hosts += ctrl01" qmgr -c "set server acl_hosts += node01"pbs_server -t create只在首次安装时用,它会在server_priv下建serverdb和默认队列结构;之后再带-t create会覆盖现有配置,属于后悔药都救不回来的操作。server_name设成短名ctrl01,与hosts对齐;acl_hosts是允许提交作业的主机白名单,节点和主控都要加进去,漏了节点会报Access from host not allowed。scheduling = true打开调度,否则作业只会排队不会分发。
4.2 配置 mom 的 pbsserver 与节点属性
# 每个计算节点上执行,指向主控短名 echo "ctrl01" > /opt/torque/spool/mom_priv/config cat >> /opt/torque/spool/mom_priv/config <<'EOF' $pbsserver ctrl01 $logevent 255 EOF # 主控上把节点加进 server 的节点列表 qmgr -c "create node node01" qmgr -c "create node node02"mom_priv/config里$pbsserver告诉pbs_mom向谁注册,$logevent 255打开详细日志,排错阶段很有用,稳定后可以调低。节点必须在主控上用qmgr -c "create node"显式创建,光在节点上起pbs_mom不会自动注册——这是新手最容易误解的一点,以为 mom 一起来 server 就认得。创建后qstat -n能看到节点状态从down变free才算通。
4.3 启动顺序与 trqauthd
# 主控:先起认证守护进程,再起 server 和调度器 trqauthd -d pbs_server pbs_sched # 节点:起 mom pbs_mom # 检查进程与端口 ps -ef | grep -E 'pbs_|trqauthd' ss -lntp | grep -E '15001|15002|15003'顺序是trqauthd→pbs_server→pbs_sched,节点侧pbs_mom最后起。trqauthd负责客户端认证,qsub提交时先找它;它没起,qsub直接报Unauthorized Request。端口上 15001 是 server,15002 是 mom,15003 是 trqauthd,ss输出里三个都在监听,说明链路基础通了。生产上我会把这几个启动命令写进 systemd unit 或 init 脚本,而不是每次手敲,避免重启后顺序错乱。
5. 避坑与排查:五条装 Torque 时真踩过的记录
5.1 现象:qsub 报 Unauthorized Request,trqauthd 明明在跑
原因多半是trqauthd的 socket 路径与客户端预期不一致,或者PBS_DEFAULT指向了错误的主控名。解决:先echo $PBS_DEFAULT确认是短名,再ls /tmp/trqauthd-unix-socket看 socket 是否存在;不存在就重启trqauthd,并确认它以 root 启动(普通用户起的 socket 权限不对,客户端连不上)。
5.2 现象:节点状态一直 down,qstat -n 看不到 mom
原因通常是hosts解析或$pbsserver写错。解决:在节点上getent hosts ctrl01确认能解析,再cat mom_priv/config看$pbsserver是不是短名;两边都对还 down,去主控server_priv/server_logs里翻日志,常见是 mom 版本与 server 不一致(混装了不同前缀的二进制)。
5.3 现象:make 中途无报错退出
原因多为并行编译内存不足被系统杀掉,或某个子目录的依赖没生成。解决:降到make -j1重跑,看具体停在哪一步;如果是libtool相关报错,先autoreconf -fi重新生成构建脚本再configure。
5.4 现象:configure 摘要里 SSL support 为 no
原因只装了运行时 OpenSSL 没装开发包,或--with-ssl-dir指错。解决:补装openssl-devel/libssl-dev,确认/usr/include/openssl/ssl.h存在后重新configure;自编译过 OpenSSL 的机器要把--with-ssl-dir指到那套前缀,别让头文件和库分家。
5.5 现象:作业提交后一直 Q 状态不分发
原因常见于pbs_sched没起、scheduling没开,或队列没绑定节点。解决:qmgr -c "print server"看scheduling是否为 true,ps -ef | grep pbs_sched确认调度器在跑,再qmgr -c "print queue batch"看队列的nodes属性是否为空——空队列不会往任何节点分发。
6. 装完怎么验证:一套能自证的跑通检查
装完不验证等于没装。我习惯按“进程 → 端口 → 节点 → 作业”四层往下走,每层都有明确的通过标准,任何一层不过就停在那里查,不往下猜。
第一层看进程与端口。主控上ps -ef | grep -E 'pbs_server|pbs_sched|trqauthd'应有三条常驻进程,节点上pbs_mom一条;ss -lntp里 15001、15002、15003 都在监听。这一层不过,后面全是空谈。
第二层看节点注册。主控执行qstat -n,输出里每个节点状态应为free而非down,且能看到 mom 上报的核数与负载。节点从down转free通常有几秒延迟,等十秒再刷一次,别急着改配置。
第三层提交一个最小作业,这是最硬的验证:
# 提交一个只打印主机名和环境的短作业 echo 'hostname; echo $PBS_O_WORKDIR; sleep 5' | qsub -l nodes=1:ppn=1 -N smoke_test # 看作业状态流转 Q -> R -> C qstat -a # 作业结束后取输出 cat smoke_test.o<作业号>-l nodes=1:ppn=1申请一个节点一个核,-N给作业命名方便找输出文件。状态从Q(排队)到R(运行)再到C(完成),说明调度、分发、执行、回收整条链路通了。输出文件里打印出的主机名应该是某个计算节点的短名,而不是主控——如果打印的是主控名,说明作业被错误地跑在了 server 节点上,回去查队列的节点绑定。
第四层做个反向验证:故意提交一个申请不存在资源的作业,比如qsub -l nodes=99:ppn=1,它应该稳定停在Q状态而不是报错退出,qstat -f里能看到它等待的原因。这一步能确认调度器真的在做资源匹配,而不是无脑放行。
| 检查层 | 命令 | 通过标准 |
|---|---|---|
| 进程 | ps -ef | grep pbs_ | server/sched/mom/trqauthd 各就位 |
| 端口 | ss -lntp | grep 150 | 15001/15002/15003 监听 |
| 节点 | qstat -n | 节点状态 free,核数正确 |
| 作业 | qsub冒烟作业 | 状态 Q→R→C,输出主机名为计算节点 |
这套检查我每次装完都强制走一遍,包括在已经“看起来正常”的机器上重装之后。有一次就是跳过了第四层,结果调度器配置里scheduling被前一次操作关掉了,作业全堆在队列里,直到用户来问才发现。从那以后我每次装完 Torque 都强制走一遍这四层,尤其是那个故意申请不存在资源的反向用例,它比正向作业更能暴露调度器是不是真的在工作。希望帮到你。
本文还有配套的精品资源,点击获取