Menjalankan ribuan proses latar belakang ikal secara paralel dalam skrip bash

14

Saya menjalankan beberapa proses latar belakang ikal secara paralel dalam skrip bash berikut

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

Saya memiliki dedicated server 49Gb Corei7-920 (bukan virtual).

Saya melacak konsumsi memori dan CPU melalui topperintah dan mereka jauh dari batas.

Saya menggunakan ps aux | grep curl | wc -luntuk menghitung jumlah proses ikal saat ini . Jumlah ini meningkat dengan cepat hingga 2-4 ribu dan kemudian mulai terus menurun.

Jika saya menambahkan penguraian sederhana melalui perpipaan ikal ke awk ( curl | awk > output) dari jumlah proses ikal menaikkan hanya 1-2 ribu dan kemudian menurun menjadi 20-30 ...

Mengapa jumlah proses menurun secara dramatis? Di mana batas arsitektur ini?

zavg
sumber
2
Anda mungkin memukul salah satu batas proses berjalan maks atau soket terbuka maksimal. ulimitakan menunjukkan beberapa batasan tersebut.
HBruijn
6
Saya juga menyarankan menggunakan parallel(1)untuk tugas-tugas seperti: manpages.debian.org/cgi-bin/…
zhenech
Coba start=$SECONDSdan end=$SECONDS- dan gunakan nama variabel case case campuran atau huruf kecil menurut kebiasaan untuk menghindari kemungkinan tabrakan nama dengan variabel shell. Namun, Anda benar-benar hanya mendapatkan interval waktu yang semakin meningkat dari awal setiap proses. Anda tidak akan mendapatkan waktu pengunduhan karena prosesnya di latar belakang (dan starthanya dihitung sekali). Di Bash, Anda dapat (( diff = end - start ))menjatuhkan tanda dolar dan membiarkan jarak menjadi lebih fleksibel. Gunakan pgrepjika Anda memilikinya.
Dijeda sampai pemberitahuan lebih lanjut.
Saya setuju dengan HBruijn. Perhatikan bagaimana jumlah proses Anda dibelah dua ketika Anda menggandakan jumlah proses (dengan menambahkan awk).
Dijeda sampai pemberitahuan lebih lanjut.
@zhenech @HBrujin saya meluncurkan paralleldan mengatakan saya bahwa saya dapat menjalankan hanya 500 tugas paralel karena batas sistem menangani file. Saya menaikkan limit di Limit.conf, tetapi sekarang ketika saya mencoba menjalankan 5000 pekerjaan simulaneus, ia langsung memakan semua memori saya (49 Gb) bahkan sebelum memulai karena setiap parallel skrip perl memakan 32Mb.
zavg

Jawaban:

12

Mengikuti pertanyaan ketat:

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

Lebih pendek jika Anda tidak memerlukan teks pelat di sekitar timing:

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

Jika Anda ingin menjalankan 1000s secara paralel, Anda akan mencapai beberapa batasan (seperti pegangan file). Meningkatkan ulimit -n atau /etc/security/limits.conf dapat membantu.

Ole Tange
sumber
Dan jika saya ingin menjalankan beberapa perintah seperti yang ada di versi jawaban singkat secara paralel, bagaimana saya melakukannya?
Guy Avraham
2
Mengutipnya: seq 100 | parallel 'echo here is command 1: {}; echo here is command 2: {}'. Habiskan satu jam berjalan melalui tutorial. Baris perintah Anda akan mencintaimu karenanya:man parallel_tutorial
Ole Tange
2
for i in {1..100000}

Hanya ada 65.536 port. Tutup ini.

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

(sunting: (sunting: lepaskan pernyataan yang sangat tanggal tentang batas OS dan tambahkan yang hilang )echocurl
wait

jthill
sumber
Sebenarnya OS dapat menangani ini dengan baik. Ini adalah batasan TCP. Tidak ada OS, tidak peduli betapa istimewanya, akan dapat mengatasinya. Tetapi koneksi OP 4k tidak jauh dari 64k (atau standar 32k dari beberapa distro)
Patrick
@ Patrick baik-baik saja, saya mengambil bagian itu, itu berlebihan dengan batas desain yang tidak dapat diperbaiki, tetapi lihat komentar zavg pada tanggal 7.
jthill