web-dev-qa-db-ja.com

bashシェルスクリプトからサービスURLを並行して呼び出す方法は?

別のアプリケーションから呼び出しているサービスがあります。以下は私が呼んでいる私のサービスURLです-

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

上記のサービスURLに対して、1つずつ順番に呼び出すのではなく、マルチスレッドで負荷テストを行う必要があります。

Bashシェルスクリプトからの方法はありますか?マルチスレッドで呼び出すことにより、上記のサービスURLに負荷をかけることができますか?可能であれば、60-70のスレッドが並列に非常に高速にURLを呼び出すことができますか?

8
david

私はそれをマルチスレッディングとは呼びませんが、70個のジョブをバックグラウンドで起動するだけです。

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

これにより、70個のwgetプロセスが同時に実行されます。次の小さなスクリプトのように、より洗練された処理を行うこともできます。

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

Abを試してください。Nice統計も得られます。

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

この呼び出しは、70の並列クエリの同時実行で10000のリクエストを実行します。

9
jim

GNU parallelをインストールしてみてください。 here からGNU parallelの例をいくつか入手できます。

テスト

インストール済みgnu-parallel私のマシンのソースから、それを機能させることができました。

here からソースからインストールできます。私はredhatシステムを持っているので、Fedoraパッケージをダウンロードしてから.configuremakeおよびmake installを使用して、システムにparallelをインストールします。

今、インストールが成功した後、ディレクトリcheckingを作成し、以下のコマンドを実行しました。

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

予想通り、上記のコマンドでWebページのコピーが10個ダウンロードされました。 seqを使用して、必要な数を設定できます。

同じコマンドを並行して実行する方法の詳細については、gnu-parallelが here から提供する例を確認できます。サンプルページから、

同じ引数で同じコマンドを10回並行して実行したい場合は、次のようにします。

seq 10 |パラレル-n0 my_command my_args

[〜#〜]編集[〜#〜]

parallelの実行を利用するには、次のようにコマンドを使用します。

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

-jオプションは、CPUコアの合計に基づいて並行して実行できるジョブの合計を指定できるものです。

5
Ramesh