배쉬와 함께

배쉬와 함께

이것은 내 쉘 스크립트입니다.

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 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씁니다 . \0이러한 인수는 Curl에 전달되기를 원합니다. Xargs는 이를 Bash에 전달하여 "$1", "$2", ... (일명 "$@") 에 할당됩니다 . 이제 eval인수 그룹을 해제하는 데 사용합니다 . 모든 특수 문자는 를 사용하여 적절하게 이스케이프 처리되었으므로 printf %qBash는 원치 않는 따옴표 제거나 단어 분할을 수행하지 않습니다. "$0" "$@"로 확장됩니다curl --next http://l... --next ...

Curl은 단 한 번의 TCP 핸드셰이크를 시도하고 인수에 나열된 모든 요청을 보내기 위해 해당 영구 연결을 재사용합니다. 요청 크기에 따라 속도가 눈에 띄게 향상될 수 있습니다.

대시와 함께

Dash는 를 지원하지 않지만 printf %qJSON 형식이 (을 통해 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을 실행해야 합니다.

관련 정보