Aşağıdaki bash betiğinde paralel olarak curl arka plan işlemlerinin thounsandını çalıştırıyorum
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 özel sunucum var (sanal değil).
Bellek tüketimini ve CPU'yu top
komut aracılığıyla izliyorum ve sınırlardan çok uzaklar.
ps aux | grep curl | wc -l
Mevcut kıvırma işlemlerinin sayısını saymak için kullanıyorum . Bu sayı 2-4 bine kadar hızla artar ve daha sonra sürekli olarak azalmaya başlar.
Awk ( curl | awk > output
) ' ye boru kıvrımı üzerinden basit ayrıştırma eklerseniz , kıvrılma süreçleri sayısı 1-2 bine kadar yükselir ve sonra 20-30'a düşer ...
İşlem sayısı neden bu kadar dramatik bir şekilde azalıyor? Bu mimarinin sınırları nerede?
parallel(1)
: Böyle görevler için manpages.debian.org/cgi-bin/...
start=$SECONDS
Ve end=$SECONDS
- ve kabuk değişkenleriyle olası ad çakışmasını önlemek için alışkanlıkla küçük harfli veya karışık harfli değişken adları kullanmayı deneyin . Ancak, gerçekten her bir sürecin başlangıcında sürekli artan zaman aralığını elde edersiniz. İşlem arka planda olduğundan indirme işleminin ne kadar sürdüğünü göremezsiniz (ve start
yalnızca bir kez hesaplanır). Bash'te (( diff = end - start ))
dolar işaretlerini düşürüp aralığın daha esnek olmasına izin verebilirsiniz. pgrep
Elinizde varsa kullanın .
awk
) işlem sayınızın nasıl yarı yarıya olduğuna dikkat edin .
parallel
ve dosya tanıtıcılarının sistem sınırı nedeniyle sadece 500 paralel görev çalıştırabileceğimi söylüyor. Limit.conf'da limiti artırdım, ancak şimdi 5000 simulaneus işini çalıştırmaya çalıştığımda, her parallel
perl betiği 32Mb yediği için başlamadan önce bile tüm belleğimi (49 Gb) anında yiyor .
ulimit
bu sınırların bazılarını gösterecektir.