毅硕HPC | OpenPBS构建高效稳定的HPC作业调度环境

简介: 通过规范化的OpenPBS部署,我们不仅搭建了一个运行作业的平台,更构建了一套有序、透明、可扩展的科研生产管理体系。

当您的研发团队拥有数百个计算节点,却因为缺乏合理的资源分配导致任务排队混乱、高优先级作业被阻塞,甚至因为节点过载导致系统宕机——这不仅是硬件资源的浪费,更是科研进度的停滞。OpenPBS作为业界领先的开源调度器,正是为了解决这一矛盾而生。本文将带您深度解析如何从零构建一套生产级OpenPBS调度环境,让您的算力资源“如臂使指”。


一、PBS调度系统

PBS(Portable Batch System)作为开源调度器的元老级选手(源于NASA),在超算中心、能源勘探、生物医药等领域已稳定运行20余年。其核心价值远超基础功能:

  • 资源利用率最大化:解决“旱涝不均”问题,通过策略实现多用户的高效并发。
  • 作业优先级管理:确保核心业务、紧急任务能够优先获得算力支持。
  • 复杂拓扑感知:能够识别CPU核心、内存、GPU(如A100/H100)等硬件特性,实现精准调度。
  • 故障自愈能力:实时监控计算节点健康状态,自动剔除故障节点,保障任务连续性。


二、实战指南

第一阶段:环境预检与依赖安装

  1. OS环境:推荐CentOS/Rocky Linux/Ubuntu LTS。
  2. 先决条件:主机名解析(/etc/hosts)、各节点时钟同步(NTP/Chrony)、各节点无密码SSH互信。
  3. 依赖包:gcc, make, libtool, openssl-devel 等编译环境准备。
# 安装依赖
yum install -y gcc make rpm-build libtool hwloc-devel \
      libX11-devel libXt-devel libedit-devel libical-devel \
      ncurses-devel perl postgresql-devel postgresql-contrib python3-devel tcl-devel \
      tk-devel swig expat-devel openssl-devel libXext libXft \
      autoconf automake gcc-c++

若找不到libedit-devel包,启用PowerTools再安装或直接去https://rhel.pkgs.org/ 下载

# 启用 PowerTools 安装libedit-devel
dnf -y install dnf-plugins-core
dnf config-manager --set-enabled PowerTools
dnf -y install libedit-devel

第二阶段:OpenPBS 编译与安装

  1. 源码获取:从GitHub或官网下载稳定版。
  2. 配置编译:先运行 autogen.sh 再使用 ./configure --prefix=/opt/pbs 指定路径。
  • 配置完成:

  • 使用make -j$(nproc) 编译:

3.安装执行:make install

4.初始化:运行 sudo /opt/pbs/libexec/pbs_postinstall

5.编辑配置文件:/etc/pbs.conf

# nano /etc/pbs.conf
PBS_SERVER=XXX        #请将XXX自行修改成主机名,在这里我的主机就是主节点。
PBS_START_SERVER=1    #本机是否充当PBS主机,是的话改1,子节点改0
PBS_START_SCHED=1     #本机是否充当PBS任务调度器,通常只在主机上用,子节点成0
PBS_START_COMM=1      #本机是否充当PBS任务交流器,通常只在主机上用,子节点改成0
PBS_START_MOM=0       #本机是否充当PBS计算节点,(根据情况来定,一般主节点配置低不需要计算直接改=0 计算节点=1)

6.修改文件权限:

sudo chmod 4755 /opt/pbs/sbin/pbs_iff /opt/pbs/sbin/pbs_rcp

7.启动PBS:sudo /etc/init.d/pbs start 若提示PBS Data Service user postgres does not exist.安装postgresql-server再重新启动。

  • 添加pbs命令到全局环境变量:
vim /etc/profile
# 最后添加
export PATH=/opt/pbs/bin:/opt/pbs/sbin:$PATH
export LD_LIBRARY_PATH=/opt/pbs/lib:$LD_LIBRARY_PATH
# 保存
source /etc/profile
  • 验证 qstat 命令:qstat -B
    • 配置开机启动:
systemctl enable pbs
systemctl start pbs

8.启动异常问题

  • 如下启动输出:
