
写这篇东西的起因很简单我在 Ubuntu 20.04 上装 Torque 6.1.2 单机版按网上的老教程一路敲下去结果从 configure 到 make 再到 pbs_server 启动几乎每一步都在报错。断断续续折腾了一整天摸清了不少坑的来龙去脉。现在把整个过程和排查思路整理出来希望后面的人装这玩意儿能少走几个弯路。这篇主要适合两类人一是刚接触 PBS 系作业调度想在笔记本或虚拟机里搭一个单机版练手的人二是生产环境暂时不需要高可用但必须在 Ubuntu 20.04 上跑 Torque 6.1.2 做测试的人。下面所有内容都基于 Ubuntu 20.04 和 Torque 6.1.2 源码包命令我都实际跑过。1. 单机部署前先搞明白这几个组件和流程Torque 是一个类 PBS 的作业调度系统虽然是 HPC 老牌方案但结构其实挺清晰pbs_server 负责调度和管理pbs_mom 跑在计算节点上负责执行任务pbs_sched 是调度器trqauthd 负责节点间的认证。单机版意味着四个角色都在同一台机器上看起来简单配置起来却一点都不能省。1.1 我最初的误区我一开始觉得单机版就是把服务启起来、建个队列就能提交作业。实际上 Torque 的认证机制、节点注册、资源上报这些流程都是按“多节点集群”来设计的单机版只是把 pbs_mom 也放在本机而已该走的流程一步都不会自动跳过。举个典型例子pbs_mom 启动后需要向 pbs_server 报节点信息如果节点名解析不了或者 server_priv/nodes 文件里没写这台机器pbs_server 根本不会认这个节点。你 qstat 看到的永远是 0 个节点作业提交进去就一直排队看着像死锁其实就是节点注册没做对。1.2 单机版到底需要哪些组件从最终运行状态来看单机版必须拉起这几个进程trqauthd认证守护进程pbs_server 和 pbs_mom 通信前必须先握手这个进程起不来后面全是连接失败。pbs_server调度的核心负责队列管理、作业分配。pbs_sched调度策略执行者决定哪个作业跑哪个节点。pbs_mom本机执行器负责真正接管作业、生成作业目录、启动任务进程。这四兄弟缺一个都有可能让整个系统表面正常但实际不干活。我在后面第 4 节会专门讲启动顺序这个顺序不是随便定的是有依赖关系的。2. 前置准备把这些依赖一次装齐安装 Torque 6.1.2 前我建议大家先把编译工具和依赖库一次性装好。别信网上有些教程说的“装一下 gcc make 就行”那是在老版本的 Ubuntu 上成立20.04 上默认的 gcc 9 环境有几个专门的坑后面细说。2.1 必须装的依赖清单我实测需要的包如下sudo apt update sudo apt install -y gcc g make libtool autoconf automake m4 \ libxt-dev libxmu-dev libssl-dev libicu-dev libical-dev \ libhwloc-dev hwloc nfs-common keyutils libmunge-dev munge这里重点说两个包libical-devTorque 的日历和调度代码会用到少了它 configure 大概率报Could not find libical。libhwloc-devTorque 6.1.2 编译节点资源探测部分需要 hwloc不装也可以编过但运行时的 CPU、内存识别会不准。如果你的环境不需要图形管理工具可以加一个逻辑来避免装一堆 X11 依赖库。Torque 编译时默认会尝试编译 GUI 工具需要 libxt 和 libxmu我建议直接装好这两个包省得 configure 阶段再出幺蛾子。2.2 gcc 9 与 Torque 6.1.2 的兼容性问题这是 Ubuntu 20.04 上最容易翻车的地方。Torque 6.1.2 是 2017 年前后的代码默认的编译环境比较老而 Ubuntu 20.04 自带 gcc 9glibc 也升到了 2.31。编译时很多 C 文件会报隐式声明比如strdup、isinf这些函数根本原因是源码里定义的老宏_BSD_SOURCE在 glibc 2.28 之后不再自动启用新特性。解决办法很简单在 configure 前增加环境变量把宏强制打开。export CFLAGS-D_DEFAULT_SOURCE -D_BSD_SOURCE -D_POSIX_C_SOURCE200809L如果你忘了加这一行后面 make 的时候会跑出大量带implicit declaration of function的编译错误抓狂程度极高。2.3 创建运行账号与目录Torque 的 server 和 mom 默认会以普通用户身份运行虽然很多时候直接 root 启动也能跑但为了规范我建议按官方习惯创建专用账号。sudo groupadd pbsuser sudo useradd -g pbsuser -m -s /bin/bash pbsuser sudo mkdir -p /var/spool/torque sudo chown -R pbsuser:pbsuser /var/spool/torque这里的/var/spool/torque是 Torque 的 server home 目录。后面所有配置文件和 serverdb 都会放在这个目录下权限不对会直接导致初始化失败。我一开始用 root 跑pbs_server -t create建完的 serverdb 是 root 属主再换成 pbsuser 启服务就总是报权限问题重装了一遍才算清爽。3. 编译安装configure 的每一个参数都是有讲究的Torque 的 configure 参数不算多但有几个直接影响单机版能否正常运行。我建议别图省事直接./configure还是把关键参数看清了再动手。3.1 下载源码与预生成 configureTorque 6.1.2 的源码可以从 GitHub 上 adaptivecomputing/torque 的 release 页面下载。下载完解压后先别急着重接 configure很多情况下需要重新生成 configure 脚本因为仓库里自带的 configure 可能和你本地的 autoconf 版本不匹配。wget https://github.com/adaptivecomputing/torque/releases/download/6.1.2/torque-6.1.2.tar.gz tar -zxvf torque-6.1.2.tar.gz cd torque-6.1.2 # 重新生成 configure autoreconf -fi我在这一步被卡过一次直接跑./configure报configure: error: cannot find install-sh之类的问题用autoreconf -fi重新生成一遍就正常了。3.2 configure 参数的含义我最终用的配置如下逐项讲一下为什么这么设。export CFLAGS-D_DEFAULT_SOURCE -D_BSD_SOURCE -D_POSIX_C_SOURCE200809L ./configure \ --prefix/usr/local/torque \ --with-server-home/var/spool/torque \ --with-default-server$(hostname) \ --disable-gui \ --disable-db-check \ --enable-static \ --enable-shared参数含义如下--prefix/usr/local/torque把可执行文件集中装到一个目录下方便之后写 systemd 服务和管理 PATH。如果不用这个参数默认会散落在 /usr/local/bin 和 /usr/local/sbin不太好维护。--with-server-home/var/spool/torque指定运行时的 home 目录必须和第 2 节创建的目录一致。--with-default-server$(hostname)让客户端默认连本机。如果不设qsub 之类的命令可能连 localhost和你 server 注册的名字对不上导致认证失败。--disable-gui跳过图形管理工具编译。单机测试根本不需要 xpbsmon 那些界面还能少一堆 X11 依赖。--disable-db-check跳过数据库检查。Torque 6.1.2 支持 pbs_server 挂外部数据库记录作业状态单机版我们用默认文件存储就够了。--enable-static --enable-shared同时生成静态和动态库对后续排错有帮助。3.3 make 编译及常见报错configure 通过后编译这一步相对省心前提是前面 CFLAGS 加对了。我用的编译命令make -j4 sudo make install如果 CFLAGS 没加你会看到类似这样的报错src/lib/Libifl/pbs_getenv.c: In function pbs_getenv: src/lib/Libifl/pbs_getenv.c:88:12: error: implicit declaration of function strdup看到implicit declaration第一反应就该是宏定义问题别去改源码直接在 CFLAGS 里补-D_DEFAULT_SOURCE就行。编译完成后Torque 的可执行文件会出现在 /usr/local/torque 下。其中 sbin 下面有 pbs_server、pbs_mom、pbs_sched、trqauthdbin 下面有 qsub、qstat、qdel、qmgr 等命令。接下来要做的就是把它们跑起来。4. 初始化配置目录、文件和服务启动顺序编译安装只是第一步真正让人头疼的是运行配置。Torque 的配置文件分散在几个目录少一个、晚一步都不行。我按照“先写文件、再初始化、再启动服务”的顺序来拆解。4.1 必须手写的三个配置文件安装完成后Torque 不会自动生成全部配置。你要手动建立 server_name、nodes、mom_priv/config 这三个文件。server_name 文件用来告诉客户端默认的服务器地址内容必须是主机名不能是 IP。比如你的机器叫ubuntu-serverecho ubuntu-server /var/spool/torque/server_namenodes 文件在 server_priv 目录下用来注册节点。单机版就一行np后面的数字是 CPU 核数mkdir -p /var/spool/torque/server_priv echo ubuntu-server np4 /var/spool/torque/server_priv/nodesmom_priv/config 文件是 pbs_mom 的运行配置至少需要指定 pbs_server 地址mkdir -p /var/spool/torque/mom_priv cat /var/spool/torque/mom_priv/config EOF \$pbsserver ubuntu-server \$logevent 255 \$restart_child 1 EOF这里必须强调一点三个文件里的主机名要和系统hostname输出的完全一致。Ubuntu 20.04 有时会把/etc/hostname里的大写主机名和/etc/hosts里的解析搞出偏差建议先确认hostname hostname -f如果hostname -f返回空或者带 IP说明 /etc/hosts 里缺少本机映射。我解决方法是直接在 /etc/hosts 里加一行127.0.0.1 ubuntu-server别小看这一步pbs_mom 向 pbs_server 上报节点时如果反解不出主机名节点状态永远是 down作业也就永远排不上。4.2 第一次启动时的初始化操作pbs_server 第一次启动必须用-t create参数这条命令会创建 serverdb。如果不带这个参数服务起来后你会发现连 qmgr 都进不去报错信息是服务端数据库未初始化。启动顺序建议如下# 1. 启动认证服务 sudo /usr/local/torque/sbin/trqauthd start # 2. 初始化并启动 pbs_server sudo /usr/local/torque/sbin/pbs_server -t create -f # 3. 启动调度器 sudo /usr/local/torque/sbin/pbs_sched # 4. 启动节点执行器 sudo /usr/local/torque/sbin/pbs_mom注意 pbs_server 和 pbs_mom 之间没有强制的顺序要求但 trqauthd 必须最先启动。我在测试时跳过 trqauthd 直接启 pbs_server结果日志里全是could not connect to trqauthd。4.3 用 qmgr 创建队列服务进程起来后第一件事就是建队列。Torque 默认没有可用队列作业提交进去会直接报No queue available。qmgr 脚本如下/usr/local/torque/bin/qmgr -c set server schedulingtrue /usr/local/torque/bin/qmgr -c create queue batch queue_typeexecution /usr/local/torque/bin/qmgr -c set queue batch enabledtrue /usr/local/torque/bin/qmgr -c set queue batch startedtrue /usr/local/torque/bin/qmgr -c set server default_queuebatch这几条命令对应四个状态缺一不可。enabled表示队列允许新作业进入started表示调度器可以调度该队列里的作业。如果started没设为 true作业提交后会在队列里卡住显示Q状态但永远不跑。验证方法/usr/local/torque/bin/qstat -q正常输出里batch队列的 availability 应该是--且tot列为 0。4.4 把服务写成 systemd 单元文件虽然命令行能起但重启后手动拉服务太不专业了。我建议把四兄弟都写成 systemd 服务。这里贴一个 pbs_server 的其它类似。[Unit] DescriptionTorque PBS Server Afternetwork.target trqauthd.service [Service] Typeforking ExecStart/usr/local/torque/sbin/pbs_server -f ExecStop/usr/local/torque/sbin/pbs_server -S PIDFile/var/spool/torque/server_priv/pbs_server.pid Userroot Restarton-failure [Install] WantedBymulti-user.target放在/etc/systemd/system/pbs_server.service里然后执行sudo systemctl daemon-reload sudo systemctl enable pbs_server trqauthd pbs_sched pbs_mom这里注意pbs_mom 的 systemd 单元我不建议加Restartalways因为 pbs_mom 本身会 fork 子进程异常重启容易留下孤儿进程占住端口。我踩过一次重启 mom 后旧进程还在新进程起不来最后只能手动 kill。5. 验证与首作业提交跑通才算真的装好很多教程到启动服务就结束了但我一直认为“能提交作业并看到状态变化”才是安装成功的唯一标准。这一节带你完整验证一遍。5.1 查看节点与队列状态先看节点是否注册成功/usr/local/torque/bin/pbsnodes -a如果配置正确node 状态应该是free。如果你的输出里节点状态是down或者state-unknown多半是节点名和 server_priv/nodes 文件里的不一致。查看 mom 日志可以进一步确认tail -f /var/spool/torque/mom_logs/mom_log # 实际路径取决于配置再看队列状态/usr/local/torque/bin/qstat -q /usr/local/torque/bin/qstat -aqstat -a会显示每个队列中作业的数量和调度状态如果没有意外这里应该是整齐的 0。5.2 提交一个真实作业我习惯用最简单的 sleep 作业做冒烟测试这样可以避免作业本身执行时间太短、来不及观察状态echo sleep 60 | /usr/local/torque/bin/qsub提交后立即/usr/local/torque/bin/qstat你会看到作业 ID、所有者、队列状态列从Q排队变成R运行。等 60 秒后再看作业就消失了说明执行完毕。如果作业一直是Q状态优先级最高的排查方向是 pbs_sched 是否在运行。很多人在自己机器上把 pbs_sched 漏掉了或者 systemd 里没写作业永远进不了 running 阶段。5.3 单机版的资源限制问题提交普通作业可能没问题但如果你需要测试并行任务或资源匹配单机版还得额外处理资源属性。比如节点设置了np4但如果你在 qsub 里不带-l nodes1:ppn2作业默认只用 1 个核。这个不会报错但你会误以为 Torque 没把资源传进去。正确的提交方式echo sleep 30 | /usr/local/torque/bin/qsub -l nodes1:ppn2另外在虚拟机里容易出现内存被 pbs_mom 识别为超大内存或超小内存的情况。这时可以在 mom_priv/config 里强制指定内存上限$node_check_enable false $actual_mem 8gb这个配置的作用是让 mom 用你写的值兜底而不是依赖 hwloc 探测。虽然看起来有点绕但在容器和虚拟机场景非常实用。6. 踩坑实录与问题排查速查最后把这一整天遇到的高频问题按“现象-原因-解法”整理成速查。表格里的每一行都是我实际撞过或者反复验证过的可以直接当排查手册用。6.1 编译期问题速查现象原因解决办法configure 报Could not find libical缺少 libical 开发库sudo apt install -y libical-devmake 报implicit declaration of function strdupglibc 宏定义没打开编译前设CFLAGS-D_DEFAULT_SOURCE -D_BSD_SOURCEconfigure 报cannot find install-sh源码包里的 autotools 生成文件老化autoreconf -fi后重新 configuremake 过程非常慢或死在一个文件上单个编译单元内存吃紧改用make -j2而不是-j4执行pbs_server报找不到共享库编译后的 lib 目录没进 ldconfig添加/usr/local/torque/lib到 /etc/ld.so.conf.d/torque.conf 后执行ldconfig需要注意的是-D_DEFAULT_SOURCE这一行必须同时加在 configure 前的 CFLAGS 里因为 Torque 在 configure 阶段会探测一些函数特性探测结果会写进生成的头文件。如果 configure 阶段探测错了后面 make 阶段就算你临时加宏也救不回来最干脆的办法是清掉源码目录重新解压再来一遍。6.2 运行期问题速查现象原因解决办法pbs_server 报could not connect to trqauthdtrqauthd 没先启动或认证端口被占先起 trqauthd确认 15001 端口没被占用首次启动 pbs_server 报 serverdb 不存在没加-t create参数pbs_server -t create -f重新初始化pbsnodes -a 显示节点 downserver_priv/nodes 或 hostname 不一致核对主机名确保 /etc/hosts 有本机映射作业一直排队不进运行pbs_sched 没启动或队列 startedfalse确认 pbs_sched 进程qmgr 里设置 schedulingtrue作业运行失败报权限错误作业目录属主问题确保 /var/spool/torque 下目录属主是 pbsuser重启系统后服务没起来systemd 单元未启用systemctl enable trqauthd pbs_server pbs_sched pbs_mom运行期最隐蔽的问题是端口占用。Torque 的服务端口在 15001 到 15005 一段其中 15001 是 trqauthd 的认证端口。如果你之前装过另一套 PBS 或 Torque 旧版重启新服务时很容易出现地址占用。排查命令sudo ss -ltnp | grep 1500有残留进程就先kill千万别图省事直接加--force那个参数可能会把 serverdb 清掉。6.3 一些零碎但容易误伤的操作习惯装完 Torque 之后还有一个环境变量要补否则下次登录时 qsub、qstat 这些命令找不到echo export PATH/usr/local/torque/bin:/usr/local/torque/sbin:$PATH ~/.bashrc source ~/.bashrc另外建议大家动手改配置前先把干净的状态备份一下。最容易改坏的目录是/var/spool/torque/server_priv里面的 serverdb 一旦损坏qstat 会显示一堆诡异状态连 pbs_server 都可能起不来。我备份的姿势很简单sudo tar -czf /root/torque_backup_$(date %F).tar.gz /var/spool/torque改完配置要是出了问题直接恢复这个目录再重启服务比重装省心多了。写到这里我个人最大的体会是Torque 6.1.2 单机版安装本身不难难的是它把旧时代 HPC 软件的“手工配置”习惯完整保留了下来。Ubuntu 20.04 的新工具链和它之间隔了好几个版本导致编译期间就埋了不少雷。只要把依赖装齐、CFLAGS 加对、主机名解析搞定、按顺序启动服务这软件其实是相当老实的。最后再分享一个小技巧每当你觉得“怎么又卡住了”先别急着重装去看/var/spool/torque下各类 *_logs 的尾部百分之八十的问题在日志里都有明确线索。