Wie rufe ich eine Service-URL aus dem Bash-Shell-Skript parallel auf?

8

Ich habe einen Dienst, den ich von einer anderen Anwendung aus anrufe. Unten ist meine Service-URL, die ich anrufe -

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

Ich muss einen Lasttest für meine oben genannte Dienst-URL in Multithread-Weise durchführen, anstatt nacheinander nacheinander aufzurufen.

Gibt es eine Möglichkeit, mit dem Bash-Shell-Skript meine oben genannte Service-URL zu laden, indem ich sie auf Multithread-Weise aufrufe? Ich kann 60-70 Threads haben, die über der URL sehr schnell parallel aufrufen, wenn möglich?

David
quelle

Antworten:

13

Ich würde es nicht als Multithreading bezeichnen, aber Sie könnten einfach 70 Jobs im Hintergrund starten:

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

Das führt dazu, dass 70 wgetProzesse gleichzeitig ausgeführt werden. Sie können auch etwas Anspruchsvolleres wie dieses kleine Skript ausführen:

#!/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
quelle
Vielen Dank. Ich habe es jetzt, also kann ich einfach den 70er Wert erhöhen, oder? Ist es möglich, diesen Belastungstest 10-15 Minuten lang konstant durchzuführen?
David
@ user2809564 siehe aktualisierte Antwort.
Terdon
Klar, danke für die Bearbeitung. Als ich über dem Skript lief, bekam ich den Fehler als pgrep: invalid option -- 'c'. Ich bin mir nicht sicher warum, können Sie sich vorstellen, was der Grund sein könnte?
David
@ user2809564 Sie haben wahrscheinlich eine andere pgrepImplementierung. Ist das Linux? Welcher? Wie auch immer, Sie können diese Zeile einfach inif [ $(pgrep wget | wc -l) -lt 70 ]; then
terdon
9

Versuchen Sie ab, Sie erhalten auch eine schöne Statistik:

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

Dieser Aufruf führt 10000 Anforderungen mit gleichzeitig 70 parallelen Abfragen aus.

Jim
quelle
Wie kann ich Apache Bench installieren Red Hat Enterprise Linux Server release 6.3?
David
1
yum install httpd-tools, laut serverfault.com/a/363775/10989
RJHunter
5

Sie können versuchen, GNU parallel zu installieren. Sie könnten einige GNU parallel Beispiele Suche von hier .

Testen

Ich habe gnu-parallelvon der Quelle in meinem Computer installiert und konnte es zum Laufen bringen.

Sie können es von hier aus von der Quelle installieren . Ich habe ein RedHat - System und so heruntergeladen ich das Paket fedora und dann lief das .configure, makeund make installdie bekommen parallelin meinem System installiert.

Nach der erfolgreichen Installation habe ich nun ein Verzeichnis erstellt checkingund den folgenden Befehl ausgeführt.

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

Wie erwartet hat mir der obige Befehl 10 Kopien der Webseite heruntergeladen. Sie können die gewünschte Nummer einstellen seq.

Weitere Informationen darüber , wie Sie den gleichen Befehl parallel laufen zu lassen, können Sie die Beispiele , die von Gnu-parallel von überprüfen hier . Auf der Beispielseite

Wenn Sie denselben Befehl zehnmal parallel mit denselben Argumenten ausführen möchten, können Sie Folgendes tun:

seq 10 | parallel -n0 my_command my_args

BEARBEITEN

Um die parallelAusführung zu nutzen, können Sie den Befehl wie folgt verwenden:

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

Mit dieser -jOption können Sie die Gesamtzahl der Jobs angeben, die basierend auf der Gesamtzahl der CPU-Kerne parallel ausgeführt werden können.

Ramesh
quelle
Danke Ramesh. Wie oft wird mein Dienst mit diesem Ansatz angerufen?
David
@ user2809564, siehe die Updates.
Ramesh
cool. Ist es auch möglich, diesen Belastungstest 10-15 Minuten lang konstant durchzuführen?
David
Ich denke, dieses Beispiel wird mehr Einblicke liefern. stackoverflow.com/a/7627103/1742825
Ramesh
@ user2809564, bitte beziehen Sie sich auch auf diese Frage, wo ich den Vorschlag zur Verwendung bekommen habe GNU parallel. unix.stackexchange.com/questions/114962/…
Ramesh