
Dies ist mein Shell-Skript:
for i in `seq 1 $1`; do
filename=randomfile$(uuidgen).txt
head -c $2 </dev/urandom > $filename
checksum256=$(sha256sum $filename | awk '{ print $1 }')
attrs=$(jq -n --arg cf "$checksum256" '{ "confidential":"N", "transactionId": "sdf", "codiDirCorp": "CorpCode", "expiration": "10/10/2025", "description": "desc", "locked": "N", "title": "titol", "docHash": $cf }')
curl -X POST \
'http://localhost:8083/documents?application=RDOCUI&user=nif' \
-F docFile=@$filename \
-F 'docAttributes='"${attrs}"''
done
Wie Sie sehen, generiere ich mehrere Dateien mit zufälligem Inhalt.
Danach führe ich einfach eine Curl-Anfrage aus, um sie hochzuladen.
Um diesen Befehl auszuführen, gebe ich einfach Folgendes ein:
$ ./stress.sh 1000 200K
Hier generiere ich 1000 Dateien und 1000 Anfragen, um sie hochzuladen.
Ich möchte es beschleunigen, indem ich diese Anfragen parallel ausführe.
Irgendwelche Ideen?
Antwort1
Xargs kann das im Vordergrund tun und gibt Ihnen Kontrolle über Parallelität und Batchverarbeitung. Curl verwendet eine offene Verbindung erneut, um alle Anfragen in einem Batch zu senden.
-P 42
definiert, wie viele curl
s gleichzeitig ausgeführt werden sollen.
-n 23
definiert, wie viele Anfragen jeder curl
Aufruf verarbeitet.
-n 1
deaktiviert die Stapelverarbeitung.
Mit Bash
#! /bin/bash
URL='http://localhost:8083/documents?application=RDOCUI&user=nif'
for i in `seq $1`
do
filename=randomfile$(uuidgen).txt
head -c $2 </dev/urandom > $filename
export checksum256=$(sha256sum $filename | awk '{ print $1 }')
attrs=$(jq -n '{ "foo": "bar", "docHash": env.checksum256 }')
printf -- '--next %q -F docFile=@%q -F docAttributes=%q\0' "$URL" "$filename" "$attrs"
done |
xargs -0 -n 23 -P 42 bash -c 'eval "$0" "$@"' curl
Die for
Schleife schreibt \0
-getrennte Gruppen von durch Leerzeichen getrennten Argumenten in die Pipe, damit Xargs sie lesen kann. Diese Argumente sollen an Curl übergeben werden. Xargs übergibt sie wiederum an Bash, sodass sie "$1"
, "$2"
, ... (auch bekannt als "$@"
) zugewiesen werden. Jetzt verwenden wir , eval
um die Gruppierung der Argumente aufzuheben. Alle Sonderzeichen wurden ordnungsgemäß mit maskiert printf %q
, sodass Bash keine unerwünschten Anführungszeichen entfernt oder Wörter trennt.
"$0" "$@"
wird erweitert zucurl --next http://l... --next ...
Curl versucht, nur einen TCP-Handshake durchzuführen und diese dauerhafte Verbindung erneut zu verwenden, um alle in seinen Argumenten aufgeführten Anfragen zu senden. Abhängig von der Anfragegröße kann dies zu einer spürbaren Beschleunigung führen.
Mit Dash
Dash unterstützt nicht printf %q
, aber wenn Ihre JSON-Formatierung geopfert werden kann (über jq -c
), können Sie sie mit maskieren printf '%s'
. Wir müssen uns auch darauf verlassen, dass weder JSON noch andere Argumente enthalten '
.
#! /bin/sh
# ...
attrs=$(jq -n -c '{ "foo": "bar", "docHash": env.checksum256 }')
printf -- "--next %s -F 'docFile=@%s' -F 'docAttributes=%s'\0" "$URL" "$filename" "$attrs"
done |
xargs -0 -n 23 -P 42 sh -c 'eval "$0" "$@"' curl
Ohnefor
Sie haben speziell nach der parallelen Ausführung des Anforderungsteils gefragt. Wenn Sie jedoch das gesamte Skript parallel ausführen möchten, können Sie den Befehl folgendermaßen eingeben
$ seq 1000 | xargs -n 1 -P 42 ./stress.sh 1 200K
Antwort2
Sie können jederzeit einen Blick aufnein
for i in `seq 1 $1`; do
filename=randomfile$(uuidgen).txt
head -c $2 </dev/urandom > $filename
checksum256=$(sha256sum $filename | awk '{ print $1 }')
attrs=$(jq -n --arg cf "$checksum256" '{ "confidential":"N", "transactionId": "sdf", "codiDirCorp": "CorpCode", "expiration": "10/10/2025", "description": "desc", "locked": "N", "title": "titol", "docHash": $cf }')
nohup curl -X POST \
'http://localhost:8083/documents?application=RDOCUI&user=nif' \
-F docFile=@$filename \
-F 'docAttributes='"${attrs}"''
done
nohup weist die Shell an, den Prozess ohne Benutzereingabe im Hintergrund auszuführen und Auflegesignale zu ignorieren. Sie sollten also mehrere CURLs gleichzeitig laufen haben.