Starting PBS
PBS Home directory /var/spool/pbs needs updating.
Running /opt/pbs/libexec/pbs_habitat to update it.
***
*** Setting default queue and resource limits.
***
qmgr obj=workq svr=default: Invalid credential
qmgr: Error (15019) returned from server
cp: cannot stat'/usr/bin/pg_resetxlog': No such file or directory
*** End of /opt/pbs/libexec/pbs_habitat
Home directory /var/spool/pbs updated.
PBS comm
/opt/pbs/sbin/pbs_comm ready (pid=109868), Proxy Name:rhel-openpbs:17001, Threads:4
PBS sched
Connecting to PBS dataservice...connected to PBS dataservice@192.168.1.30
PBS server
  • 解决方案:
# 确认你系统里的 pg_resetwal 路径(通常在 /usr/bin/ 或 /usr/pgsql-x/bin/)
which pg_resetwal  
# 创建软链接伪装成旧版命令 
sudo ln -s $(which pg_resetwal) /usr/bin/pg_resetxlog

# 修复管理员凭证和初始化
# 尝试以 root 身份直接修改(如果 pbs_server 已启动) 
sudo /opt/pbs/bin/qmgr -c "set server managers += root@$(hostname)"
sudo /opt/pbs/bin/qmgr -c "set server managers += root@localhost"
# 重新执行环境适配脚本
sudo /opt/pbs/libexec/pbs_habitat
sudo /etc/init.d/pbs restart

9.子节点配置:

  • /etc/pbs.conf
PBS_SERVER=主节点名字
PBS_START_SERVER=0    #本机是否充当PBS主机,是的话改1,子节点改0
PBS_START_SCHED=0     #本机是否充当PBS任务调度器,通常只在主机上用,子节点改成0
PBS_START_COMM=0      #本机是否充当PBS任务交流器,通常只在主机上用,子节点改成0
PBS_START_MOM=1       #本机是否充当PBS计算节点,主从机均可,若不当计算节点请改成0
  • 初始化并启动pbs
# 初始化
sudo /opt/pbs/libexec/pbs_postinstall
# 设置文件权限
sudo chmod 4755 /opt/pbs/sbin/pbs_iff /opt/pbs/sbin/pbs_rcp
# 启动pbs
sudo /etc/init.d/pbs start

第三阶段:队列管理及节点创建

1.添加队列

sudo /opt/pbs/bin/qmgr
create queue hpc                          #创建名为hpc的队列
set queue hpc queue_type = Execution      #将hpc设置成执行队列,如有其他特殊需求请自行修改,另外一种是Route(路由队列),不参与计算
set queue hpc enabled = True              #启用hpc队列
set queue hpc started = True              #启动hpc队列
set server default_queue = hpc            #将hpc队列配置成默认队列
set server flatuid=True                   #不检查用户UID是否一致
set server scheduling=True                #启用PBS任务调度器
set server job_history_enable=True        #启用历史记录
exit # 退出

2.手动添加节点

sudo /opt/pbs/bin/qmgr -c "create node node01"
sudo /opt/pbs/bin/qmgr -c "create node node02"
...

3.删除节点

sudo /opt/pbs/bin/qmgr -c "delete node node02"

4.查看节点

pbsnodes -a

输出内容说明:

  • 节点名称:每个节点的唯一标识符,通常是主机名。
  • 状态(state):表示节点的当前状态,例如:free:节点空闲,可以分配作业;busy:节点正在运行作业;offline:节点被手动设置为离线状态;down:节点不可用(例如硬件故障);job-exclusive:节点被某个作业独占。
  • 资源(resources_available):节点可用的资源,例如:ncpus:可用的CPU数量;mem:可用的内存大小;gpus:可用的GPU数量(如果支持GPU)
  • 分配的资源(resources_assigned):当前被作业占用的资源,例如:ncpus:已分配的CPU数量;mem:已分配的内存大小;gpus:已分配的GPU数量(如果支持GPU)

第四阶段:测试任务提交

1.编写测试脚本

#!/bin/bash
#PBS -N MyFirstHPCJob
#PBS -l nodes=1:ppn=1
#PBS -q hpc
#PBS -j oe
#PBS -o /home/hpcuser/pbs_test.log

echo"----------------------------------------"
echo"作业启动时间: $(date)"
echo"运行节点名称: $(hostname)"
echo"运行用户身份: $(whoami)"
echo"当前工作目录: $(pwd)"
echo"----------------------------------------"

# 模拟计算任务
sleep 20

echo"作业完成时间: $(date)"
EOF

