Блог #parallel

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

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

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

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