HPC
DCV 应用教程
DCV | Nice DCV 安装手册
DCV | RLM 提取 HOSTID
EF Portal and DCV HA Solution
Enginframe 应用教程
Enginframe | 技术参数说明
毅硕HPC教程
毅硕HPC | HPC环境下的LDAP配置
毅硕HPC | Rocky Linux 9 SLURM软件编译安装
毅硕HPC | RHEL 8 上的NVIDIA驱动安装
毅硕HPC | 配置SLURM作业队列优先级
毅硕HPC | Pritunl + ECS + Frp 搭建远程办公VPN
毅硕HPC | 在HPC集群上优雅地使用 Conda
毅硕HPC | 一文详解HPC环境中的MPI并行计算
毅硕HPC | NVIDIA DGX Spark 万字硬核评测:将AI超级工厂带上桌面
毅硕HPC | Lustre文件系统在HPC集群中的部署实战
毅硕HPC | InfiniBand网络在HPC集群中的核心应用
毅硕HPC | OpenPBS构建高效稳定的HPC作业调度环境
毅硕HPC | HPC集群LSF调度系统部署指南
毅硕HPC | 轻量高效的XFCE桌面环境
毅硕HPC | Ubuntu 24 SLURM 编译安装
-
+
首页
毅硕HPC | OpenPBS构建高效稳定的HPC作业调度环境
当您的研发团队拥有数百个计算节点,却因为缺乏合理的资源分配导致任务排队混乱、高优先级作业被阻塞,甚至因为节点过载导致系统宕机——这不仅是硬件资源的浪费,更是科研进度的停滞。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(https://github.com/openpbs/openpbs/releases )或官网(https://www.openpbs.org/) 下载稳定版。 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实施工程师,我们的目标始终如一:让每一颗核心都满载运行,让每一次创新都无需等待。 如果您的集群正面临效率瓶颈,或许答案就在这一套科学的调度方案之中。
chsnp
2026年1月28日 14:52
转发
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
Word文件
PDF文档
PDF文档(打印)
分享
链接
类型
密码
更新密码
有效期