参数说明:

  • #PBS -N MyFirstHPCJob
    • 含义:作业名称 (Name)。
    • 作用:在 qstat 查看任务列表时显示的名称。
  • #PBS -l nodes=1:ppn=1
    • 含义:资源列表 (Resource List);nodes=1:申请1个计算节点;ppn=1:每个节点申请1个处理器核心 (Processors Per Node);
    • 进阶:在OpenPBS的新版本中,也常用 select=1:ncpus=1 这种写法。
    • 重要性:这是最核心的配置,直接决定了调度器从哪分资源。如果申请 nodes=2:ppn=16,调度器就会寻找两个空闲的、且各有16核的节点。
  • #PBS -q workq
    • 含义:目标队列 (Queue)。
    • 作用:指定将任务提交到哪一个“池子”里。
    • 建议: 如果集群配置了多个队列(如 debug, gpu, bigmem),用户必须在这里指明,否则会进入默认队列。
  • #PBS -j oe
    • o 代表 Standard Output (标准输出,即程序执行中print/echo的内容)。
    • e 代表 Standard Error (标准错误,即报错信息)。
    • 含义: 合并输出 (Join)。
      • 作用: oe 表示将这两个流合并为一个文件。
      • 好处: 方便用户查看,不需要在两个文件(.o 和 .e)之间切换。
  • #PBS -o /home/hpcuser/pbs_test.log
    • 含义: 输出路径 (Output Path)。
    • 作用: 指定运行结果保存的文件名和存放位置。
    • 实施提示: 必须确保计算节点能访问这个路径。在没有 NFS 共享存储的环境下,这个文件默认会先保存在计算节点的临时目录,任务结束后再拷贝回主节点(但这经常因为 SSH 权限问题失败),所以在 HPC 实施中,强力建议配合 NFS 使用。

2.提交作业

qsub pbs-test.sh

3.查看队列及任务状态

# qstat -q
# 输出

server: rhel-op

Queue            Memory CPU Time Walltime Node   Run   Que   Lm  State
---------------- ------ -------- -------- ---- ----- ----- ----  -----
workq              --      --       --     --      0     0   --   E R
hpc                --      --       --     --      1     0   --   E R
                                               ----- -----
                                                   1     0

# qstat -an
# 输出

rhel-openpbs:
                                                            Req'd  Req'd   Elap
Job ID          Username Queue    Jobname    SessID NDS TSK Memory Time  S Time
--------------- -------- -------- ---------- ------ --- --- ------ ----- - -----
0.rhel-openpbs  efadmin  hpc      MyFirstHP*  80169   1   1    --    --  E 00:00
   rhel-compute/0

第五阶段:精细化策略调试

  • 节点属性定义:为节点打标签(如 gpu=true, mem=high)。
    • 在 Server 层面注册自定义资源
# nano /var/spool/pbs/server_priv/resourcedef

gpu_type TYPE=string FLAGS=h
mem_high TYPE=boolean FLAGS=h
  • 为具体节点赋值
sudo qmgr -c "set node rhel-compute resources_available.gpu_type = A100"
sudo qmgr -c "set node rhel-compute resources_available.mem_high = True"
  • 调用标签
# 脚本里指定需要带 A100 显卡的节点
#PBS -l select=1:ncpus=8:gpu_type=A100
  • 调度策略(Sched Config):设置回填(Backfilling)策略,提升碎片资源利用率。
    • 开启调度器的时间预估功能
# 设置默认 walltime 为 24 小时,方便调度器计算回填窗口
sudo qmgr -c "set queue hpc default_chunk.walltime = 24:00:00"
  • 配置调度器策略文件
    OpenPBS的调度策略通常在 sched_config 文件中定义(通常位于 /var/spool/pbs/sched_priv/sched_config)。 找到以下参数并确保其开启:
    1). backfill: True(开启回填)
    2). backfill_depth: 20(回填扫描的深度,即检查队首后面多少个作业)
    3). strict_fifo: False(如果设为 True 则无法回填,必须关闭)

三、结语

HPC的实施从来不只是代码的堆砌,而是一场关于平衡的艺术——在有限的硬件资源与无限的计算需求之间寻找最优解。

通过规范化的OpenPBS部署,我们不仅搭建了一个运行作业的平台,更构建了一套有序、透明、可扩展的科研生产管理体系。作为HPC实施工程师,我们的目标始终如一:让每一颗核心都满载运行,让每一次创新都无需等待。 如果您的集群正面临效率瓶颈,或许答案就在这一套科学的调度方案之中。

