PBS使用手册

本文作为本人@takooctopus深入学习用于MS上一点教程摘录,这个博客遵照着中科院水生生物研究所北京数学国际研究中心等一干网站的教程,特此列出,表示感谢。

PBS简介

PBS是公开源代码的作业管理系统,在此环境下运行,用户不需要指定程序在哪些节点上运行,程序所需的硬件资源由PBS管理和分配。

PBS(Portable Batch System)是由NASA开发的灵活的批处理系统。它被用于集群系统、超级计算机和大规模并行系统。PBS主要有如下特征:

  • 易用性: 为所有的资源提供统一的接口,易于配置以满足不同系统的需求,灵活的作业调度器允许不同系统采用自己的调度策略。
  • 移植性: 符合POSIX 1003.2标准,可以用于shell和批处理等各种环境。
  • 适配性: 可以适配与各种管理策略,并提供可扩展的认证和安全模型。支持广域网上的负载的动态分发和建立在多个物理位置不同的实体上的虚拟组织。
  • 灵活性: 支持交互和批处理作业。

PBS命令简介

因为PBS是部署于超算集群的,我们的作业或者说是提交任务的任务是需要排队的,作业通过PBS命令提交到PBS队列中,然后经由PBS分配资源运行。

一般的,我们咨询超算管理员关于队列的信息介绍,一般会分成几个队列,分别对应于不同目标的作业要求。比方说默认用于作业测试的batch,或者什么old,fat啥的,要记住,这个只是一个队列代号而已,由超算集群管理员定义,我们只需要明白自己作业对应于哪一个队列最为合适即可。

PBS提供四条基本的命令用于作业管理。

(1) qsub —— 用于提交作业脚本


{{- code -}}

因为所采用的选项一般放在pbs脚本中提交,所以具体见PBS脚本选项。

例如:


{{- code -}}

(2) qstat 命令 —— 用于查询作业状态信息


{{- code -}}

常用命令示例:

  • 查看空闲节点信息(提交作业前需要查看一下各队列节点空闲状况)
  • 查看指定作业信息(提交作业后查看作业状态信息)
  • 查看所有队列作业状态

(3) qdel 命令 —— 用于删除已提交的作业


{{- code -}}

例:


{{- code -}}

(4) qmgr 命令 —— 用于队列管理


{{- code -}}

(5)qhold & qrls —— 作业挂起 & 作业释放


{{- code -}}

使用 qhold 命令可以挂起作业,使其不被调度执行;
使用 qrls 命令可以将挂起的作业释放,使之可以被调度执行;

PBS脚本文件

PBS脚本文件由脚本选项和运行脚本两部分组成。

(1) PBS 作业脚本选项 (若无-C选项,则每项前面加‘#PBS’)


{{- code -}}

(2) 运行脚本同LINUX下一般的运行脚本文件。

[注]:脚本文件中的mpirun_rsh命令行中的节点列表文件要用环境变量表示
$PBS_NODEFILE(随便你们怎么赋值,反正是一个变量),这个环境变量表示由pbs自动分配给作业的节点列表;
节点数为命令行中指定的进程数。
格式如下:


{{- code -}}

PBS环境下运行示例

(1)脚本文件编辑示例

(A)示例一:运行mpi程序

命令行(bash)命令:
使用vi或者vim编辑PBS配置文件foo.pbs

  • 在命令行中#代表管理员
  • 在脚本中就是单纯的#,有时候脚本中可能表示注解。
  • ~: 命令行中为帐户的 home 目录。
  • ;: 分号,命令行中用以分隔连续指令。

{{- code -}}

编辑的内容为:


{{- code -}}

解释:

原先大家都是在终端(bash)输入mpirun_rsh......这些命令执行程序的,现在只要把这些提交命令放在.pbs配置文件的最后,由 PBS 来调度执行 (自动分配节点和其它资源)。

myjob是为你此次要运行的程序起的任务名,可以改成你自己想要的名字,原来输出信息都是直接在屏幕上显示的,现在屏幕上的显示全部会输出到文件中,上例中输出文件是/home/jz/my.out文件,可以根据自己的需要修改(目录,文件名)。程序运行时遇到的一些错误会 记录在.err文件中。好处:因为对每个任务都设定了不同的输出文件,所以看结果只要打开相应文件看就可以了,不需要开多个终端,里面有任务的详细信息, 比如实际分配的是哪些节点计算,运行时间等。

pbs -l nodes=2:ppn=2规定使用的节点数,以及每个节点能跑多少核,它们的积即是需要用的CPU数目。

mpirun –np 4 –hostfile $PBS_NODEFILE /home/jz/helloworld 此例中-np后的4是并行数(2×2=4个cpu),也就是上一个命令里CPU的数目,–hostfile $PBS_NODEFILE不需要改变(毕竟这都是环境变量了,自己赋值吧)。/home/jz/helloworld是你编译好的可执行文件名,需修改。

对于每个你要运行的 mpi 程序都需要这样一个.pbs 配置文件,也就是说原来的操作是:mpirun……,现在改成 2 步走:

  • 1) 写个 PBS 配置文件(比如 xxx.pbs);
  • 2) 向 PBS 提交(qsub xxx.pbs)

