私は何千もの走っています。カール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
(編集:(編集:オペレーティングシステムの制限に関する真剣に古い主張を削除し、不足している主張を追加しました。)echo
curl
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