torque创建队列
GPU集群Torque排队系统使用手册

GPU集群Torque排队系统使⽤⼿册多媒体计算与通讯实验室GPU集群Torque排队系统使⽤⼿册袁平波 2016.5.20本实验室新购进24块K80 tesla GPU。
为了充分利⽤GPU计算资源,我们利⽤Torque来管理同学们的计算任务队列。
头结点的IP是192.168.17.240。
下⾯说明使⽤本GPU集群的⼏个步骤。
1.申请帐号.本集群有⼀个头结点和多个服务结点构成,因此提交计算作业需要在头结点上拥有帐号,需要使⽤集群的学⽣需要给我发⼀个申请邮件,同时cc给⾃⼰的导师,在导师批准后相应的帐号会被建⽴。
2.建⽴job脚本⽂件Torque管理系统不能直接提交⼆进制可执⾏⽂件,需要编写⼀个⽂本的脚本⽂件,来描述相关参数情况。
⼀个⽰例脚本⽂件myjob1.pbs如下:#PBS -N myjob1#PBS -o /home/username/myjob1.out#PBS -e /home/username/myjob1.err#PBS -l nodes=1:gpus=1:S#PBS -r ycd $PBS_O_WORKDIRecho Time is `date`echo Directory is $PWDecho This job runs on following nodes:cat $PBS_NODEFILEcat $PBS_GPUFILE./my_proc脚本⽂件中定义的参数默认是以#PBS开头的。
其中:-N 定义的是job名称,可以随意。
-o 定义程序运⾏的标准输出⽂件,如程序中printf打印信息,相当于stdout;-e 定义程序运⾏时的错误输出⽂件,相当于stderr。
-l 定义了申请的结点数和gpus数量。
nodes=1代表⼀个结点,⼀般申请⼀个结点,除⾮采⽤mpi并⾏作业;gpus=1定义了申请的GPU数量,根据应⽤实际使⽤的gpu数量来确定,S表⽰job类型,后⾯有详细描述。
曙光作业管理-调度系统安装配置手册

Torque + Maui配置手册之抛砖引玉篇本文将以应用于实际案例(南航理学院、复旦大学物理系、宁波气象局)中的作业调度系统为例,简单介绍一下免费开源又好用的Torque+Maui如何在曙光服务器上进行安装和配置,以及针对用户特定需求的常用调度策略的设定情况,以便可以起到抛砖引玉的作用,使更多的人关注MAUI这个功能强大的集群调度器(后期将推出SGE+MAUI版本)。
本文中的涉及的软件版本Torque 版本:2.1.7 maui版本:3.2.6p17。
1. 集群资源管理器Torque1.1.从源代码安装Torque其中pbs_server安装在node33上,TORQUE有两个主要的可执行文件,一个是主节点上的pbs_server,一个是计算节点上的pbs_mom,机群中每一个计算节点(node1~node16)都有一个pbs_mom负责与pbs_server通信,告诉pbs_server该节点上的可用资源数以及作业的状态。
机群的NFS共享存储位置为/home,所有用户目录都在该目录下。
1.1.1.解压源文件包在共享目录下解压缩torque# tar -zxf torque-2.1.17.tar.gz假设解压的文件夹名字为: /home/dawning/torque-2.1.71.1.2.编译设置#./configure --enable-docs --with-scp --enable-syslog其中,默认情况下,TORQUE将可执行文件安装在/usr/local/bin和/usr/local/sbin下。
其余的配置文件将安装在/var/spool/torque下默认情况下,TORQUE不安装管理员手册,这里指定要安装。
默认情况下,TORQUE使用rcp来copy数据文件,官方强烈推荐使用scp,所以这里设定--with-scp.默认情况下,TORQUE不允许使用syslog,我们这里使用syslog。
Torque中的一些问题

