Mit Bash

Mit Bash

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 42definiert, wie viele curls gleichzeitig ausgeführt werden sollen.
-n 23definiert, wie viele Anfragen jeder curlAufruf verarbeitet. -n 1deaktiviert 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 forSchleife 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 , evalum 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.

verwandte Informationen