(五)SGE 命令 (1)qsub

目录

(一)说明

(二)默认作业选项与$HOME/.sge_request文件

(三)指定输出

(四)指定主机

(五)指定资源

1 资源描述

a 定义资源属性

b 覆盖属性

(六)SGE pseudo comments

(七)SGE job environment

继承的作业环境

(八)Dot file(隐藏文件)

(九)检查提交作业的执行情况

(十)示例

1

2


(一)说明

作业被批处理服务器接收,调度器将抉择执行的节点并通知批处理服务器,批处理服务器将通知qsub是否可以运行该作业。然后将当前状态(任务调度是否成功)返回给用户。你可以使用含有命令的文件或STDIN标准输入作为qsub的输入。

SGE中的作业表示在集群中的一个节点(或多个节点)上执行的任务,每一个作业可以指定资源的需求。一般情况下,只要集群中有节点能够满足资源的需求,并不太关心任务最终运行的物理节点。

注: 所有的作业需求至少一个可用的slot,slot并能再被切分为更小的分数。

示例执行hostname作为一个小作业,用户的UID小于100将不能进行作业的提交。这样也就限制了root用户并不能提交任务。下面的示例通过使用用户sgeadmin进行演示。

sgeadmin@master:~$ qsub -o /Apps/myputput.txt -b y -cwd -q all.q@b1 hostname
Your job 1 ("hostname") has been submitted
  • -o <outputfile> 如果你想在当前节点查看该文件,你可以使用NFS挂载相应的路径文件到各个节点。如果忽略掉该选项,那么默认情况下该任务的输出到用户家目录下的<job-name>.o<job-id>格式的文件中。如果指定-cwd则会在生成在当前路径下。如果指定了-o选项则会生成到-o选项指定的路径下。
  • -e <errorfile> 同以上一样。

以下是文件名称格式的示例:

 -rw-r--r--. 1 bezroun bezroun 167 Nov 6 17:17 simple.sh.o5 
 -rw-r--r--. 1 bezroun bezroun 212 Nov 6 17:17 simple.sh.e5 
 -rw-r--r--. 1 bezroun bezroun 118 Nov 6 17:06 hostname.o3 
 -rw-r--r--. 1 bezroun bezroun 212 Nov 6 17:06 hostname.e3
  • -b 相当于是辨认qsub执行的任务是可执行的二进制文件还是bash的脚本。在示例中,hostname作为一个单独的二进制可执行文件,所以y。如果是一个bash的脚本则n

  • -cwd 及任务的执行在执行任务所在的当前路径下执行。

  • -q 指定队列及任务运行的节点。示例中是在all.q队列的b1节点上运行。

  • -pe <并行环境> [<核心数量>]。指定并行作业需要的核心数量。

    • 重要:如果在提交的文件中写入#$ -pe smp 4这样的参数,并且指定运行的节点上拥有更多的核心数量,要成功提交,必须满足以下两点条件:

      • 该队列应该指定该节点可用的核心数量;
      • PE应该有$full_up的分配策略;
  • 最有一个参数则是qsub需要提交执行的命令。示例中是hostname

(二)默认作业选项与$HOME/.sge_request文件

如果你的工作中总是包含相同的选项(例如电子邮件通知),你可以自动包含这些选项。通常至少指定两个选项。

  • -m aes,通知类型,将作业状态(完成、挂起、取消)通过邮件方式通知作业所有者。
  • -M <邮件地址>

为了实现以上的需求,需要创建$HOME/.sge_request,内容示例:

# mail me when the job starts & ends
 -M dummy@example.com
 -m be

# pass through some environment variables
 -v PYTHONPATH

# pass through ALL environment variables
# -V
# use multiple cores
# NOTE: Divide h_vmem by the number of cores you request (e.g. 2)
 -pe smp 2

注:

  • 在每一个选项之前应该有一个空格

  • -V选项使得任务执行节点的环境变量和qsub提交节点的环境变量拥有相同的环境变量。

    • ##$ -V 传递当前的环境变量。

(三)指定输出

以下三个选项控制输出流:

  • -e path_list 指定标准错误输出流。
  • -j y[es]|n[o] 合并作业的标准输出和标准错误流。
  • -o path_list 指定标准输出流。

除非指定了-e或者-o选项,系统默认将标准输出和标准错误输出到用户的家目录。任务其他任务执行过程中生成的文件,将会输出到任务执行的路径下。除非特别指定了生成文件的存储路径。

作业的stdout和stderr文件以作业命名,扩展名以作业编号结尾。

示例:

sgeadmin@master:~$ ls hostname.*
hostname.e1 hostname.o1
sgeadmin@master:~$ cat hostname.o1
b1
sgeadmin@master:~$ cat hostname.e1
sgeadmin@master:~$

(四)指定主机

如果没有指定队列,作业将被提交到all.q队列。可以指定队列并不指定主机,可以指定主机,也可以指定主机组。

qsub -q queue_name  job
qsub -q queue_name@host_name  job
qsub -q queue_name@@hostgroup_name  job

可以使用正则表达式(单引号)指定主机。例如,请求给定组中的任何主机,而不考虑队列名:

qsub -q '*@@hostgroup_name'  job

(五)指定资源

选项-l接受由逗号分隔的resource=键值对。该选项仅对qsub、qsh、qrsh、qlogin、qalter生效。

在一个命令中可以多次使用-l选项。在同一个命令行中,对于串行作业,多个-l选项细化所查找队列的定义。您可以使用此选项指定主机名。例如:

qsub -l hostname='p6.hpc.firma.com' ...

1 资源描述

Sun Grid Engine复合对象定义了用于配置全局、主机和队列对象的所有条目。系统有一组预先定义的条目,按照默认值分配给主机或队列。

a 定义资源属性

不应当直接访问复合的配置,为了简便起见,可通过qconf -Mc和-mc来进行配置。-Mc使用复合的配置文件覆盖当前的配置。-mc启动一个复合配置编辑器。

所提供的列表包含系统中所有资源属性的定义。添加一个新的条目意味着添加条目的如下属性(name, shortcut, type, relop, requestable, consumable, default, urgency)

可简单的对字段进行更新即可实现对资源的更新。移除相应的条目即可实现对资源类型的删除,但是,一个资源类型被删除的前提是并不被队列或者主机引用。系统默认的资源条目不能被删除并且,资源的类型也不能被更改。

只有在资源属性被添加到全局、主机或队列之后,才能使用该类型的资源进行相应的作业。资源属性只针对相应的对象存在。如果是global(qconf -me global),那么在整个系统层面生效。如果是主机(qconf -me NAME)或者队列(qconf -mq Name)。

当用户把增加的资源属性添加到相应的对象上时,也必须给该对象指定该类型资源的具体值及相应的限制。获得资源属性值的另一种方法是为该属性配置负载传感器。

它的默认形式包含队列配置中参数的选择,如queue_conf(5)中定义的。在原则上,用户可以为一个作业请求的队列配置参数是:

  • qname
  • hostname
  • notify
  • calendar
  • min_cpu_interval
  • tmpdir
  • seq_no
  • s_rt
  • h_rt
  • s_cpu
  • h_cpu
  • s_data
  • h_data
  • s_stack
  • h_stack
  • s_core
  • h_core
  • s_rss
  • h_rss

主机资源默认属性与主机相关的标准属性集合包括两类。第一类是由几个队列配置属性构建的,这些属性特别适合在主机基础上进行管理:

  • slots
  • s_vmem
  • h_vmem
  • s_fsize
  • h_fsize

注:

在宿主程序中定义这些属性与在队列配置中也定义它们并不矛盾。它允许在主机级别上维护相应的资源,同时在队列级别上维护相应的资源。例如,可以为主机管理总的虚拟空闲内存(h_vmem),总内存的一个子集可以与该主机上的一个队列相关联。

标准主机综合体中的第二个属性类别是默认的负载值。每个sge_execd(8)定期向sge_qmaster(8)报告负载。报道系统负载值,如CPU平均负载。

b 覆盖属性

可以同时将一个属性赋给全局对象、主机对象和队列对象。在主机级别,它可能从用户定义的资源限制和负载传感器获取值。如果属性是一个可消耗的属性,我们除了有资源限制和它在主机级别的负载报告之外,还有系统跟踪的内部使用情况。合并操作如下:

通常,属性可以在较低的级别上重写:

  • 全局配置受到主机和队列的限制;
  • 主机受到队列、负载和资源的限制。

对资源限制的覆盖与操作符有关:

  • !=、==操作符只能在同级别被覆盖。例如用户定义的值可以覆盖系统加载的值。
  • = 、<=操作符只能被更严格的值覆盖。

注意

Sun Grid Engine允许使用反斜杠()来转义换行符(\newline)。反斜杠和换行符在解释之前用一个空格(" ")字符替换。

(六)SGE pseudo comments

通过SGE提交的脚本可以有伪注释,这些伪注释将由SGE处理,并设置类似于SGE命令本身的选项。下面是这样一个例子,在一个简单的工作脚本中,以“#$”开头:

$ cat sleep.sh
#!/bin/bash
#
#$ -cwd
#$ -j y
#$ -S /bin/bash
#
date
sleep 10
date
  • -cwd 执行任务在当前路径。
  • -j 合并标准输出和错误输出到一个输出流。
  • -S 指定shell解释器。

对于并行MPI作业脚本,请查看这个脚本linpack.sh。注意,您需要在作业脚本中放入两个SGE变量,$NSLOTS和$TMP/machines。

$ cat linpack.sh
#!/bin/bash
#
#$ -cwd
#$ -j y
#$ -S /bin/bash
#
MPI_DIR=/opt/mpich/gnu/
HPL_DIR=/opt/hpl/mpich-hpl/


# OpenMPI part. Uncomment the following code and comment the above code
# to use OpemMPI rather than MPICH


# MPI_DIR=/opt/openmpi/
# HPL_DIR=/opt/hpl/openmpi-hpl/

$MPI_DIR/bin/mpirun -np $NSLOTS -machinefile $TMP/machines \
        $HPL_DIR/bin/xhpl

提交并行作业你需要使用-pe mpich N。N表示要分配给MPI程序的进程数。以下示例分配两个进程:

$ qsub -pe mpich 2 linpack.sh
your job 17 ("linpack.sh") has been submitted

删除已经提交的job:

$ qsub fluent.sh
your job 31 ("fluent.sh") has been submitted
$ qstat
job-ID  prior name       user         state submit/start at     queue      master  ja-task-ID
---------------------------------------------------------------------------------------------
     31     0 fluent.sh  sysadm1      t     12/24/2003 01:10:28 comp-pvfs- MASTER
$ qdel 31
sysadm1 has registered the job 31 for deletion
$ qstat
$

虽然示例作业脚本是bash脚本,但SGE也可以接受其他类型的shell脚本。将串行程序封装到SGE作业脚本中是很简单的。类似地,对于MPI并行作业,您只需要使用正确的mpirun启动器,并在作业脚本中添加两个SGE变量,$NSLOTS和$TMP/machines。对于MPI以外的其他并行作业,需要定义并行环境或PE。这在SGE文档中有涉及。

(七)SGE job environment

1 继承的作业环境

  • execd-shepherd-shell-job

    • 作业提交的环境设置覆盖shepherd的环境设置(该处理解为默认全局的环境配置)。
    • 用户环境设置覆盖shell的环境设置。
  • INHERIT_ENV默认设置为True

(八)Dot file(隐藏文件)

作业提交的默认设置等级:

$SGE_ROOT/$SGE_CELL/common/sge_request
$HOME/.sge_request
$PWD/.sge_request

(九)检查提交作业的执行情况

  • qhost
  • qstat

(十)示例

1

#!/bin/bash
#
# Usage: sleeper.sh [time]]
#        default for time is 60 seconds

# -- our name ---
#$ -N Sleeper1
#$ -S /bin/sh
# Make sure that the .e and .o file arrive in the
# working directory
#$ -cwd
#Merge the standard out and standard error to one file
#$ -j y
/bin/echo Here I am: `hostname`. Sleeping now at: `date`
/bin/echo Running on host: `hostname`.
/bin/echo In directory: `pwd`
/bin/echo Starting on: `date`
# Send mail at submission and completion of script
#$ -m be
#$ -M deadline@kronos
time=60
if [ $# -ge 1 ]; then
   time=$1
fi
sleep $time

echo Now it is: `date` 

2

#!/bin/sh
#
# EXAMPLE MPICH SCRIPT FOR SGE
# Modified by Basement Supercomputing 1/2/2006 DJE
# To use, change "MPICH_JOB", "NUMBER_OF_CPUS"
# and "MPICH_PROGRAM_NAME" to real values.
#
# Your job name
#$ -N MPICH_JOB
#
# Use current working directory
#$ -cwd
#
# Join stdout and stderr
#$ -j y
#
# pe request for MPICH. Set your number of processors here.
# Make sure you use the "mpich" parallel environment.
#$ -pe mpich NUMBER_OF_CPUS
#
# Run job through bash shell
#$ -S /bin/bash
#
# The following is for reporting only. It is not really needed
# to run the job. It will show up in your output file.
echo "Got $NSLOTS processors."
echo "Machines:"
cat $TMPDIR/machines
# Adjust MPICH procgroup to ensure smooth shutdown
export MPICH_PROCESS_GROUP=no
#
# Use full pathname to make sure we are using the right mpirun
/opt/mpi/tcp/mpich-gnu3/bin/mpirun -np $NSLOTS -machinefile $TMPDIR/machines MPICH_PROGRAM_NAME

 

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IForFree

整理不易,望多支持!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值