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 top
comando e sono lontani dai limiti.
Sto usando ps aux | grep curl | wc -l
per 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?
parallel(1)
per questi compiti: manpages.debian.org/cgi-bin/...
start=$SECONDS
e 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 pgrep
se ce l'hai.
awk
).
parallel
e 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.
ulimit
mostrerà alcuni di questi limiti.