Parallel processing 强制SGE使用多个服务器

Parallel processing 强制SGE使用多个服务器,parallel-processing,cluster-computing,sungridengine,Parallel Processing,Cluster Computing,Sungridengine,TL;DR:有没有办法让SGE在调度作业时在服务器之间进行循环,而不是尽可能将所有作业分配给同一台服务器 详情: 我有一个由许多小任务组成的大型计算过程。我使用SGE将工作分布到集群中的多个服务器上 该过程需要在不同的时间点执行不同数量的任务(从技术上讲,这是一个DAG作业)。有时并行作业的数量非常大(集群中每个CPU约1个),有时则小得多(每个服务器约1个)。DAG是动态的且不统一的,因此很难判断在任何给定点有多少并行作业 这些作业使用大量CPU,但也会执行一些不寻常的IO(特别是在作业启动和

TL;DR:有没有办法让SGE在调度作业时在服务器之间进行循环,而不是尽可能将所有作业分配给同一台服务器

详情:

我有一个由许多小任务组成的大型计算过程。我使用SGE将工作分布到集群中的多个服务器上

该过程需要在不同的时间点执行不同数量的任务(从技术上讲,这是一个DAG作业)。有时并行作业的数量非常大(集群中每个CPU约1个),有时则小得多(每个服务器约1个)。DAG是动态的且不统一的,因此很难判断在任何给定点有多少并行作业

这些作业使用大量CPU,但也会执行一些不寻常的IO(特别是在作业启动和关闭时)。它们访问连接到所有计算服务器的共享NFS服务器。每个计算服务器都有一个较窄的连接(10Gb/s),但NFS服务器在通信交换机中有几个较宽的连接(40Gbs)。不确定交换机主干网的带宽是多少,但它是一个怪物,所以应该很高

为了获得最佳性能,应尽可能跨不同的服务器调度作业。也就是说,如果我有20台服务器,每个服务器都有20个处理器,提交20个作业应该在每个服务器上运行一个作业。提交40个作业应在每个作业上运行2个作业,以此类推。提交400个作业将使整个集群饱和

然而,SGE却执意要最小化我的I/O性能。提交20个作业将在一台服务器上安排所有作业。因此,当其他19台带宽为190Gb的机器处于空闲状态时,他们都在为一个微不足道的10Gb网络连接而斗争

我可以强制SGE在不同的服务器上以多种方式执行每个作业(使用资源、使用特殊队列、使用我的并行环境和指定“-t1-”等)。但是,这意味着每台服务器只能运行一个作业,period。当DAG打开并生成许多作业时,作业将暂停等待完全空闲的服务器,而每台机器的20个处理器中有19个将保持空闲

我需要的是一种方法,告诉SGE将每个作业分配给下一个具有循环顺序的可用插槽的服务器。更好的方法是将作业分配给负载最少的服务器(最大数量的未使用插槽,或最大比例的未使用插槽,或最小数量的已使用插槽,等等)。但是一个简单的循环就可以了

与SGE将每个作业与上一个作业运行在同一台服务器上的策略相比,这似乎是一个更为明智的策略,对于我来说,这几乎是最糟糕的策略

我查看了SGE的配置选项,但找不到任何修改调度策略的方法。也就是说,SGE的文档并不容易浏览,所以我可能很容易错过一些东西

有人知道有什么方法可以让SGE将其调度策略更改为循环调度或负载最少或类似的方式吗


谢谢

只需将SGE并行环境的
分配规则
更改为
$round\u robin
SGE\u pe
文件):

分配规则
分配规则由调度程序线程解释
并帮助调度器决定如何并行分发
可用计算机之间的进程。例如,如果
并行环境是为共享内存应用程序构建的
只是,所有并行进程都必须分配给单个
机器,无论有多少合适的机器可用。
但是,如果并行环境遵循发行版-
但是记忆范式,进程的均匀分布
这些机器可能是有利的。
计划程序的当前版本仅理解
以下分配规则:
:固定进程数的整数
每个主机。如果数字为1,则所有进程都有
驻留在不同的主机上。如果特别
使用分母$pe_插槽,所有
qsub(1)-pe开关规定的过程
必须在单个主机上分配(无论
最后选择属于该范围的哪个值
为要分配的作业选择)。
$fill_up:从最合适的主机/队列开始,所有
已分配可用插槽。其他主机和
只要一个作业仍然存在,队列就会被“填满”
需要用于并行任务的插槽。
$round_robin:
从所有合适的主机分配一个插槽
直到并行作业请求的所有任务完成为止
派遣。如果要求的任务多于适合的任务-
找到可分配的主机后,将从
第一位主持人。分配办法
通过合适的主机以最合适的方式运行
秩序。

来源:

这至少给了你一些希望。在我们的Univa网格引擎集群上,我的作业分散在整个集群中,似乎是随机的。我没有使用任何qsub选项来控制计算节点上作业的位置。但是,我不知道集群配置的细节——我不是系统管理员。我从来没有想到这会是在每环境设置中。回想起来,这是完全有道理的。非常感谢!更新:$round_robin不起作用。提交作业数组时,它在插槽之间而不是作业之间进行循环。也就是说,第一个作业在一台机器上获得1个插槽,在另一台机器上获得1个插槽。。。第二个作业在一台机器上获得1个插槽,在另一台机器上获得1个插槽。。。实际上需要的是$round_-robin和$pe_插槽的组合,即每个作业的插槽将位于一台机器上,循环将只在作业之间应用,而不在插槽之间应用
allocation_rule

     The allocation rule is interpreted by the  scheduler  thread
     and helps the scheduler to decide how to distribute parallel
     processes among the available machines. If, for instance,  a
     parallel environment is built for shared memory applications
     only, all parallel processes have to be assigned to a single
     machine, no matter how much suitable machines are available.
     If, however, the parallel environment  follows  the  distri-
     buted  memory  paradigm,  an  even distribution of processes
     among machines may be favorable.
     The current version of the scheduler  only  understands  the
     following allocation rules:

<int>:    An integer number fixing the number  of  processes
           per  host.  If the number is 1, all processes have
           to reside  on  different  hosts.  If  the  special
           denominator  $pe_slots  is used, the full range of
           processes as specified with the qsub(1) -pe switch
           has  to  be  allocated on a single host (no matter
           which value belonging  to  the  range  is  finally
           chosen for the job to be allocated).

$fill_up: Starting from the best  suitable  host/queue,  all
          available  slots  are allocated. Further hosts and
          queues are "filled up" as  long  as  a  job  still
          requires slots for parallel tasks.

$round_robin:
          From all suitable hosts a single slot is allocated
          until  all tasks requested by the parallel job are
          dispatched. If more tasks are requested than suit-
          able hosts are found, allocation starts again from
          the  first  host.  The  allocation  scheme   walks
          through  suitable  hosts  in a best-suitable-first
          order.