强制SGE使用多个服务器

时间:2019-03-10 15:29:17

标签: parallel-processing cluster-computing sungridengine

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的网络连接而战。

我可以强制以多种方式(使用资源,使用特殊队列,使用并行环境以及指定“ -t 1-”等)在不同的服务器上执行每个作业。但是,这意味着我只能在每个服务器上期间运行一个作业。当DAG打开并产生许多作业时,这些作业将停止等待完全免费的服务器,而每台计算机的20个处理器中有19个将保持空闲状态。

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

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

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

有人知道任何方法使SGE沿着这些路线将其调度策略更改为轮询或最小负载或任何吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

对于SGE并行环境(allocation_rule文件),只需将$round_robin更改为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