Запуск тысяч параллельных фоновых процессов в сценарии bash

Я запускаю thounsand параллельных фоновых процессов параллельно в следующем сценарии 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 ps aux | grep curl | wc -l ps aux | grep curl | wc -l чтобы подсчитать количество текущих процессов скручивания . Это число быстро увеличивается до 2-4 тысяч, а затем начинает непрерывно уменьшаться.

Если я добавлю простой синтаксический анализ через curl curl в awk ( curl | awk > output ), то число завитушек увеличится до 1-2 тысяч, а затем уменьшится до 20-30 …

Почему число процессов настолько резко уменьшается? Где границы этой архитектуры?

Следуя строгому вопросу:

 mycurl() { START=$(date +%s) curl -s "http://some_url_here/"$1 > $1.txt END=$(date +%s) DIFF=$(( $END - $START )) echo "It took $DIFF seconds" } export -f mycurl seq 100000 | parallel -j0 mycurl 

Короче, если вам не нужен текст шаблона вокруг таймингов:

 seq 100000 | parallel -j0 --joblog log curl -s http://some_url_here/{} ">" {}.txt cut -f 4 log 

Если вы хотите запустить 1000s параллельно, вы столкнетесь с некоторыми ограничениями (такими как дескрипторы файлов). Может помочь повышение ulimit -n или /etc/security/limits.conf.

 for i in {1..100000} 

Есть только 65536 портов. Дросселируйте это.

 for n in {1..100000..1000}; do # start 100 fetch loops for i in `eval echo {$n..$((n+999))}`; do echo "club $i..." curl -s "http://some_url_here/"$i > $i.txt done & wait done 

(изменить: echo curl
(отредактируйте: полоса строго датируется утверждением об ограничениях ОС и добавьте недостающее wait )