web-dev-qa-db-ja.com

bashスクリプトで数千のcurlバックグラウンドプロセスを並行して実行する

私は次のbashスクリプトで並列にcurlバックグラウンドプロセスを実行しています

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コマンドを使用してメモリ消費とCPUを追跡していますが、それらは境界から遠く離れています。

現在のcurlプロセスの数をカウントするためにps aux | grep curl | wc -lを使用しています。この数は2から4千まで急速に増加し、その後継続的に減少し始めます。

Curlがawk(curl | awk > output)にパイピングして単純な解析を追加すると、curlプロセスの数が1から2千まで増加し、その後20から30に減少します...

プロセスの数がなぜそれほど劇的に減少するのですか?このアーキテクチャの境界はどこにありますか?

14
zavg

厳格な質問に従ってください:

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

1000を並行して実行したい場合は、いくつかの制限(ファイルハンドルなど)に達します。 ulimit -nまたは/etc/security/limits.confを上げると役立つ場合があります。

13
Ole Tange
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

(編集: echocurl
(編集:OS制限に関する厳格な日付のアサーションを削除し、不足しているwaitを追加)

2
jthill