Estou executando milhares de processos de segundo plano curl em paralelo no seguinte 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
Eu tenho 49Gb Corei7-920 servidor dedicado (não virtual).
Eu rastreio o consumo de memória e a CPU por meio de top
comando e eles estão longe dos limites.
Estou usando ps aux | grep curl | wc -l
para contar o número de processos de curvatura atuais . Esse número aumenta rapidamente de 2 a 4 mil e depois começa a diminuir continuamente.
Se eu adicionar uma análise simples por meio de encanamento de tubulação a awk ( curl | awk > output
), o número de processos de enrolamento aumentará para apenas 1-2 mil e depois diminuirá para 20-30 ...
Por que o número de processos diminui tão drasticamente? Onde estão os limites dessa arquitetura?
parallel(1)
de tais tarefas: manpages.debian.org/cgi-bin/...
start=$SECONDS
e end=$SECONDS
- e use nomes de variáveis em minúsculas ou em maiúsculas por hábito, a fim de evitar uma possível colisão de nomes com variáveis de shell. No entanto, você realmente está apenas obtendo o intervalo de tempo cada vez maior do início de cada processo. Você não está demorando quanto tempo o download levou, pois o processo está em segundo plano (e start
é calculado apenas uma vez). No Bash, você pode (( diff = end - start ))
eliminar os cifrões e permitir que o espaçamento seja mais flexível. Use pgrep
se você tiver.
awk
).
parallel
e me diz que posso executar apenas 500 tarefas paralelas devido ao limite do sistema de identificadores de arquivos. Aumentei o limite no limits.conf, mas agora, quando tento executar 5000 trabalhos simulaneus, ele consome instantaneamente toda a minha memória (49 Gb) antes mesmo do início, porque todo parallel
script perl consome 32Mb.
ulimit
mostrará alguns desses limites.