Bashスクリプトで何千ものカールバックグラウンドプロセスを並列に実行する

Bashスクリプトで何千ものカールバックグラウンドプロセスを並列に実行する

私は何千もの走っています。カールNext 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専用サーバー(非仮想)があります。

命令によるメモリ消費とCPUの追跡にtop制限はありません。

ps aux | grep curl | wc -l現在の数量を計算するために使用します。カールプロセス。この数は2〜4,000人に急速に増加し、続いて減少し始めました。

カールパイピングを介してawk()にcurl | awk > output簡単な解析を追加すると、カールプロセスの数が1〜2000に増加し、次に20〜30に減少します。

プロセス数が大幅に減ったのはなぜですか?このアーキテクチャの境界はどこにありますか?

答え1

次の質問に厳密に従います。

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 を増やすと便利です。

答え2

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
wait

答え3

一括同時curlリクエストにこのシェルスクリプトを使用してみてください。

catcurpool.sh

#!/bin/bash
# usage: ./curlpool.sh "-d '{ \"id\": 1, \"jsonrpc\": \"2.0\",  \"method\": \"cfx_getParamsFromVote\", \"params\": []}' -H \"Content-Type: application/json\" -X POST http://127.0.0.1:22537"

target=${1:-http://example.com}
cmd="curl $target"
concurrency=${2:-20}

while true # loop forever, until ctrl+c pressed.
do
    for i in $(seq $concurrency) # perfrom the inner command 100 times.
    do
        eval $cmd & # send out a curl request, the & indicates not to wait for the response.
        # or use `eval $cmd  > /dev/null &` if you don't want see the output.
    done

    wait # after all requests are sent out, wait for their processes to finish before the next iteration.
done

関連情報