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以多种方式在不同的服务器上执行每个作业(使用资源,使用特殊队列,使用我的并行环境并指定'-t 1-'等)。但是,这意味着我只能在每个服务器上运行一个作业。当DAG打开并产生许多作业时,作业将停止等待完全免费的服务器,而每台机器的20个处理器中的19个将保持空闲状态。
我需要的是一种告诉SGE将每个作业分配给下一个具有循环顺序的可用插槽的服务器的方法。更好的方法是将作业分配给负载最小的服务器(未使用的插槽的最大数量,或未使用的插槽的最大部分,或最小的已用插槽数量等)。但是一个死的简单循环法可以解决这个问题。
与SGE在同一台服务器上运行每项工作的策略相比,这似乎是一种更为明智的策略,这与我之前的工作相比,这只是最糟糕的策略。
我查看了SGE的配置选项,但我找不到任何修改调度策略的方法。也就是说,SGE的文档并不容易导航,所以我很容易错过一些东西。
有没有人知道如何让SGE将其调度策略更改为循环或最少负载或沿着这些线路的任何内容?
谢谢!
只需将allocation_rule
更改为$round_robin
即可获得SGE并行环境(sge_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.
资料来源:http://gridscheduler.sourceforge.net/htmlman/htmlman5/sge_pe.html