Bas betiğinde binlerce kıvırmak arka plan işlemini paralel olarak çalıştırma


14

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?


2
Muhtemelen maksimum çalışan işlemlerin veya maksimum açık soketlerin sınırlarından birine vuruyorsunuz. ulimitbu sınırların bazılarını gösterecektir.
HBruijn

6
Ben de kullanarak öneririm parallel(1): Böyle görevler için manpages.debian.org/cgi-bin/...
zhenech

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 .
sonraki duyuruya kadar duraklatıldı.

HBruijn'e katılıyorum. İşlem sayısını ikiye katladığınızda (ekleyerek awk) işlem sayınızın nasıl yarı yarıya olduğuna dikkat edin .
sonraki duyuruya kadar duraklatıldı.

@zhenech @HBrujin Başlattım 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 .
zavg

Yanıtlar:


12

Sıkı soru aşağıdaki:

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

Isıtıcı plaka metnine zamanlamalar etrafında ihtiyacınız yoksa daha kısa:

seq 100000 | parallel -j0 --joblog log curl -s http://some_url_here/{} ">" {}.txt
cut -f 4 log

1000'leri paralel olarak çalıştırmak istiyorsanız, bazı sınırlara (dosya tanıtıcıları gibi) çarparsınız. Ulimit -n veya /etc/security/limits.conf dosyasının yükseltilmesi yardımcı olabilir.


Ve kısa cevap versiyonundaki gibi birden fazla komutu paralel olarak çalıştırmak istersem, bunu nasıl yapabilirim?
Guy Avraham

2
Bunu Alıntı: seq 100 | parallel 'echo here is command 1: {}; echo here is command 2: {}'. Eğitimde bir saat geçirin. Komut satırınız sizi çok sevecek:man parallel_tutorial
Ole Tange

2
for i in {1..100000}

Sadece 65536 port vardır. Bunu kısın.

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

(değiştir: (değiştir: OS sınırları hakkında ciddi şekilde tarihli beyanı kaldır ve eksikleri ekle )echocurl
wait


Aslında işletim sistemi bunu iyi halledebilir. Bu TCP'nin bir sınırlamasıdır. Hiçbir işletim sistemi, ne kadar özel olursa olsun, etrafından geçemez. Ancak OP'nin 4k bağlantıları hiçbir yerde 64k (veya bazı dağıtımların 32k varsayılanı) yakınında değil
Patrick

@Patrick tamam, o kısmı çıkardım, geri alınamaz bir tasarım sınırı ile gereksiz, ancak zavg'ın 7'deki yorumuna bakın .
jthill
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.