说明:这里描述的问题来自: Torque3.1.1, Village2.0 dev,文中用到的代码来自开源Apache项目. 文中虽例子,但主要是辅助说明错误原因和解决办法.以给使用Turbine+Torque+Velocity的人一点帮助.Torque是apache数据库项目中一个子项目,它实现数据库的持久层,是JDO的Apache实现.自从和Turbine 项目分出来后,它形成了两部分:生成器和运行时库.生成器用来生成数据库资源和访问数据库的类,使用这些类和在运行时库的支撑下,应用程序对数据库的各种操作得以用java对象的普通用法和操作习惯实现.Torque除了用到Apache其他项目如Commons的成果外,还用到了一个开源项目:Village(/index.php?SCREEN=village),它位于JDBC API上,提供不用写sql语句就可以实现数据库的crud操作.使用它和数据库里的表以及里面的记录打交道,就象是在一个小镇,一些小屋和小屋里的人们交谈,非常祥和的感觉.它的设计也是非常简洁,占用的空间也不大,真的就象一个游者,可以很轻松的驴行天下.Torque的生成器使用了Velocity项目,该项目是java的模板语言,在生成数据库资源时,它出了全力,我们可以通过修改{Torque.dir}\templates中各子文件夹里的vm模板来适合数据库及你项目中的需要.例如,对于PostgreSQL8,Torque生成的库资源中创建数据库的sql代码中没有指定代码页,这样PostgreSQL将使用默认的SQL_ASCII设置,如果想让生成的资源指定代码页可以修改{Torque.dir}\templates\sql\db-init\postgresql中的createdb.vm,本例指定代码页为UNICODE,如下:#foreach ($databaseName in $databaseNames)drop database $databaseName;create database $databaseNameENCODING = 'UNICODE';#增加该行即可#end用Torque做为项目的持久层,其开发过程是很简单的,需要提供的总文件数是4个:在设计阶段使用的build.properties,project-schema.xml,id-table-schema.xml以及在开发阶段的运行时用到的Torque.properties.在构建阶段为每个表产生五个类文件:<table-name>.java,<table-name>Peer.java,Base<table-name>.java,Base<table-name>Peer.java,这俩文件不要修改,因为用ant重新构建时,这些文件会重新生成.把文件名称以Peer结尾的称为Peer类,实现对象关系影射(ORM),不以Peer结尾的称为数据对象,应用和数据对象交互.不以base开头的类扩展了以base开头的类.业务逻辑应该加在子类上.<table-name>MapBuilder.java,这是用于特定表<table-name>的影射文件.Peer类的crud操作就是建立在Village之上的.现在开始一个例子,项目名称是cms,以这个例子说明一些问题.这是一个cms项目的模式文件cms-schema.xml:<?xml version="1.0" encoding="gb2312" standalone="no" ?><!DOCTYPE database SYSTEM"/turbine/dtd/database.dtd"><database name="news" package="org.news.om"><table name="atts" idMethod="none" description="保存了新闻的附件信息,它和新闻存在引用关系."><column name="pagedate" javaName="pagedate" primaryKey="true" required="true" type="VARCHAR"size="8" javaNamingMethod="underscore" description="页创建日期,缩略形式"></column><column name="pagecode" javaName="pagecode" primaryKey="true" required="true" type="VARCHAR"size="5" javaNamingMethod="underscore" description="页代码"></column><column name="filename" javaName="filename" primaryKey="false" required="true" type="VARCHAR"size="30" javaNamingMethod="underscore" description="文件名称"></column><column name="oldfilename" javaName="oldfilename" primaryKey="false" required="false" type="VARCHAR"size="30" javaNamingMethod="underscore" description="旧文件名称"></column><column name="attname" javaName="attname" primaryKey="false" required="true" type="VARCHAR"size="50" javaNamingMethod="underscore" description="附件名称,由用户指定的名称"></column><column name="img" javaName="img" primaryKey="false" required="false" type="BLOB"javaNamingMethod="underscore" description="附件文件,保存大文件"></column><column name="attdes" javaName="attdes" primaryKey="false" required="false" type="VARCHAR"size="50" javaNamingMethod="underscore" description="对附件的描述"></column></table></database>我们只关注生成java文件,使用该文件Torque生成了5个类,下面是影射类AttsMapBuilder:其代码片段为:public void doBuild() throws TorqueException{dbMap = Torque.getDatabaseMap("news");dbMap.addTable("atts");TableMap tMap = dbMap.getTable("atts");tMap.setPrimaryKeyMethod("none");tMap.addPrimaryKey("atts.PAGEDATE", new String());tMap.addPrimaryKey("atts.PAGECODE", new String());tMap.addColumn("atts.FILENAME", new String());tMap.addColumn("atts.OLDFILENAME", new String());tMap.addColumn("atts.A TTNAME", new String());tMap.addColumn("atts.IMG", new Object());tMap.addColumn("atts.A TTDES", new String());}问题一:删除数据时报告错误:You must specify KeyDef attributes for this TableDataSet in order to create a Record for update.原因:因为Torque的Peer使用了Village,而KeyDef是其中一个类,该类定义为:public class KeyDef{private Vector mySelf = null;public KeyDef(){mySelf = new Vector();mySelf.addElement ("");}public KeyDef addAttrib(String name) {mySelf.addElement (name);return this;}public boolean containsAttrib (String name){return (mySelf.indexOf ((Object) name) == -1) ? false : true;}public String getAttrib (int pos){if (pos == 0)pos = 1;try{return (String) mySelf.elementAt (pos);}catch (ArrayIndexOutOfBoundsException e){return null;}}public int size(){return mySelf.size() - 1;}}该类的作用很简单,就是保存一个列名称.提供给其他类DataSet和Record使用,通过读其源码,发现Village很依赖表的primary键,如果一个表没有primary键,那么你不能更新和删除记录.解决办法就是为表创建primary键.问题二:当删除多行时,遭到操作失败.原因:Village实现的比较奇怪,就是插入更新删除记录时,若影响行数大于1时会生成一个异常,下面的代码片段位于Record类中:private int saveWithDelete (Connection connection)throws DataSetException, SQLException{PreparedStatement stmt = null;try{stmt = connection.prepareStatement (getSaveString());int ps = 1;for (int i = 1; i <= dataset().keydef().size(); i++){Value val = getValue (dataset().keydef().getAttrib(i));val.setPreparedStatementValue (stmt, ps++);}int ret = stmt.executeUpdate();setSaveType (Enums.ZOMBIE);if (ret > 1)throw new SQLException ("There were " + ret + " rows deleted with this records key value.");return ret;}catch (SQLException e1){throw e1;}finally { try{if (stmt != null)stmt.close();}catch (SQLException e2){throw e2;}}}而这个异常在org.apache.torque.util.BasePeer类中是这样处理的:public static void doDelete(Criteria criteria) throws TorqueException{Connection con = null;try{con = Transaction.beginOptional(criteria.getDbName(),criteria.isUseTransaction());doDelete(criteria, con);mit(con);}catch (TorqueException e){Transaction.safeRollback(con);throw e;}}事务回滚导致删除操作失败.实际上不仅是对删除操作这样,而且对于其它操作插入更新也是这样的.解决办法就是重写Peer子类:因为Peer类是BasePeer的子类,但doDelete(Criteria criteria)是静态方法,不能覆盖,所以我们要重新命名上面方法为doDelete1(Criteria criteria),在问题三具体给出代码.问题三:有时候表中不存在唯一标识一条记录的字段组合(除了整行记录),想以某几个字段删除行.比如本例,允许指定两个字段PAGEDATE,PAGECODE的值删除记录.有两种办法:1 为了能使字段PAGEDATE,PAGECODE的值相等的多行存在,手工删除表中的primary键,保持影射文件不变,增删改都可工作.2 修改本例的BaseAttsPeer类,这样做要注意备份这个文件.增加两个函数:doDelete1(Criteria criteria, Connection con),doDelete1(Criteria criteria),这俩函数替代BasePeer 中的doDelete(Criteria criteria, Connection con),doDelete(Criteria criteria)两个函数的功能,再把BaseAttsPeer类中定义的doDelete所有重载版本的调用改到对doDelete1的调用,就可以了.doDelete1代码片段为:public static void doDelete1(Criteria criteria) throws TorqueException{Connection con = null;try{con = Transaction.beginOptional(criteria.getDbName(), true);//criteria.isUseTransaction());doDelete(criteria, con);mit(con);}catch (TorqueException e){mit(con);//Transaction.safeRollback(con);throw e;}}/***Method to perform deletes based on values and keys in a Criteria.*@param criteria The criteria to use.*@param con A Connection.*@throws TorqueException Any exceptions caught during processing will be*rethrown wrapped into a TorqueException.*/public static void doDelete1(Criteria criteria, Connection con) throws TorqueException{DB db = Torque.getDB(criteria.getDbName());DatabaseMap dbMap =Torque.getDatabaseMap(criteria.getDbName());// Set up a list of required tables and add extra entries to// criteria if directed to delete all related records.// StringStack.add() only adds element if it is unique.HashSet tables = new HashSet();Iterator it = criteria.keySet().iterator();while (it.hasNext()){String key = (String) it.next();Criteria.Criterion c = criteria.getCriterion(key);List tableNames = c.getAllTables();for (int i = 0; i < tableNames.size(); i++){String name = (String) tableNames.get(i);String tableName2 = criteria.getTableForAlias(name);if (tableName2 != null){tables.add(new StringBuffer(name.length() + tableName2.length() + 1).append(tableName2).append(' ').append(name).toString());}else{tables.add(name);}}if (criteria.isCascade()){// This steps thru all the columns in the database.TableMap[] tableMaps = dbMap.getTables();for (int i = 0; i < tableMaps.length; i++){ColumnMap[] columnMaps = tableMaps[i].getColumns();for (int j = 0; j < columnMaps.length; j++){// Only delete rows where the foreign key is// also a primary key. Other rows need// updating, but that is not implemented.if (columnMaps[j].isForeignKey()&& columnMaps[j].isPrimaryKey()&&key.equals(columnMaps[j].getRelatedName())){tables.add(tableMaps[i].getName());criteria.add(columnMaps[j].getFullyQualifiedName(),criteria.getValue(key));}}}}}Iterator tabIt = tables.iterator();while (tabIt.hasNext()){String tab = (String) tabIt.next();KeyDef kd = new KeyDef();HashSet whereClause = new HashSet();ColumnMap[] columnMaps = dbMap.getTable(tab).getColumns();for (int j = 0; j < columnMaps.length; j++) {ColumnMap colMap = columnMaps[j];/*原来的在BasePeer类中操作KeyDef加入列字段的代码if (colMap.isPrimaryKey()){kd.addAttrib(colMap.getColumnName());} */String key = new StringBuffer(colMap.getTableName()).append('.').append(colMap.getColumnName()).toString();if (criteria.containsKey(key)){if(criteria.getComparison(key).equals(Criteria.CUSTOM)){whereClause.add(criteria.getString(key));}else{//增加下列语句,是为了提供where子句中的限定,以利于删除数据.//这种修改就避免了表一定要有primarykey的限制.kd.addAttrib(colMap.getColumnName());whereClause.add(SqlExpression.build(colMap.getColumnName(),criteria.getValue(key),criteria.getComparison(key),criteria.isIgnoreCase(),db));}}}// Execute the statement.TableDataSet tds = null;try{tds = new TableDataSet(con, tab, kd);String sqlSnippet =StringUtils.join(whereClause.iterator()," AND ");if (log.isDebugEnabled()) {log.debug("BasePeer.doDelete: whereClause=" + sqlSnippet);}tds.where(sqlSnippet);tds.fetchRecords();if (tds.size() > 1 && criteria.isSingleRecord()) {handleMultipleRecords(tds);}for (int j = 0; j < tds.size(); j++) {Record rec = tds.getRecord(j);rec.markToBeDeleted();rec.save();}} catch (Exception e) {throwTorqueException(e);} finally{if (tds != null){try{tds.close();}catch (Exception ignored){}}}}}private static void throwTorqueException(Exception e) throws TorqueException {if (e instanceof TorqueException) {throw (TorqueException) e;}else {throw new TorqueException(e);}}这种修改解决了本问题,也彻底修正了上面遇到的2个问题.。
PBS作业调度系统

