Блог #xargs

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

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

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

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