¿Cómo llamar a un servicio URL desde bash shell script en paralelo?

8

Tengo un servicio al que llamo desde otra aplicación. A continuación se muestra la URL de mi servicio al que llamo:

http://www.betaservice.domain.host.com/web/hasChanged?ver=0

Necesito hacer una prueba de carga en mi URL de servicio anterior de manera multiproceso en lugar de llamar secuencialmente uno por uno.

¿Hay alguna forma de script de shell bash, puedo poner una carga en mi URL de servicio anterior llamándolo de manera multiproceso? ¿Puedo tener 60-70 hilos llamando a la URL anterior en paralelo muy rápido si es posible?

david
fuente

Respuestas:

13

No lo llamaría multihilo como tal, pero simplemente podría lanzar 70 trabajos en segundo plano:

for i in {1..70}; do 
   wget http://www.betaservice.domain.host.com/web/hasChanged?ver=0 2>/dev/null &
done

Eso dará como resultado 70 wgetprocesos ejecutándose a la vez. También puedes hacer algo más sofisticado como este pequeño script:

#!/usr/bin/env bash

## The time (in minutes) the script will run for. Change 10
## to whatever you want.
end=$(date -d "10 minutes" +%s);

## Run until the desired time has passed.
while [ $(date +%s) -lt "$end" ]; do 
    ## Launch a new wget process if there are
    ## less than 70 running. This assumes there
    ## are no other active wget processes.
    if [ $(pgrep -c wget) -lt 70 ]; then
        wget http://www.betaservice.domain.host.com/web/hasChanged?ver=0 2>/dev/null &
    fi
done
terdon
fuente
Gracias. Lo tengo ahora, así que solo puedo aumentar el valor 70 ¿verdad? ¿Es posible seguir haciendo esta prueba de carga durante 10-15 minutos de manera constante?
David
@ user2809564 ver respuesta actualizada.
terdon
Seguro, gracias por la edición. Cuando ejecuté el script anterior, recibí un error como pgrep: invalid option -- 'c'. No estoy seguro de por qué, ¿puedes pensar cuál podría ser la razón?
David
@ user2809564 probablemente tenga una pgrepimplementación diferente . ¿Es esto Linux? ¿Cúal? De todos modos, puede cambiar esa línea aif [ $(pgrep wget | wc -l) -lt 70 ]; then
terdon
9

Prueba ab, también obtienes una buena estadística:

ab -n 10000 -c 70 http://www.betaservice.domain.host.com/web/hasChanged?ver=0

Esta llamada hará 10000 solicitudes con concurrencia de 70 consultas paralelas.

jim
fuente
¿Cómo puedo instalar apache bench Red Hat Enterprise Linux Server release 6.3?
David
1
yum install httpd-tools, de acuerdo con serverfault.com/a/363775/10989
RJHunter
5

Podría intentar instalar GNU en paralelo. Puede obtener algunos ejemplos paralelos de GNU desde aquí .

Pruebas

Lo instalé gnu-paralleldesde el origen en mi máquina y pude hacerlo funcionar.

Puedes instalarlo desde la fuente desde aquí . Tengo un sistema redhat y descargué el paquete fedora y luego ejecuté el .configure, makey make installpara parallelinstalarlo en mi sistema.

Ahora, después de la instalación exitosa, creé un directorio checkingy ejecuté el siguiente comando.

seq 10 | parallel -n0  wget http://www.betaservice.domain.host.com/web/hasChanged?ver=0

Como se esperaba, el comando anterior me descargó 10 copias de la página web. Puede establecer el número que desee con seq.

Para obtener más información sobre cómo ejecutar el mismo comando en paralelo, puede verificar los ejemplos proporcionados por gnu-parallel desde aquí . Desde la página de ejemplo,

Si desea ejecutar el mismo comando con los mismos argumentos 10 veces en paralelo, puede hacer:

seq 10 | paralelo -n0 mi_comando my_args

EDITAR

Ahora, para aprovechar la parallelejecución, puede usar el comando como,

 seq 70 | parallel -j70 wget http://www.betaservice.domain.host.com/web/hasChanged?ver=0

La -jopción es algo que podría especificar el total de trabajos que se pueden ejecutar en paralelo en función de los núcleos de CPU totales.

Ramesh
fuente
Gracias Ramesh ¿Cuántas veces llamará a mi servicio con este enfoque?
David
@ user2809564, ver las actualizaciones.
Ramesh
frio. ¿También es posible seguir haciendo esta prueba de carga durante 10-15 minutos de manera constante?
David
Creo que este ejemplo proporcionará más ideas. stackoverflow.com/a/7627103/1742825
Ramesh
@ user2809564, consulte también esta pregunta de dónde obtuve la sugerencia de usar GNU parallel. unix.stackexchange.com/questions/114962/…
Ramesh