Как вызвать URL службы из сценария оболочки bash параллельно?

8

У меня есть сервис, который я звоню из другого приложения. Ниже приведен URL-адрес моей службы, на который я звоню.

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

Мне нужно выполнить несколько нагрузочных тестов на моем указанном выше URL-адресе службы многопоточным способом вместо последовательного вызова по одному.

Есть ли какой-нибудь способ из сценария оболочки bash, я могу загрузить вышеуказанный URL-адрес службы, вызвав его многопоточным способом? У меня может быть 60-70 потоков, вызывающих параллельный URL выше очень быстро, если это возможно?

Дэвид
источник

Ответы:

13

Я бы не назвал это многопоточностью как таковой, но вы могли бы просто запустить 70 заданий в фоновом режиме:

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

Это приведет к одновременному wgetзапуску 70 процессов. Вы также можете сделать что-то более сложное, как этот маленький скрипт:

#!/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
Тердон
источник
Спасибо. Теперь я понял, так что я могу просто увеличить значение 70, верно? Можно ли продолжать выполнять этот нагрузочный тест в течение 10-15 минут последовательно?
Дэвид
@ user2809564 см обновленный ответ.
Тердон
конечно, спасибо за редактирование Когда я запустил скрипт выше, я получил ошибку как pgrep: invalid option -- 'c'. Я не уверен, почему, вы можете подумать, что может быть причиной?
Дэвид
@ user2809564 у вас, вероятно, другая pgrepреализация. Это Linux? Который из? В любом случае, вы можете просто изменить эту строку наif [ $(pgrep wget | wc -l) -lt 70 ]; then
terdon
9

Попробуйте ab, вы тоже получите хорошую статистику:

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

Этот вызов выполнит 10000 запросов с одновременностью 70 параллельных запросов.

Джим
источник
Как я могу установить Apache Bench в Red Hat Enterprise Linux Server release 6.3?
Дэвид
1
yum install httpd-toolsв соответствии с serverfault.com/a/363775/10989
RJHunter
5

Вы можете попробовать установить GNU параллельно. Вы можете получить несколько параллельных примеров GNU здесь .

тестирование

Я установил gnu-parallelиз источника на моей машине, и я мог заставить его работать.

Вы можете установить его из источника здесь . У меня есть система RedHat , и поэтому я скачал пакет фетрового , а затем побежал .configure, makeи , make installчтобы получить parallelустановлен в моей системе.

Теперь, после успешной установки, я создал каталог checkingи выполнил приведенную ниже команду.

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

Как и ожидалось, вышеприведенная команда загрузила мне 10 копий веб-страницы. Вы можете установить номер, который вы хотите с seq.

Для получения дополнительной информации о том, как выполнить одну и ту же команду параллельно, вы можете проверить примеры, предоставленные gnu-parallel отсюда . На странице примера

Если вы хотите выполнить одну и ту же команду с одинаковыми аргументами 10 раз параллельно, вы можете сделать:

сек 10 | параллель -n0 my_command my_args

РЕДАКТИРОВАТЬ

Теперь, чтобы воспользоваться преимуществами parallelвыполнения, вы можете использовать команду как,

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

Эта -jопция может указывать общее количество заданий, которые могут выполняться параллельно на основе общего количества ядер ЦП.

Рамеш
источник
Спасибо, Рамеш. Сколько раз он будет вызывать мой сервис с таким подходом?
Дэвид
@ user2809564, смотрите обновления.
Рамеш
прохладно. Также возможно ли продолжать выполнять этот нагрузочный тест в течение 10-15 минут последовательно?
Дэвид
Я думаю, что этот пример даст больше понимания. stackoverflow.com/a/7627103/1742825
Рамеш,
@ user2809564, пожалуйста, обратитесь к этому вопросу, где я получил предложение использовать GNU parallel. unix.stackexchange.com/questions/114962/…
Рамеш