目录
相关文章
|
2天前
|
人工智能 自然语言处理 Shell
🦞 如何在 Moltbot 配置阿里云百炼 API
本教程指导用户在开源AI助手Clawdbot中集成阿里云百炼API,涵盖安装Clawdbot、获取百炼API Key、配置环境变量与模型参数、验证调用等完整流程,支持Qwen3-max thinking (Qwen3-Max-2026-01-23)/Qwen - Plus等主流模型,助力本地化智能自动化。
🦞 如何在 Moltbot 配置阿里云百炼 API
|
6天前
|
人工智能 API 开发者
Claude Code 国内保姆级使用指南:实测 GLM-4.7 与 Claude Opus 4.5 全方案解
Claude Code是Anthropic推出的编程AI代理工具。2026年国内开发者可通过配置`ANTHROPIC_BASE_URL`实现本地化接入:①极速平替——用Qwen Code v0.5.0或GLM-4.7,毫秒响应,适合日常编码;②满血原版——经灵芽API中转调用Claude Opus 4.5,胜任复杂架构与深度推理。
|
10天前
|
JSON API 数据格式
OpenCode入门使用教程
本教程介绍如何通过安装OpenCode并配置Canopy Wave API来使用开源模型。首先全局安装OpenCode,然后设置API密钥并创建配置文件,最后在控制台中连接模型并开始交互。
4600 8
|
16天前
|
人工智能 JavaScript Linux
【Claude Code 全攻略】终端AI编程助手从入门到进阶(2026最新版)
Claude Code是Anthropic推出的终端原生AI编程助手,支持40+语言、200k超长上下文,无需切换IDE即可实现代码生成、调试、项目导航与自动化任务。本文详解其安装配置、四大核心功能及进阶技巧,助你全面提升开发效率,搭配GitHub Copilot使用更佳。
10403 21
|
3天前
|
人工智能 自然语言处理 Cloud Native
大模型应用落地实战:从Clawdbot到实在Agent,如何构建企业级自动化闭环?
2026年初,开源AI Agent Clawdbot爆火,以“自由意志”打破被动交互,寄生社交软件主动服务。它解决“听与说”,却缺“手与脚”:硅谷Manus走API原生路线,云端自主执行;中国实在Agent则用屏幕语义理解,在封闭系统中精准操作。三者协同,正构建AI真正干活的三位一体生态。
2344 9
|
1天前
|
存储 安全 数据库
使用 Docker 部署 Clawdbot(官方推荐方式)
Clawdbot 是一款开源、本地运行的个人AI助手,支持 WhatsApp、Telegram、Slack 等十余种通信渠道,兼容 macOS/iOS/Android,可渲染实时 Canvas 界面。本文提供基于 Docker Compose 的生产级部署指南,涵盖安全配置、持久化、备份、监控等关键运维实践(官方无预构建镜像,需源码本地构建)。
1245 2
|
1天前
|
机器人 API 数据安全/隐私保护
只需3步,无影云电脑一键部署Moltbot(Clawdbot)
本指南详解Moltbot(Clawdbot)部署全流程:一、购买无影云电脑Moltbot专属套餐(含2000核时);二、下载客户端并配置百炼API Key、钉钉APP KEY及QQ通道;三、验证钉钉/群聊交互。支持多端,7×24运行可关闭休眠。
|
17天前
|
存储 人工智能 自然语言处理
OpenSpec技术规范+实例应用
OpenSpec 是面向 AI 智能体的轻量级规范驱动开发框架,通过“提案-审查-实施-归档”工作流,解决 AI 编程中的需求偏移与不可预测性问题。它以机器可读的规范为“单一真相源”,将模糊提示转化为可落地的工程实践,助力开发者高效构建稳定、可审计的生产级系统,实现从“凭感觉聊天”到“按规范开发”的跃迁。
2599 18
|
10天前
|
人工智能 前端开发 Docker
Huobao Drama 开源短剧生成平台:从剧本到视频
Huobao Drama 是一个基于 Go + Vue3 的开源 AI 短剧自动化生成平台,支持剧本解析、角色与分镜生成、图生视频及剪辑合成,覆盖短剧生产全链路。内置角色管理、分镜设计、视频合成、任务追踪等功能,支持本地部署与多模型接入(如 OpenAI、Ollama、火山等),搭配 FFmpeg 实现高效视频处理,适用于短剧工作流验证与自建 AI 创作后台。
1398 5