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 topkomut aracılığıyla izliyorum ve sınırlardan çok uzaklar.
ps aux | grep curl | wc -lMevcut 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=$SECONDSVe 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 startyalnızca bir kez hesaplanır). Bash'te (( diff = end - start ))dolar işaretlerini düşürüp aralığın daha esnek olmasına izin verebilirsiniz. pgrepElinizde varsa kullanın .
awk) işlem sayınızın nasıl yarı yarıya olduğuna dikkat edin .
parallelve 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 .
ulimitbu sınırların bazılarını gösterecektir.