バッシュの場合

バッシュの場合

これは私のシェルスクリプトです:

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

ご覧のとおり、ランダム化されたコンテンツを含む複数のファイルを生成しています。

その後は、アップロードするために curl リクエストを実行するだけです。

このコマンドを実行するには、次のように入力するだけです。

$ ./stress.sh 1000 200K

ここでは、1000 個のファイルを生成し、1000 個のアップロード要求を送信します。

これらのリクエストを並行して実行して速度を上げたいと思います。

何か案は?

答え1

Xargs はフォアグラウンドでこれを実行でき、並列処理とバッチ処理を制御できます。Curl は開いている接続を再利用して、すべてのリクエストをバッチで送信します。

-P 42curl一度に実行する の数を定義します。
-n 23各呼び出しで処理するリクエストの数を定義しますcurl-n 1バッチ処理を無効にします。

バッシュの場合

#! /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

ループは、スペースで区切られた引数のグループを、Xargs が読み取れるようにパイプにfor書き込みます。これらの引数は Curl に渡されます。Xargs はそれらを Bash に渡すため、引数は、、、... (別名) に割り当てられます。ここで、引数のグループを解除するために を使用します。特殊文字は で適切にエスケープされているため、Bash は不要な引用符の削除や単語の分割を行いません。 は次のように展開されます。\0"$1""$2""$@"evalprintf %q"$0" "$@"curl --next http://l... --next ...

Curl は、1 回の TCP ハンドシェイクのみを行い、その永続的な接続を再利用して、引数にリストされているすべてのリクエストを送信しようとします。リクエストのサイズによっては、顕著な速度向上が得られる場合があります。

ダッシュ付き

Dash は をサポートしていませんprintf %qが、 JSON フォーマットを ( を介して) 犠牲にできる場合は、jq -cでエスケープできますprintf '%s'。 また、JSON やその他の引数には が含まれていないという前提に頼る必要があります'

#! /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

それなしfor

リクエスト部分を並列で実行することについて具体的に質問されましたが、スクリプト全体を並列で実行したい場合は、次のようにコマンドを入力できます。

$ seq 1000 | xargs -n 1 -P 42 ./stress.sh 1 200K

答え2

いつでも見ることができますノーフープ

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は、シェルに、ユーザーの入力なしでプロセスをバックグラウンドで実行し、ハングアップ信号を無視するように指示します。したがって、複数のCURLを同時に実行する必要があります。

関連情報