
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 42
define quantos curl
s serão executados por vez.
-n 23
define quantas solicitações cada curl
invocação irá processar.
-n 1
desativa 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 for
loop grava \0
grupos 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 eval
para 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