Назад | Перейти на главную страницу

Как зарезервировать полные узлы на Sun Grid Engine?

Как вы используете SGE для резервирования полных узлов в кластере?

Мне не нужны 2 процессора от одной машины, 3 процессора от другой и так далее. У меня есть четырехъядерный кластер, и я хочу зарезервировать 4 полных машины, каждая из которых имеет 4 слота. Я не могу просто указать, что мне нужно 16 слотов, потому что это не гарантирует, что у меня будет 4 слота на 4 машинах каждый.

Менять правило распределения на FILL_UP недостаточно, потому что, если нет полностью бездействующих машин, SGE просто «заполнит» наименее загруженные машины в максимально возможной степени вместо того, чтобы ждать 4 простаивающих машины и затем планирование задачи.

Есть ли способ сделать это? Есть ли лучшее место, чтобы задать этот вопрос?

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

https://web.archive.org/web/20101027190030/http://wikis.sun.com/display/gridengine62u3/Configuring+Exclusive+Scheduling

Другая возможность, которую я рассмотрел, но весьма подверженная ошибкам, - это использовать qlogin вместо qsub и вручную зарезервировать 4 слота на каждой желаемой четырехъядерной машине. Понятно, что автоматизировать это не так уж легко и весело.

Наконец, возможно, это ситуация, когда можно использовать группы хостов. Так, например, создание группы хостов с 4 четырехъядерными машинами в ней, а затем qsubbing к этому конкретному подмножеству очереди, запрашивая количество процессоров, равное максимальному общему количеству в группе. К сожалению, это похоже на жесткое кодирование и имеет много недостатков, например, приходится ждать, пока люди освободят конкретную жестко запрограммированную группу хостов, и требовать изменений, если вы хотите переключиться на 8 вместо 4 машин и т. Д.

Похоже, есть этот скрытый запрос командной строки, который нужно добавить:

-l excl=true

Но вы должны настроить его в свой SGE или OpenGridScheduler, добавив его в список сложных значений (qconf -mc) и включив каждый отдельный хост (qconf -me hostname)

подробности см. по этой ссылке: http://web.archive.org/web/20130706011021/http://docs.oracle.com/cd/E24901_01/doc.62/e21978/management.htm#autoId61

В итоге:

тип:

qconf -mc

и добавьте строку:

exclusive    excl      BOOL      EXCL   YES          YES          0        1000

затем:

qconf -me <host_name>

и отредактируйте затем строку complex_values, чтобы она читалась:

complex_values        exclusive=true

Если у вас уже есть какие-либо комплексные_значения для конкретного хоста, просто разделите их запятыми.

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

Я пытаюсь делать почти то же самое и ищу идеи. Я думаю, что pe_hostsfile - лучший вариант, но я не являюсь менеджером нашей системы SGE, и файлы hosts не настроены, поэтому мне нужно быстро решить эту проблему. Просто проверил ссылку Настройка эксклюзивного планирования и убедитесь, что для этого также требуются права управления ...

Я думаю, что сценарий-оболочка может это сделать. Я написал однострочную программу bash, чтобы определить количество доступных ядер, оставшихся на машине (см. Ниже). Наша сетка неоднородна: один узел имеет 24 ядра, около 8 и большинство только 4, что немного затрудняет работу.

В любом случае, вот этот однострочный bash.

n_processors=`qhost | awk 'BEGIN{name="'\`hostname\`'"} ; {if($1==name){print int($3)-int($4+0.99)}}'`

Проблема теперь в том, как включить эту переменную bash в директиву предварительной обработки сценария запуска SGE ?? Возможно, я просто предоставлю следующий аргумент в моем сценарии оболочки, поскольку среда pvm поставляется с SGE. Но это не значит, что он настроен ...

#$ -pe pvm 24-4

Страница Sun по управлению параллельными средами довольно полезен, хотя, опять же, инструкции в основном предназначены для администраторов.

Мы устанавливаем правило распределения на количество слотов, доступных на узле (в данном случае 4). Это означает, что вы можете запускать задания только с n * 4 процессорами, но при этом будет достигнут желаемый результат: 16 процессоров будут выделены как 4 узла с 4 процессорами в каждом.

Укажите правило распределения в конфигурации PE как $ pe_slots

Это приведет к тому, что все слоты будут выделены на одном хосте.

Я наконец нашел ответ на это. Сначала я использовал вышеуказанный -l excl=True настройте, как описано выше. Однако это не совсем решает проблему.

Чтобы полностью решить проблему, мне пришлось настроить и дополнительный pe_environment. В моем кластере у нас есть 12 основных узлов. Я буду использовать это в качестве примера.

Я создал дополнительную среду под названием mpich2_12. Вставлено ниже ..

pe_name            mpich_12
slots              999
user_lists         sge_user
xuser_lists        NONE
start_proc_args    /opt/gridengine/mpi/startmpi.sh -catch_rsh $pe_hostfile
stop_proc_args     /opt/gridengine/mpi/stopmpi.sh
allocation_rule    12
control_slaves     TRUE
job_is_first_task  FALSE
urgency_slots      min
accounting_summary TRUE

Обратите внимание, что для параметра allocation_rule установлено значение 12, это означает, что задание ДОЛЖНО использовать 12 ядер на узле. Если вы отправите задание, запрашивающее 48 процессоров, оно будет ждать и захватить 4 ПОЛНЫХ узла, когда они станут доступны.

Я все еще использую -l excl=True вариант, но я подозреваю, что сейчас это не имеет значения.

Если у меня есть задания, для которых требуется только один процессор (а я это делаю), я отправляю их в ту же очередь, но без -l exel=True вариант, и я использую свой оригинальный pe_environment который имеет allocation_rule = 'fillup' Любое задание, представленное в среде mpich_12, будет ждать, пока не освободятся все узлы. Мой кластер теперь работает намного лучше.