Строка ресурса LSF «заказ»

Я пытался отправить задания на наименее используемые машины в LSF, используя

bsub -R "order[ut]"

Он работает, как и ожидалось, но все задания (отправляемые подряд) заканчиваются на одном и том же хосте (наименее используемом) и, таким образом, сильно нагружают машину, что в конечном итоге приводит к снижению производительности работы. Есть ли способ распределить задания, представленные последовательно, между наименее используемыми машинами? Или способ выяснить, сколько слотов используется на машине?


person Jean    schedule 24.03.2015    source источник


Ответы (1)


Трудно сказать наверняка, основываясь на вашем описании, но я предполагаю, что то, что вы видите, является эффектом, вызванным природой цикла планирования LSF. Вот выдержка из документации LSF о строке заказа:

http://www-01.ibm.com/support/knowledgecenter/SSETD4_9.1.3/lsf_admin/order_string.dita

Предположим, что узел h1 существует в кластере и имеет 110 единиц расходуемого ресурса «res», а узел h2 имеет 20 единиц этого ресурса (например, «res» может быть новым пакетом встроенных слотов ресурсов). Предположим, что эти два задания находятся в ожидании и рассматриваются планировщиком в одном и том же цикле планирования, и задание1 будет запланировано первым:

Job1: bsub -R "maxmem>1000" -R "order[res] rusage[res=100]" -q q1 sleep 10000

Job2: bsub -R «mem‹1000» -R «order[res] rusage[res=10]» -q q2 sleep 10000

В начале цикла планирования список возможных хостов строится, беря либо все хосты в кластере, либо хосты, перечисленные в любом запрошенном списке хостов (-m), и упорядочивая их в соответствии с порядковым разделом строки требований к ресурсам. Предположим, что упорядоченные списки хостов-кандидатов для заданий после упорядочивания выглядят следующим образом:

Задание1: {ч1, ч7, ч4, ч10}

Задание2: {ч1, ч2}

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

Предположим, что Job1 должен попасть на хост h1, и поэтому ему будет выделено 100 'res'. Затем, когда рассматривается Job2, для него также может быть запланирована посадка на хост h1, потому что его список хостов-кандидатов выглядит так же. То есть не учитываются 100 'res', выделенные для Job1 в рамках того же цикла планирования.

Короче говоря, вы одновременно отправляете кучу заданий и просите, чтобы хосты-кандидаты были упорядочены по ресурсу «ut», но в рамках одного цикла планирования хосты не переупорядочиваются, поскольку для них запланированы задания. Если вы распределите свои задания так, чтобы каждое из них было запланировано в отдельных циклах, вы увидите, что задания отправляются на разные хосты.

Теперь на этой странице документации также описывается, как заставить LSF переупорядочивать хосты в цикле для каждого задания, это делается простым добавлением '!' в строке заказа:

bsub -R "order[!ut]"

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

Кроме того, я не уверен на 100%, будет ли это работать для ресурса 'ut' (поскольку его значение не изменится при планировании заданий), вы можете попробовать встроенные слоты ресурсов, которые были добавлены в последняя версия, я считаю:

bsub -R "order[!slots]"

Изменить

Несколько моих коллег придумали другой способ обойти это поведение, не используя '!' в строке order, а это означает, что параметр JOB_ACCEPT_INTERVAL в строке lsb.params устанавливается равным 1.

Что это будет делать, так это установить ограничение в 1 задание в минуту, отправляемое на любой конкретный хост, это даст ресурсу ut время для обновления и балансировки вашей рабочей нагрузки между хостами.

person Squirrel    schedule 25.03.2015