Bagaimana cara memanggil URL layanan dari skrip bash shell secara paralel?

8

Saya memiliki layanan yang saya panggil dari aplikasi lain. Di bawah ini adalah URL layanan saya yang saya panggil -

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

Saya perlu melakukan beberapa tes beban pada URL layanan saya di atas dengan cara multithreaded alih-alih memanggil secara berurutan satu per satu.

Apakah ada cara dari skrip bash shell, saya dapat menaruh beban pada URL layanan saya di atas dengan memanggilnya dengan cara multithreaded? Saya dapat memiliki 60-70 utas yang memanggil URL di atas secara paralel dengan sangat cepat jika memungkinkan?

David
sumber

Jawaban:

13

Saya tidak akan menyebutnya multithreading seperti itu tetapi Anda hanya dapat meluncurkan 70 pekerjaan di latar belakang:

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

Itu akan menghasilkan 70 wgetproses berjalan sekaligus. Anda juga dapat melakukan sesuatu yang lebih canggih seperti skrip kecil ini:

#!/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
sumber
Terima kasih. Saya mendapatkannya sekarang, jadi saya hanya dapat meningkatkan nilai 70 kan? Apakah ini mungkin untuk terus melakukan tes beban ini selama 10-15 menit secara konsisten?
david
@ user2809564 lihat jawaban yang diperbarui.
terdon
tentu, Terima kasih atas hasil editnya. Ketika saya menjalankan skrip di atas, saya mendapat kesalahan sebagai pgrep: invalid option -- 'c'. Saya tidak yakin mengapa, dapatkah Anda memikirkan alasannya?
david
@ user2809564 Anda mungkin memiliki pgrepimplementasi yang berbeda . Apakah ini Linux? Yang mana? Bagaimanapun, Anda dapat mengubah baris itu keif [ $(pgrep wget | wc -l) -lt 70 ]; then
terdon
9

Coba ab, Anda mendapatkan statistik yang bagus juga:

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

Panggilan ini akan melakukan 10.000 permintaan dengan konkurensi 70 pertanyaan paralel.

Jim
sumber
bagaimana cara menginstal bangku apache Red Hat Enterprise Linux Server release 6.3?
david
1
yum install httpd-tools, menurut serverfault.com/a/363775/10989
RJHunter
5

Anda dapat mencoba menginstal paralel GNU. Anda bisa mendapatkan beberapa contoh paralel GNU dari sini .

Pengujian

Saya menginstal gnu-paralleldari sumber di mesin saya dan saya bisa membuatnya bekerja.

Anda dapat menginstalnya dari sumber dari sini . Saya memiliki sistem redhat dan saya mengunduh paket fedora dan kemudian menjalankan .configure, makedan make installuntuk parallelmenginstalnya di sistem saya.

Sekarang, setelah instalasi berhasil, saya membuat direktori checkingdan menjalankan perintah di bawah ini.

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

Seperti yang diharapkan, perintah di atas mengunduh saya 10 salinan dari halaman web. Anda dapat mengatur nomor yang Anda inginkan seq.

Untuk informasi lebih lanjut tentang cara menjalankan perintah yang sama secara paralel, Anda dapat memverifikasi contoh-contoh yang disediakan oleh gnu-parallel dari sini . Dari halaman contoh,

Jika Anda ingin menjalankan perintah yang sama dengan argumen yang sama 10 kali secara paralel, Anda dapat melakukannya:

seq 10 | parallel -n0 my_command my_args

EDIT

Sekarang, untuk memanfaatkan paralleleksekusi, Anda dapat menggunakan perintah sebagai,

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

The -jpilihan adalah sesuatu yang bisa menentukan total pekerjaan yang dapat dieksekusi secara paralel berdasarkan total core CPU.

Ramesh
sumber
Terima kasih, Ramesh. Berapa kali akan memanggil layanan saya dengan pendekatan ini?
david
@ user2809564, lihat pembaruan.
Ramesh
keren. Apakah ini mungkin untuk terus melakukan tes beban ini selama 10-15 menit secara konsisten?
david
Saya pikir contoh ini akan memberikan lebih banyak wawasan. stackoverflow.com/a/7627103/1742825
Ramesh
@ user2809564, silakan merujuk ke pertanyaan ini juga di mana saya mendapat saran untuk digunakan GNU parallel. unix.stackexchange.com/questions/114962/...
Ramesh