❖ 系统资源整合
异构系统的整合
❖ 多用户的管理
用户提交的任务的统一安排,避免冲突
❖ 用户权限的管理
非授权用户的控制
作业调度系统的简史
作业调度系统的分类
❖ 基于进程级别的调度
由机群中的操作系统或者运行时Runtime内部支持, 对运行的作业进行监控;以实现机群内的透明调度、 以及自动优化进程的分配和平衡负载
PBS 的基本原理
PBS 的优缺点
✓ 符合POSIX 1003.2d 标准 ✓ 支持系统级检查点功能
(需底层操作系统支持)
✓ 很好的大规模扩展性 ✓ 独立的调度模块 ✓ 支持作业依赖和用户映射
➢ 只支持Unix类操作系统 ➢ 多集群协作功能有限 ➢ 不支持用户级检查点功能
术语
❖ 节点(node)
❖ 编译设置
[root@node1 tmp]#./configure --set-server_home=/var/spool/pbs --enabledocs --enable-syslog
默认情况下,TORQUE将可执行文件安装在/usr/local/bin和/usr/local/sbin下。 其余的配置文件将安装在/var/spool/torque下
一个单一的操作系统映像,一个统一的虚拟内存映像一个个或多 个cpu,一个或多个IP地址的计算机系统被称之为一个节点。通常 执行主机(execution host)也被称之为节点。
❖ 节点属性
队列、服务器和节点都有与自己相关的属性,这些属性提供控制 信息。与节点相关的属性有:状态、类型、虚拟处理器的个数、 作业列表(本节点被分配给的作业)以及节点的特性。……
服务进程配置和启动文件
资源管理软件TORQUE 与作业调度软件Maui 的安装、设置及使用

