Com festança

Com festança

Este é o meu script de shell:

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

Como você pode ver, estou gerando vários arquivos com conteúdo aleatório.

Depois disso, apenas executo uma solicitação curl para carregá-los.

Para executar esse comando, basta digitar:

$ ./stress.sh 1000 200K

Aqui, eu gero 1.000 arquivos e 1.000 solicitações de upload.

Gostaria de agilizar a execução dessas solicitações em paralelo.

Alguma ideia?

Responder1

Xargs pode fazer isso em primeiro plano e dá controle sobre paralelismo e lote. Curl reutilizará uma conexão aberta para enviar todas as solicitações em lote.

-P 42define quantos curls serão executados por vez.
-n 23define quantas solicitações cada curlinvocação irá processar. -n 1desativa o lote.

Com festança

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

O forloop grava \0grupos separados por espaços de argumentos separados por espaço no canal para Xargs ler. Esses argumentos querem ser passados ​​para Curl. O Xargs, por sua vez, os passa para o Bash, para que sejam atribuídos a "$1", "$2", ... (também conhecido como "$@"). Agora usamos evalpara desagrupar os argumentos. Quaisquer caracteres especiais foram escapados corretamente usando printf %q, então o Bash não fará nenhuma remoção indesejada de aspas ou divisão de palavras. "$0" "$@"expandirá paracurl --next http://l... --next ...

Curl tentará fazer apenas um handshake TCP e reutilizar essa conexão persistente para enviar todas as solicitações listadas em seus argumentos. Dependendo do tamanho da solicitação, isso pode proporcionar uma aceleração perceptível.

Com traço

Dash não suporta printf %q, mas se sua formatação JSON puder ser sacrificada (via jq -c), você poderá escapar dela com printf '%s'. Também teremos que confiar na suposição de que nem JSON nem outros argumentos contêm '.

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

Semfor

Você perguntou especificamente sobre a execução paralela da parte da solicitação. Mas se quiser executar todo o script em paralelo, você pode digitar o comando da seguinte maneira

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

Responder2

Você sempre pode dar uma olhadanada

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 diz ao shell para executar o processo em segundo plano sem a entrada do usuário, ignorando os sinais de desligamento. Então você deve ter vários CURLs rodando ao mesmo tempo

informação relacionada