Comment appeler une URL de service à partir d'un script shell bash en parallèle?

8

J'ai un service que j'appelle depuis une autre application. Voici mon URL de service que j'appelle -

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

J'ai besoin de faire un test de charge sur mon URL de service ci-dessus de manière multithread au lieu d'appeler séquentiellement un par un.

Existe-t-il un moyen à partir du script shell bash, je peux mettre une charge sur mon URL de service ci-dessus en l'appelant de manière multithread? Je peux avoir 60-70 threads appelant l'URL ci-dessus en parallèle très rapidement si possible?

David
la source

Réponses:

13

Je n'appellerais pas cela du multithreading en tant que tel, mais vous pouvez simplement lancer 70 emplois en arrière-plan:

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

Cela entraînera l' wgetexécution simultanée de 70 processus. Vous pouvez également faire quelque chose de plus sophistiqué comme ce petit 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
la source
Merci. Je l'ai maintenant, donc je peux juste augmenter la valeur 70, n'est-ce pas? Est-il possible de continuer à faire ce test de charge pendant 10 à 15 minutes de manière cohérente?
david
@ user2809564 voir la réponse mise à jour.
terdon
bien sûr, merci pour la modification. Lorsque j'ai exécuté le script ci-dessus, j'ai eu une erreur en tant que pgrep: invalid option -- 'c'. Je ne sais pas pourquoi, pouvez-vous penser à quelle pourrait être la raison?
david
@ user2809564 vous avez probablement une pgrepimplémentation différente . Est-ce Linux? Laquelle? Quoi qu'il en soit, vous pouvez simplement changer cette ligne enif [ $(pgrep wget | wc -l) -lt 70 ]; then
terdon
9

Essayez ab, vous obtenez également une belle statistique:

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

Cet appel fera 10000 requêtes avec simultanéité de 70 requêtes parallèles.

Jim
la source
comment installer apache bench dans Red Hat Enterprise Linux Server release 6.3?
david
1
yum install httpd-tools, selon serverfault.com/a/363775/10989
RJHunter
5

Vous pouvez essayer d'installer GNU en parallèle. Vous pouvez obtenir des exemples parallèles GNU d' ici .

Essai

J'ai installé gnu-paralleldepuis la source dans ma machine et j'ai pu le faire fonctionner.

Vous pouvez l'installer depuis la source d' ici . J'ai un système de RedHat et je téléchargé le paquet fedora puis couru le .configure, makeet make installpour obtenir le parallelinstallé dans mon système.

Maintenant, après l'installation réussie, j'ai créé un répertoire checkinget exécuté la commande ci-dessous.

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

Comme prévu, la commande ci-dessus m'a téléchargé 10 copies de la page Web. Vous pouvez définir le numéro que vous souhaitez avec seq.

Pour plus d'informations sur la façon d'exécuter la même commande en parallèle, vous pouvez vérifier les exemples fournis par gnu-parallel à partir d' ici . À partir de la page d'exemple,

Si vous souhaitez exécuter la même commande avec les mêmes arguments 10 fois en parallèle, vous pouvez faire:

seq 10 | parallel -n0 my_command my_args

ÉDITER

Maintenant, pour profiter de l' parallelexécution, vous pouvez utiliser la commande comme,

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

L' -joption est quelque chose qui pourrait spécifier le nombre total de travaux pouvant être exécutés en parallèle en fonction du nombre total de cœurs de processeur.

Ramesh
la source
Merci Ramesh. Combien de fois il appellera mon service avec cette approche?
david
@ user2809564, voir les mises à jour.
Ramesh
cool. Est-il également possible de continuer à faire ce test de charge pendant 10 à 15 minutes de manière cohérente?
david
Je pense que cet exemple fournira plus d'informations. stackoverflow.com/a/7627103/1742825
Ramesh
@ user2809564, veuillez également vous référer à cette question où j'ai obtenu la suggestion à utiliser GNU parallel. unix.stackexchange.com/questions/114962/…
Ramesh