资源管理软件TORQUE与作业调度软件Maui的安装、设置及使用李会民(hmli@)中国科学技术大学网络信息中心2008年1月目录1资源管理软件TORQUE的安装与设置21.1服务节点安装TORQUE (2)1.2服务节点初始化并设置TORQUE (2)1.3计算节点上安装TORQUE (4)1.4计算节点配置TORQUE (4)2安装与配置作业调度软件:Maui52.1服务节点上安装Maui (5)2.2服务节点上配置Maui (5)3作业运行63.1串行作业 (7)3.2并行作业 (8)3.3常用作业管理命令 (8)3.3.1查看队列中的作业状态:qstat (9)3.3.2挂起作业:qhold (10)3.3.3取消挂起:qrls (10)3.3.4终止作业:qdel和canceljob (10)3.3.5查看作业状态:checkjob (11)3.3.6交换两个作业的排队顺序:qorder (12)3.3.7选择符合特定条件的作业的作业号:qselect (12)3.3.8显示队列中作业的信息:showq (13)3.3.9显示节点信息:pbsnodes和qnodes (13)1资源管理软件TORQUE的安装与设置TORQUE和Maui可以从上下载。
以下仅是粗略配置,详细配置请参考相关手册:•TORQUE:/torquedocs21/•Maui:/products/maui/docs/mauiusers.shtml1.1服务节点安装TORQUE这里假设服务节点的机子名为kd50,其中一个计算节点的名字为node0101。
root@kd50#tar zxvf torque-2.2.1.tar.gzroot@kd50#cd torque-2.2.1root@kd50#./configure–prefix=/opt/torque-2.2.1–with-rcp=rcp上面–with-rcp=rcp设置为利用rsh协议在节点间传输文件,也可设置为–with-rcp=scp以利用scp协议进行传输。
MAUI实验指导书