(B)实例二:运行非mpi程序

有些用户并不是自己编写mpi程序,同样也可以用pbs提交。

比如物理系运行程序时一般输入的命令是


{{- code -}}

那么配置文件可以这样写:

先命令行创建PBS配置文件:


{{- code -}}

其中配置文件内容为


{{- code -}}

解释:也就是说把原来在终端直接输入的命令RunDMol3.sh TiFeCp2-pbe-dspp-m=1-opt放到pbs配置文件中,因为你们只要一个节点,所以nodes=1,至于用哪个节点系统自动分配,你们 肯定很关心是分配了哪个节点给你们,那么可以用qstat命令查询(比如qstat -n)。

©实例三:标准PBS配置文件模板


{{- code -}}

视情况可以删减一些配置语句。

用户脚本文件实例

  • 实例一

{{- code -}}
  • 实例二

{{- code -}}

(2)提交作业示例


{{- code -}}

作业提交后会有一个作业号,即命令行上会显示:


{{- code -}}

(3) 作业状态查询示例

qstat 后加不同参数可以查看不同的信息(各参数的意思,上面有详细的说明,你们可以一个个试验一下,以后就知道查看哪些信息,需要哪些参数)

实例:


{{- code -}}

解释:Job id 是给你提交的任务分配的任务号,S(任务状态,R表示正在运行,Q表示正在排队等候调度)


{{- code -}}

{{- code -}}

{{- code -}}

解释:该方式输出和默认略有不同,但大同小异。


{{- code -}}

{{- code -}}

附录 关于使用Vi进行脚本编辑

虽然有很多教程了,还是简单列出一点基础使用方法。

在Linux系统下,使用Vi编辑脚本。

  • 一、进入vi

    系统提示符下,输入vi <文件名>,vi 载入此文件或开启一个新文件(如果该文件不存在)。

  • 二、两种模式
    vi存在两种模式:指令模式和输入模式。指令模式切换到输入模式需键入输入命令“a、i、o、A、I、O”,从输入模式切换到指令模式,按ESC键即可。

    • 新增 (append)
      a :从光标所在位置後面开始新增资料,光标後的资料随新增资料向後移动。
      A:从光标所在列最後面的地方开始新增资料。

    • 插入 (insert)
      i:从光标所在位置前面开始插入资料,光标後的资料随新增资料向後移动。
      I :从光标所在列的第一个非空白字元前面开始插入资料。

    • 开始 (open)
      o :在光标所在列下新增一列并进入输入模式。
      O: 在光标所在列上方新增一列并进入输入模式。

  • 三、退出vi

    指令模式下键入:wq、:q、:q!,退出vi。其中:wq是存盘退出,:q是直接退出,:q!强制退出。

  • 四、常用命令

    x: 删除光标所在字符。
    dd : 删除光标所在的列。
    r : 修改光标所在字元,r 後接著要修正的字符。
    R: 进入取替换状态,新增文字会覆盖原先文字,直到按 [ESC] 回到指令模式下为止。
    s: 删除光标所在字元,并进入输入模式。
    S: 删除光标所在的列,并进入输入模式。