Come chiamare un URL del servizio dallo script della shell bash in parallelo?


8

Ho un servizio che sto chiamando da un'altra applicazione. Di seguito è riportato l'URL del mio servizio che sto chiamando -

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

Devo fare un test di carico sul mio URL del servizio sopra in modo multithread invece di chiamare in sequenza uno per uno.

C'è qualche modo dallo script di shell bash, posso caricare il mio URL del servizio sopra richiamandolo in modo multithread? Posso avere 60-70 thread che chiamano sopra l'URL in parallelo molto velocemente se possibile?

Risposte:


13

Non lo definirei multithreading in quanto tale, ma potresti semplicemente avviare 70 lavori in background:

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

Ciò comporterà 70 wgetprocessi in esecuzione contemporaneamente. Puoi anche fare qualcosa di più sofisticato come questo piccolo 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

Grazie. L'ho preso ora, quindi posso solo aumentare il valore di 70 giusto? È possibile continuare questo test di carico per 10-15 minuti in modo coerente?
David,

@ user2809564 vedi risposta aggiornata.
terdon

certo, grazie per la modifica. Quando ho eseguito sopra lo script, ho ricevuto l'errore come pgrep: invalid option -- 'c'. Non sono sicuro del perché, riesci a pensare a quale potrebbe essere la ragione?
david

@ user2809564 probabilmente hai pgrepun'implementazione diversa . Questo è Linux? Quale? Ad ogni modo, puoi semplicemente cambiare quella riga inif [ $(pgrep wget | wc -l) -lt 70 ]; then
terdon

9

Prova ab, ottieni anche una bella statistica:

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

Questa chiamata farà 10000 richieste con una concorrenza di 70 query parallele.


come posso installare la panca apache Red Hat Enterprise Linux Server release 6.3?
david

1
yum install httpd-tools, secondo serverfault.com/a/363775/10989
RJHunter

5

Potresti provare a installare GNU in parallelo. Puoi ottenere alcuni esempi paralleli GNU da qui .

analisi

Ho installato gnu-paralleldalla fonte nel mio computer e ho potuto farlo funzionare.

È possibile installarlo dal sorgente da qui . Ho un sistema redhat e quindi ho scaricato il pacchetto fedora e quindi eseguito il .configure, makee make installper ottenere l' parallelinstallazione nel mio sistema.

Ora, dopo la corretta installazione, ho creato una directory checkinged eseguito il comando seguente.

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

Come previsto, il comando precedente mi ha scaricato 10 copie della pagina web. È possibile impostare il numero desiderato con seq.

Per ulteriori informazioni su come eseguire lo stesso comando in parallelo, è possibile verificare gli esempi forniti da gnu-parallel da qui . Dalla pagina di esempio,

Se si desidera eseguire lo stesso comando con gli stessi argomenti 10 volte in parallelo, è possibile eseguire:

seq 10 | parallel -n0 my_command my_args

MODIFICARE

Ora, per sfruttare l' parallelesecuzione, puoi usare il comando come,

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

L' -jopzione è qualcosa che potrebbe specificare i lavori totali che possono essere eseguiti in parallelo sulla base dei core totali della CPU.


Grazie Ramesh. Quante volte chiamerà il mio servizio con questo approccio?
david

@ user2809564, vedere gli aggiornamenti.
Ramesh,

freddo. Inoltre è possibile continuare a fare questo test di carico per 10-15 minuti in modo coerente?
David,

Penso che questo esempio fornirà ulteriori approfondimenti. stackoverflow.com/a/7627103/1742825
Ramesh

@ user2809564, fare riferimento anche a questa domanda dove ho ricevuto il suggerimento da utilizzare GNU parallel. unix.stackexchange.com/questions/114962/…
Ramesh
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.