MAUI实验指导书1.MAUI简介Maui是一个高级的作业调度器,它采用积极的调度策略优化资源的利用和减少作业的响应时间。
Maui的资源和伏在管理允许高级的参数配置:作业优先级(Job Priority)、调度和分配(Scheduling and Allocation)、公平性和公平共享(Fairness and Fairshare)、预留策略(Reservation Policy)。
Maui的QoS机制允许资源和服务的直接传递、策略解除(Policy Exemption)和指定特征的受限访问。
Maui采用高级的资源预留架构可以保证精确控制资源何时、何地、被谁、怎样使用。
Maui的预留架构完全支持非入侵式的元调度。
在集群系统中,作业管理系统是很重要的一个部分。
好的作业管理系统能够公平、合理地分配计算资源,杜绝资源浪费。
在小型的集群系统中,人们一般用Torque PBS作为作业管理系统,它本身自带一个管理工具——pbs_sched,该管理工具能够根据先进先出的原则安排作业,对一般的集群管理应该是足够了。
但如果集群有几十个节点,分成若干个队列,则pbs_sched就力不从心了。
为此,Torque推出了一个免费的管理软件maui,它能够实现多个队列、多个用户的作业管理,允许管理人员建立各种作业排队的规则,是一款很好的小型集群系统作业管理软件。
2.安装MAUI下面是它的安装简介,前提是先安装调试好Torque PBS 后,用maui替代pbs_sched。
①在管理节点上安装maui。
# /home/tgz/torque/maui-3.2.6p21/configure --with-pbs=usr/local# make# make install②修改ui的守护程序,并修改MAUI_PRFIX指定maui 所在路径。
# cp /home/tgztorque-3.2.6p21 /etc/maui.d /etc/init.d/# vi /etc/init.d/maui.dMAUI_PREFIX=/usr/local/maui③启动maui的守护程序。
GPU集群Torque排队系统使用手册

