
이것은 내 쉘 스크립트입니다.
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
보시다시피 무작위 콘텐츠가 포함된 여러 파일을 생성하고 있습니다.
그런 다음 업로드하기 위해 컬 요청을 수행합니다.
해당 명령을 수행하려면 다음을 입력하면 됩니다.
$ ./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
씁니다 . \0
이러한 인수는 Curl에 전달되기를 원합니다. Xargs는 이를 Bash에 전달하여 "$1"
, "$2"
, ... (일명 "$@"
) 에 할당됩니다 . 이제 eval
인수 그룹을 해제하는 데 사용합니다 . 모든 특수 문자는 를 사용하여 적절하게 이스케이프 처리되었으므로 printf %q
Bash는 원치 않는 따옴표 제거나 단어 분할을 수행하지 않습니다.
"$0" "$@"
로 확장됩니다curl --next http://l... --next ...
Curl은 단 한 번의 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은 hangup 신호를 무시하고 사용자 입력 없이 백그라운드에서 프로세스를 실행하도록 쉘에 지시합니다. 따라서 동시에 여러 CURL을 실행해야 합니다.