Назад | Перейти на главную страницу

GNU parallel не полностью использует мои процессоры

Я запускаю такую ​​команду на своем 36-ядерном сервере (EC2 c4.8xlarge / Amazon Linux).

find . -type f | parallel -j 36 mycommand

Количество файлов для обработки составляет ~ 1 000 000, и это занимает десятки минут. Он должен запускать 36 процессов одновременно. Однако в результате top, существует не более 10 процессов, а 70% бездействуют. ps показывает больше процессов, но большинство из них не работают.

Я догадался, потому что каждый mycommand закончился так быстро, parallel не мог догнать порождение новых процессов. Так что я попробовал parallel --nice 20 выделить больше процессорного времени на parallel сам, но это не сработало.

Есть ли у кого-нибудь идея улучшить это?

$ parallel --version GNU parallel 20151022

Количество файлов для обработки составляет ~ 1 000 000, и это занимает десятки минут.

Таким образом, вы выполняете около 600 заданий в секунду. Накладные расходы на одно задание GNU Parallel составляют порядка 2-5 мс, поэтому, когда вы получаете более 200 заданий в секунду, GNU Parallel не будет работать лучше без настройки.

Настройка состоит в том, чтобы иметь больше parallelпараллельные работы по разведению урожая. Из https://www.gnu.org/software/parallel/man.html#EXAMPLE:-Running-more-than-250-jobs-workaround

cat myinput | parallel --pipe -N 100 --round-robin -j50 parallel -j100 your_prg

Таким образом, у вас будет 50 параллельных программ GNU, каждая из которых может запускать 100 заданий в секунду.

Вы пытаетесь открыть миллион файлов, по 36 за раз. Даже если бы ваша команда могла работать на полную мощность на одном процессоре, вы все равно понесли бы накладные расходы, связанные с открытием этих файлов. Ввод-вывод - одна из самых затратных по времени операций на компьютере. Лучше всего было бы заранее загрузить как можно больше этих файлов в ОЗУ вашего компьютера и работать в ОЗУ как можно больше. В зависимости от того, сколько у вас оперативной памяти, это может значительно улучшить производительность, потому что после начала чтения последующие чтения, как правило, используют кеширование, если выполняются сразу одно за другим. Вы также можете убедиться, что ваша файловая система размещает файлы с эффективным кешированием, а также что это хорошая fs, когда дело доходит до нескольких последующих чтений.

Я не думаю parallel очень поможет вам в этом рефакторинге.

Эх, если я понял ваши вопросы, вы хотите обрабатывать все файлы одновременно?
parallel запустит несколько экземпляров mycommand , а не несколько find экземпляры.