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?
ulimit
mostrará alguns desses limites.parallel(1)
de tais tarefas: manpages.debian.org/cgi-bin/...start=$SECONDS
eend=$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 (estart
é 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. Usepgrep
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 todoparallel
script perl consome 32Mb.Respostas:
Após a pergunta estrita:
Menor se você não precisar do texto padrão nos horários:
Se você deseja executar 1000s em paralelo, atingirá alguns limites (como identificadores de arquivo). Criar ulimit -n ou /etc/security/limits.conf pode ajudar.
fonte
seq 100 | parallel 'echo here is command 1: {}; echo here is command 2: {}'
. Passe uma hora percorrendo o tutorial. Sua linha de comando o amará por isso:man parallel_tutorial
Existem apenas 65536 portas. Acelere isso.
(edit: (edit: tira afirmação severamente datada sobre os limites do SO e adiciona o que falta )
echo
curl
wait
fonte