多媒体计算与通讯实验室GPU集群Torque排队系统使用手册袁平波 2016.5.20本实验室新购进24块K80 tesla GPU。
为了充分利用GPU计算资源,我们利用Torque来管理同学们的计算任务队列。
头结点的IP是192.168.17.240。
下面说明使用本GPU集群的几个步骤。
1.申请帐号.本集群有一个头结点和多个服务结点构成,因此提交计算作业需要在头结点上拥有帐号,需要使用集群的学生需要给我发一个申请邮件,同时cc给自己的导师,在导师批准后相应的帐号会被建立。
2.建立job脚本文件Torque管理系统不能直接提交二进制可执行文件,需要编写一个文本的脚本文件,来描述相关参数情况。
一个示例脚本文件myjob1.pbs如下:#PBS -N myjob1#PBS -o /home/username/myjob1.out#PBS -e /home/username/myjob1.err#PBS -l nodes=1:gpus=1:S#PBS -r ycd $PBS_O_WORKDIRecho Time is `date`echo Directory is $PWDecho This job runs on following nodes:cat $PBS_NODEFILEcat $PBS_GPUFILE./my_proc脚本文件中定义的参数默认是以#PBS开头的。
其中:-N 定义的是job名称,可以随意。
-o 定义程序运行的标准输出文件,如程序中printf打印信息,相当于stdout;-e 定义程序运行时的错误输出文件,相当于stderr。
-l 定义了申请的结点数和gpus数量。
nodes=1代表一个结点,一般申请一个结点,除非采用mpi并行作业;gpus=1定义了申请的GPU数量,根据应用实际使用的gpu数量来确定,S表示job类型,后面有详细描述。
队列系统的默认job请求时间是一周,如果运行的job时间估计会超过,则可以使用下面的参数:#PBS -l nodes=1:gpus=1:S,walltime=300:00:00表示请求300小时的job时间。
queue 常见实现 及 方法

