Использование нескольких процессоров в 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 (кэширование результатов компиляции для многократного использования), но обсуждение этих программ выходит за рамки данного поста. Просто внимательно читайте документацию к используемому ПО, возможно, и ваша программа изначально поддерживает многопоточность.
Ты не поверишь! Я только что искал на эту тему. А тут ты в RSS. Спасибо, добрый человек! :-)