Заставить SGE использовать несколько серверов - PullRequest
2 голосов
/ 10 марта 2019

TL; DR: есть ли способ заставить SGE выполнять циклический перебор между серверами при планировании заданий вместо выделения всех заданий одному и тому же серверу, когда это возможно?

Подробности:

У меня большой вычислительный процесс, состоящий из множества небольших заданий.Я использую SGE для распределения работы по нескольким серверам в кластере.

Этот процесс требует различного количества задач в разные моменты времени (технически это группа данных).Иногда количество параллельных заданий очень велико (~ 1 на процессор в кластере), иногда оно намного меньше (~ 1 на сервер).Группа обеспечения доступности баз данных является динамической и неоднородной, поэтому нелегко определить, сколько параллельных заданий существует / будет в любой заданной точке.

Задания используют много ресурсов ЦП, но также выполняют несколько нетривиальных операций ввода-вывода.(особенно при запуске и завершении работы).Они получают доступ к общему NFS-серверу, подключенному ко всем вычислительным серверам.Каждый вычислительный сервер имеет более узкое соединение (10 Гбит / с), но NFS-сервер имеет несколько широких подключений (40 Гбит / с) к коммутатору связи.Не уверен, какова пропускная способность магистрали коммутатора, но это монстр, поэтому он должен быть высоким.

Для оптимальной производительности задания должны планироваться на разных серверах , когда это возможно .То есть, если у меня 20 серверов, каждый с 20 процессорами, отправка 20 заданий должна запускать по одному заданию на каждом.Отправка 40 заданий должна выполняться по 2 на каждом и т. Д. Отправка 400 заданий приведет к насыщению всего кластера.

Однако SGE извращенно стремится минимизировать производительность ввода-вывода.Отправка 20 заданий запланирует их все на одном сервере.Таким образом, все они борются за одно ничтожное сетевое подключение 10 Гбит, когда 19 других машин с пропускной способностью 190 Гбит бездействуют.

Я могу заставить SGE выполнить каждое задание на другом сервере несколькими способами(использование ресурсов, использование специальных очередей, использование моей параллельной среды и указание '-t 1-' и т. д.).Однако это означает, что я смогу выполнять только одно задание на сервер, period .Когда DAG открывается и порождает много заданий, задания останавливаются в ожидании полностью свободного сервера, в то время как 19 из 20 процессоров каждой машины будут простаивать.

Мне нужен способ сообщить SGE:назначить каждую работу следующему серверу, имеющему свободный слот в порядке кругового выбора.Лучшим способом было бы назначить задание на наименее загруженный сервер (максимальное количество неиспользуемых слотов, или максимальная доля неиспользуемых слотов, или минимальное количество используемых слотов и т. Д.).Но мёртвый простой циклический перебор подойдет.

Это выглядит как гораздо более разумная стратегия в целом , по сравнению с политикой SGE по выполнению каждого задания на том же сервере, что и предыдущийзадание, которое является едва ли не худшей стратегией для моего случая.

Я просмотрел параметры конфигурации SGE, но не смог найти способ изменить стратегию планирования.Тем не менее, документация SGE не совсем проста в навигации, поэтому я мог бы легко что-то пропустить.

Кто-нибудь знает о любом способе заставить SGE изменить свою стратегию планирования на круговую?Робин или наименее загруженный или что-нибудь по этим направлениям?

Спасибо!

1 Ответ

1 голос
/ 11 марта 2019

Просто измените 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

...