次の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を追跡しますが、それらは限界からはかけ離れています。
ps aux | grep curl | wc -l
現在のcurlプロセスの数を数えるために使用しています。この数は2〜4千まで急速に増加し、その後連続的に減少し始めます。
パイピングcurlを介して単純な解析をawk(curl | awk > output
)に追加すると、curlプロセスの数は1〜2千に増え、その後20〜30に減少します。
プロセスの数がそれほど劇的に減少するのはなぜですか?このアーキテクチャの境界はどこですか?
また
—
zhenech
parallel(1)
、そのようなタスクに使用することをお勧めします:manpages.debian.org/cgi-bin/…–
試行
—
追って通知があるまで一時停止します。
start=$SECONDS
してend=$SECONDS
-シェル変数との潜在的な名前の衝突を回避するために、習慣によって小文字または大文字と小文字が混在する変数名を使用してください。ただし、実際には、各プロセスの開始間隔がますます長くなっています。プロセスがバックグラウンドで実行されているため、ダウンロードにかかった時間はわかりません(start
1回だけ計算されます)。Bashでは(( diff = end - start ))
、ドル記号をドロップして、間隔をより柔軟にすることができます。pgrep
持っている場合に使用します。
HBruijnに同意します。プロセス数を2倍にしたときに(を追加して
—
追って通知があるまで一時停止します。
awk
)プロセス数が半分になることに注意してください。
@zhenech @HBrujin起動
—
zavg
parallel
しましたが、ファイルハンドルのシステム制限により、500の並列タスクしか実行できないと言われています。私はlimits.confで制限を上げましたが、5000個のsimulaneusジョブを実行しようとすると、parallel
perlスクリプトはすべて32MBを消費するため、開始前でもすぐにすべてのメモリ(49GB)を消費します。
ulimit
これらの制限の一部が表示されます。