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