Я запускаю тысячи фоновых процессов curl параллельно в следующем скрипте bash
START=$(date +%s)
for i in {1..100000}
do
curl -s "http://some_url_here/"$i > $i.txt&
END=$(date +%s)
DIFF=$(( $END - $START ))
echo "It took $DIFF seconds"
done
У меня 49Gb Corei7-920 выделенный сервер (не виртуальный).
Я отслеживаю потребление памяти и процессора через top
команду, и они далеки от границ.
Я использую ps aux | grep curl | wc -l
для подсчета количества текущих процессов скручивания . Это число быстро увеличивается до 2-4 тысяч, а затем начинает непрерывно уменьшаться.
Если я добавлю простой анализ через piping curl в awk ( curl | awk > output
), то число процессов curl возрастет до 1-2 тысяч, а затем уменьшится до 20-30 ...
Почему количество процессов так резко уменьшается? Где границы этой архитектуры?
ulimit
покажет некоторые из этих ограничений.parallel(1)
для таких задач: manpages.debian.org/cgi-bin/…start=$SECONDS
иend=$SECONDS
- и используйте имена переменных в нижнем или смешанном регистре по привычке, чтобы избежать возможного конфликта имен с переменными оболочки. Однако на самом деле вы получаете только постоянно увеличивающийся интервал времени запуска каждого процесса. Вы не получаете, сколько времени заняло скачивание, так как процесс идет в фоновом режиме (иstart
рассчитывается только один раз). В Bash вы можете(( diff = end - start ))
сбросить знаки доллара и сделать интервалы более гибкими. Используйте,pgrep
если у вас есть.awk
).parallel
и мне сказали, что я могу выполнить только 500 параллельных задач из-за системного ограничения файловых дескрипторов. Я поднял лимит в limit.conf, но теперь, когда я пытаюсь запустить 5000 заданий simulaneus, он мгновенно съедает всю мою память (49 Гб) еще до запуска, потому что каждыйparallel
скрипт perl съедает 32 Мб.Ответы:
После вопроса строго:
Короче, если вам не нужен шаблонный текст вокруг времени:
Если вы хотите запустить 1000 с параллельно, вы достигнете некоторых ограничений (например, файловых дескрипторов). Может помочь повышение ulimit -n или /etc/security/limits.conf.
источник
seq 100 | parallel 'echo here is command 1: {}; echo here is command 2: {}'
. Проведите час, прогуливаясь по учебнику. Ваша командная строка будет любить вас за это:man parallel_tutorial
Всего 65536 портов. Дросселировать это.
(edit: (edit: убрать строго устаревшее утверждение об ограничениях ОС и добавить недостающее )
echo
curl
wait
источник