[ Content | View menu ]

Использование нескольких процессоров в Linux с помощью xargs

Опубликовано 11.03.2009

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

Еще один способ использовать свои несколько процессоров — просто запустить несколько копий программы. Но когда нужно многократно запускать одну и ту же программу с разными аргументами, приходится следить за тем, чтобы процессы не размножались сверх необходимости, а по завершении отработавшего процесса запускался бы новый. Несмотря на то, что shell имеет достаточно средств для усправления процессами (команды kill, wait и trap вкупе с механизмами отправки процесса в бэкграунд и извлечения его оттуда), отладка собственного скрипта может занять время, значительно превышающее выигрыш от его однократного использования.

К счастью, всё уже придумано до нас.

Во-первых, совершенно необходимо упомянуть скрипт ppss, в зависимости от числа процессоров в системе запускающий нужное количество параллельных процессов. Подробнее про этот скрипт можно почитать у Антона Якутовича.

Во-вторых, поскольку в подавляющем большинстве случаев при обработке множества файлов используется связка find + xargs, то почему бы не использовать стандартные возможности этих программ? Команда xargs имеет две опции, которые непосредственно относятся к нашей проблеме ограничения количества одновременно выполняемых процессов:

  • xargs -n X ограничивает количество передаваемых вашей программе аргументов. По умолчанию xargs передаёт программе довольно большое число аргументов, поэтому для обработки одного файла за один раз нужно указывать эту опцию
  • xargs -P X устанавливает количество одновременно выполняемых процессов. По умолчанию xargs запускает только один процесс, но в нашем случае нужно увеличить это число до количества процессоров.

Например, перекодировать множество wav в mp3 можно примерно следующим образом:

find . -type f -name '*wav' -print0 | xargs -0 -n 1 -P 2 lame -V2

Одновременно будет запущено не более двух процессов lame, а планировщик позаботится о распределении их по разным процессорам.

В-третьих, некоторые программы всё-таки имеют встроенную возможность многопоточного исполнения. Например, у команды make есть опция -j, устанавливающую число одновременно запущенных экземпляров компилятора. Для ускорения сборки можно также посмотреть в сторону использования distcc (параллельная сборка на нескольких машинах) или ccache (кэширование результатов компиляции для многократного использования), но обсуждение этих программ выходит за рамки данного поста. Просто внимательно читайте документацию к используемому ПО, возможно, и ваша программа изначально поддерживает многопоточность.

«
»

1 комментарий

Write a comment - TrackBack - RSS Comments

  1. Comment by Flycat:

    Ты не поверишь! Я только что искал на эту тему. А тут ты в RSS. Спасибо, добрый человек! :-)

    11.03.2009 @ 17:08
Write comment

Я не робот.