Я запускаю тысячи фоновых процессов 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покажет некоторые из этих ограничений.