Estoy ejecutando miles de procesos de fondo curl en paralelo en el siguiente 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
Tengo un servidor dedicado Corei7-920 de 49 Gb (no virtual).
Rastreo el consumo de memoria y la CPU a través del top
comando y están lejos de los límites.
Estoy usando ps aux | grep curl | wc -l
para contar la cantidad de procesos de rizo actuales . Este número aumenta rápidamente hasta 2-4 mil y luego comienza a disminuir continuamente.
Si agrego un análisis simple a través de la curvatura de la tubería a awk ( curl | awk > output
), el número de procesos de curvatura aumenta a solo 1-2 mil y luego disminuye a 20-30 ...
¿Por qué el número de procesos disminuye tan dramáticamente? ¿Dónde están los límites de esta arquitectura?
parallel(1)
para tales tareas: manpages.debian.org/cgi-bin/…
start=$SECONDS
y end=$SECONDS
- y use nombres de variables en minúsculas o en mayúsculas y minúsculas por hábito para evitar una posible colisión de nombres con variables de shell. Sin embargo, en realidad solo está obteniendo el intervalo de tiempo cada vez mayor del inicio de cada proceso. No está obteniendo cuánto tiempo llevó la descarga ya que el proceso está en segundo plano (y start
solo se calcula una vez). En Bash, puede (( diff = end - start ))
dejar caer los signos de dólar y permitir que el espacio sea más flexible. Úselo pgrep
si lo tiene.
awk
).
parallel
y me dice que puedo ejecutar solo 500 tareas paralelas debido al límite del sistema de los identificadores de archivos. Aumenté el límite en limits.conf, pero ahora cuando trato de ejecutar 5000 trabajos simulados, instantáneamente se come toda mi memoria (49 Gb) incluso antes de comenzar porque cada parallel
script perl consume 32Mb.
ulimit
mostrará algunos de esos límites.