Блог #xargs

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

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

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

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