Como chamar um URL de serviço do script shell bash em paralelo?

8

Eu tenho um serviço que estou chamando de outro aplicativo. Abaixo está o URL do meu serviço que estou chamando -

http://www.betaservice.domain.host.com/web/hasChanged?ver=0

Eu preciso fazer algum teste de carga no meu URL de serviço acima de maneira multithread em vez de chamar sequencialmente um por um.

Existe alguma maneira de bash shell script, eu posso colocar uma carga no meu URL de serviço acima, chamando-o de maneira multithread? Posso ter 60-70 threads chamando acima do URL em paralelo muito rápido, se possível?

david
fonte

Respostas:

13

Eu não chamaria isso de multithreading, mas você poderia simplesmente lançar 70 empregos em segundo plano:

for i in {1..70}; do 
   wget http://www.betaservice.domain.host.com/web/hasChanged?ver=0 2>/dev/null &
done

Isso resultará em 70 wgetprocessos em execução ao mesmo tempo. Você também pode fazer algo mais sofisticado como este pequeno script:

#!/usr/bin/env bash

## The time (in minutes) the script will run for. Change 10
## to whatever you want.
end=$(date -d "10 minutes" +%s);

## Run until the desired time has passed.
while [ $(date +%s) -lt "$end" ]; do 
    ## Launch a new wget process if there are
    ## less than 70 running. This assumes there
    ## are no other active wget processes.
    if [ $(pgrep -c wget) -lt 70 ]; then
        wget http://www.betaservice.domain.host.com/web/hasChanged?ver=0 2>/dev/null &
    fi
done
terdon
fonte
Obrigado. Comprei agora, então posso aumentar o valor 70, certo? É possível continuar fazendo esse teste de carga por 10 a 15 minutos de forma consistente?
david
@ user2809564 ver resposta atualizada.
terdon
claro, obrigado pela edição. Quando corri acima do script, recebi um erro como pgrep: invalid option -- 'c'. Não sei por que, você pode pensar qual pode ser o motivo?
david
@ user2809564 você provavelmente tem uma pgrepimplementação diferente . Isso é Linux? Qual? De qualquer forma, você pode simplesmente mudar essa linha paraif [ $(pgrep wget | wc -l) -lt 70 ]; then
terdon
9

Tente ab, você também obtém uma boa estatística:

ab -n 10000 -c 70 http://www.betaservice.domain.host.com/web/hasChanged?ver=0

Essa chamada fará 10000 solicitações com simultaneidade de 70 consultas paralelas.

jim
fonte
como posso instalar o banco apache Red Hat Enterprise Linux Server release 6.3?
david
1
yum install httpd-tools, de acordo com serverfault.com/a/363775/10989
RJHunter 9/09/14
5

Você pode tentar instalar o GNU paralelo. Você pode obter alguns exemplos paralelos do GNU aqui .

Teste

Eu instalei gnu-parallelda fonte na minha máquina e consegui que ela funcionasse.

Você pode instalá-lo a partir da fonte a partir daqui . Eu tenho um sistema redhat, então baixei o pacote fedora e executei o .configure, makee make installpara parallelinstalá-lo no meu sistema.

Agora, após a instalação bem-sucedida, criei um diretório checkinge executei o comando abaixo.

seq 10 | parallel -n0  wget http://www.betaservice.domain.host.com/web/hasChanged?ver=0

Como esperado, o comando acima baixou 10 cópias da página da web. Você pode definir o número que desejar seq.

Para mais informações sobre como executar o mesmo comando em paralelo, você pode verificar os exemplos fornecidos pelo gnu-parallel a partir daqui . Na página de exemplo,

Se você deseja executar o mesmo comando com os mesmos argumentos 10 vezes em paralelo, é possível:

seq 10 | paralelo -n0 my_command my_args

EDITAR

Agora, para aproveitar a parallelexecução, você pode usar o comando como,

 seq 70 | parallel -j70 wget http://www.betaservice.domain.host.com/web/hasChanged?ver=0

A -jopção é algo que pode especificar o total de tarefas que podem ser executadas em paralelo com base no total de núcleos da CPU.

Ramesh
fonte
Obrigado Ramesh. Quantas vezes ele ligará para o meu serviço com essa abordagem?
david
@ user2809564, veja as atualizações.
Ramesh
legal. Também é possível continuar fazendo esse teste de carga por 10 a 15 minutos de forma consistente?
david
Eu acho que este exemplo fornecerá mais informações. stackoverflow.com/a/7627103/1742825
Ramesh
@ user2809564, consulte esta pergunta também onde recebi a sugestão de usar GNU parallel. unix.stackexchange.com/questions/114962/…
Ramesh