Я запускаю тысячи фоновых процессов 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 ...
Почему количество процессов так резко уменьшается? Где границы этой архитектуры?
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 Мб.
ulimit
покажет некоторые из этих ограничений.