Esecuzione di migliaia di processi in background di arricciatura in parallelo nello script bash


14

Sto eseguendo migliaia di processi in background di curl in parallelo nel seguente script bash

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

Ho un server dedicato Corei7-920 da 49Gb (non virtuale).

Traccio il consumo di memoria e la CPU tramite topcomando e sono lontani dai limiti.

Sto usando ps aux | grep curl | wc -lper contare il numero degli attuali processi di arricciatura . Questo numero aumenta rapidamente fino a 2-4 migliaia e quindi inizia a diminuire continuamente.

Se aggiungo un semplice parsing tramite piping curl a awk ( curl | awk > output), il numero di processi di curl aumenta fino a 1-2 migliaia e poi diminuisce a 20-30 ...

Perché il numero di processi diminuisce in modo così drammatico? Dove sono i limiti di questa architettura?


2
Probabilmente stai raggiungendo uno dei limiti dei processi in esecuzione massima o dei socket con apertura massima. ulimitmostrerà alcuni di questi limiti.
HBruijn,

6
Ho anche suggerirei di usare parallel(1)per questi compiti: manpages.debian.org/cgi-bin/...
zhenech

Prova start=$SECONDSe end=$SECONDS- e usa i nomi delle variabili minuscole o miste per abitudine, al fine di evitare potenziali collisioni di nomi con variabili shell. Tuttavia, stai davvero ottenendo solo l'intervallo di tempo sempre crescente dell'avvio di ogni processo. Non si ottiene quanto tempo ha impiegato il download poiché il processo è in background (ed startè calcolato solo una volta). In Bash, puoi fare (( diff = end - start ))cadere i simboli del dollaro e rendere la spaziatura più flessibile. Usa pgrepse ce l'hai.
In pausa fino a ulteriore avviso.

Sono d'accordo con HBruijn. Notare come il conteggio dei processi viene dimezzato quando si raddoppia il numero di processi (aggiungendo awk).
In pausa fino a ulteriore avviso.

@zhenech @HBrujin Ho avviato parallele mi dice che potrei eseguire solo 500 attività parallele a causa del limite di sistema degli handle di file. Ho alzato il limite in limits.conf, ma ora quando provo a eseguire 5000 lavori simulani consuma istantaneamente tutta la mia memoria (49 Gb) anche prima di iniziare perché ogni parallel script perl consuma 32 Mb.
zavg,

Risposte:


12

A seguito della domanda rigorosa:

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

Più breve se non è necessario il testo del bollettino attorno ai tempi:

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

Se vuoi eseguire 1000s in parallelo, colpirai alcuni limiti (come gli handle di file). Sollevare ulimit -n o /etc/security/limits.conf può essere d'aiuto.


E se desidero eseguire diversi comandi come quello nella versione con risposta breve in parallelo, come posso farlo?
Guy Avraham,

2
Citarlo: seq 100 | parallel 'echo here is command 1: {}; echo here is command 2: {}'. Trascorri un'ora a piedi attraverso il tutorial. La tua linea di comando ti adorerà per questo:man parallel_tutorial
Ole Tange l'

2
for i in {1..100000}

Ci sono solo 65536 porte. Accelerare questo.

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

(modifica: (modifica: elimina l'asserzione gravemente datata sui limiti del sistema operativo e aggiungi i mancanti )echocurl
wait


In realtà il sistema operativo può gestirlo bene. Questa è una limitazione di TCP. Nessun sistema operativo, non importa quanto speciale, sarà in grado di aggirarlo. Ma le connessioni 4k di OP non sono affatto vicine a 64k (o il valore predefinito 32k di alcune distro)
Patrick

@Patrick ok, ho eliminato quella parte, è ridondante con un limite di design irrecuperabile, ma guarda il commento di zavg sul 7 °.
jthill,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.