queue 常见实现及方法queue是一种常见的数据结构,它是一种先进先出(First-In-First-Out,简称FIFO)的数据结构,常用于存储和管理多个元素。
在程序设计中,队列的实现可以有多种方法,下面将介绍两种常见的队列实现方法以及它们的方法。
一、数组实现队列数组是一种线性表结构,使用数组来实现队列是一种简单而常见的方法。
数组实现队列的关键是要确定队头和队尾的位置。
我们可以使用两个指针front和rear来指示队头和队尾的位置。
队头指针front指向队列的第一个元素,队尾指针rear指向队列的最后一个元素。
初始时,队头和队尾指针都指向-1,表示队列为空。
1. 入队操作(enqueue):当需要入队一个元素时,我们先判断队列是否已满,即判断rear 是否指向了队列的最后一个位置。
如果队列已满,则无法入队;否则,将元素插入到rear指向的位置,并将rear指针向后移动一位。
2. 出队操作(dequeue):当需要出队一个元素时,我们先判断队列是否为空,即判断front 和rear是否相等。
如果队列为空,则无法出队;否则,将队头元素取出,并将front指针向后移动一位。
3. 判断队列是否为空:当队头和队尾指针相等时,表示队列为空。
4. 判断队列是否已满:当rear指针指向了队列的最后一个位置时,表示队列已满。
二、链表实现队列链表是一种非连续的数据结构,使用链表来实现队列也是一种常见的方法。
链表实现队列的关键是要维护一个指向队头和队尾的指针。
我们可以使用两个指针head和tail来指示队头和队尾的位置。
初始时,head和tail都指向空。
1. 入队操作(enqueue):当需要入队一个元素时,我们先创建一个新的节点,并将元素存储在节点中。
然后,将新节点链接到链表的尾部,并将tail指针指向新节点。
2. 出队操作(dequeue):当需要出队一个元素时,我们先判断队列是否为空,即判断head 和tail是否都指向空。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Torque创建队列
安装完torque后默认只有一个batch队列,所有节点都属于batch队列
有些情况下客户需要创建不同队列,来限制节点资源的使用
以一个18节点的集群为例
创建一个short队列,队列节点资源限制在node11,node12,node13,node14此4台机器
1,创建队列
[root@m1 server_priv]# qmgr -c "create queue short queue_type=execution"
2,定义队列必须属性
[root@m1 server_priv]# qmgr -c "set queue short enabled = True"
[root@m1 server_priv]# qmgr -c "set queue short started = True"
3,指定可用节点资源
修改/usr/local/inspur/server_priv/nodes文件如下
node1 np=12
node2 np=12
node3 np=12
node4 np=12
node5 np=12
node6 np=12
node7 np=12
node8 np=12
node9 np=12
node10 np=12
node11 np=12 short
node12 np=12 short
node13 np=12 short
node14 np=12 short
node15 np=12
node16 np=12
node17 np=12
node18 np=12
执行命令
[root@m1 server_priv]# qmgr -c "set queue short resources_default.neednodes=short"
要使操作生效需要重启pbs_server
先停掉pbs_server
[root@m1 server_priv]# qterm -t quick
再启动pbs_server
[root@m1 server_priv]# pbs_server
4,测试队列,向队列里提交作业
[inspur@m1 wtk]$ qsub hello.pbs -q short
查看状态
[inspur@m1 wtk]$ watch qstat -n
Every 2.0s: qstat -n Wed Jun 22 15:38:54 2011
m1:
Req'd Req'd Elap
Job ID Username Queue Jobname SessID NDS TSK Memory Time S Time
-------------------- -------- -------- ---------------- ------ ----- --- ------ ----- - -----
21.m1 inspur short hello 2531 4 -- -- 12:00 R --
node14/1+node14/0+node13/1+node13/0+node12/1+node12/0+node11/1+node11/0
5,删除队列
用以下命令删除
[root@m1 server_priv]# qmgr -c "del queue short"
对于队列其他资源限制,可以参考手册,以下也列出一些
队列最大作业数量(包含运行的和排队的):
qmgr -c "set queue short max_queuable=20"
队列最大运行作业数量(不包含排队的):
qmgr -c "set queue short max_running=20"
一个用户最大作业数量
qmgr -c "set queue short max_user_queuable=20"
一个用户最大运行作业数量(不包含排队的):
qmgr -c "set queue short max_user_run=10"
一个用户单个作业最大使用cpu核心数量(不包含排队的):
set queue long resources_max.ncpus = 2
指定队列的优先级:
qmgr -c "set queue short priority=20"
指定队列中所有作业可用的最大计算节点数量:
qmgr -c "set queue short resources_available.nodect=20"
指定队列中单个提交的作业的最大计算节点数量:
qmgr -c "set queue short resources_max.nodect=16"
允许提交作业的机器
qmgr -c "set queue batch acl_hosts=h1+h2+h3"
qmgr -c "set queue batch acl_host_enable=true"
set server acl_hosts = sn
set server acl_hosts += jn
set server acl_hosts += mn
set server acl_roots = root
set server managers = root@mn
set server operators = daihj@*
set server operators += inspur@* 让普通用户qsta 查看所有作业
set server operators += liqing@*
set server operators += root@*
set server operators += sunych@*
set server operators += zhjx@*
set server default_queue = batch
set server log_events = 511
set server mail_from = adm
set server scheduler_iteration = 600
set server node_check_rate = 150
set server tcp_timeout = 6
set server keep_completed = 30
set server submit_hosts = mn
set server submit_hosts += jn
set server submit_hosts += sn
set server auto_node_np = True
set server next_job_number = 458m
qmgr -c "set server operators -= zhangyun@*" 减去一个属性。