Блог #parallel

Осень. %!s(<nil>)
Хорватия, Млини 2017. Стена
Тенерифе.
Ещё немного майского Берлина. %!s(<nil>)
Тойфельсберг. %!s(<nil>)
Хорватия, Млини 2017. Купари на закате
Перу и Боливия. Зима-весна 2011. Багги
Лондон. Сентябрь 2018. Ольчик и аллея
Тайланд, Индонезия, Сингапур (зима 2010). Пхукет. Я на кабеле :)
Тайланд, Индонезия, Сингапур (зима 2010). В Сингапурском зоопарке
Разное. Радуга над футбольным полем в Лужниках 2
Чехия 2014. Вид на Влтаву из Вышеграда
Хорватия, Млини 2017. Тучи
Мальта, март 2014. Дорога
Лето 2008 (Куба). И еще раз я возле автописты
Хорватия, Млини 2017. Чебурашка
Исландия 2023. Собака?! А нет, морской котик
Гармиш-Партенкирхен, Миттенвальд, Инсбрук. Май-июнь 2022. Утка возле озера Айбзее
Перу и Боливия. Зима-весна 2011. Я в Уюни
Март 2017. Берлин — Роттердам — Дюссельдорф. Дорога
Новый Год 2009 (Амстердам). Рентабайк
Весна 2012. Германия — Франция — Италия. Лувр
Зимний Берлин.
Весна 2012. Германия — Франция — Италия. Потрясающий вид
Осень. %!s(<nil>)
Байкал, остров Ольхон, Хужир. Март 2018. Ледяные волны
Весна 2012. Германия — Франция — Италия. Джульетта в горах
Зимний Берлин.
Первый Россиийский семинар по CMS Drupal. Это я не позирую, просто фотограф — Саша Позднеев — выбрал удачный момент для съемки :))
Лондон. Сентябрь 2018. Дерево
Лондон. Сентябрь 2018. Пешеходная зона

GNU parallel и xargs. Параллельный запуск нескольких копий команды с разными аргументами

Задача

GNU Parallel

Есть консольная команда вида:

./do-something.sh -x 1

Значение аргумента x может меняться в диапазоне от 1 до 30 000. Выполнение команды для одного аргумента занимает от 30 секунд до 15 минут. Нужно максимально быстро выполнить эту команду для заданного диапазона аргументов на N-ядерном сервере максимально используя ресурсы сервера.

Возможные варианты решения

  1. Простой цикл от 1 до 30 тысяч с запуском команды на каждой итерации будет использовать только 1 ядро. Это решение неприемлемо: оно будет работать слишком долго и не задействует все доступные ресурсы сервера.
  2. Можно вручную разбить диапазон на N частей и запустить N циклов вида:
   for i in `seq 1 1000`
   do
    ./do-something.sh -x $i
   done

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

Читать дальше ➠