Я запускаю такую команду на своем 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
экземпляры.