Использование нескольких процессоров в Linux с помощью xargs
Создано: 13-06-2009 19:55:35  Метки: linux work
http://bappoy.pp.ru/2009/03/11/parallelizing-jobs-linux.html
В последние несколько лет многопроцессорные и многоядерные системы получили широкое распространение на десктопах, не говоря уже о серверных решениях. Однако зачастую дополнительные процессоры используются неэффективно: большая часть повседневно используемых программ умеет работать только на одном процессоре, а для эффективного использования нескольких 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 (кэширование результатов компиляции для многократного использования), но обсуждение этих программ выходит за рамки данного поста. Просто внимательно читайте документацию к используемому ПО, возможно, и ваша программа изначально поддерживает многопоточность.
1443 просмотров комментировать