
これは私のシェルスクリプトです:
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 42
curl
一度に実行する の数を定義します。
-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"
"$@"
eval
printf %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を同時に実行する必要があります。