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?
ulimit
mostrará algunos de esos límites.parallel(1)
para tales tareas: manpages.debian.org/cgi-bin/…start=$SECONDS
yend=$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 (ystart
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. Úselopgrep
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 cadaparallel
script perl consume 32Mb.Respuestas:
Siguiendo la pregunta estricta:
Más corto si no necesita el texto repetitivo alrededor de los tiempos:
Si desea ejecutar 1000 en paralelo, alcanzará algunos límites (como los identificadores de archivo). Levantar ulimit -n o /etc/security/limits.conf puede ayudar.
fuente
seq 100 | parallel 'echo here is command 1: {}; echo here is command 2: {}'
. Pase una hora caminando a través del tutorial. Su línea de comando lo amará por ello:man parallel_tutorial
Solo hay 65536 puertos. Acelera esto.
(editar: (editar: eliminar la afirmación con fecha severa sobre los límites del sistema operativo y agregar los que faltan )
echo
curl
wait
fuente