如何从 bash shell 脚本并行调用服务 URL?

如何从 bash shell 脚本并行调用服务 URL?

我有一个从另一个应用程序调用的服务。以下是我正在调用的服务 URL -

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

我需要以多线程方式对上面的服务 URL 进行一些负载测试,而不是逐一顺序调用。

bash shell 脚本有什么方法可以通过以多线程方式调用上面的服务 URL 来加载它吗?如果可能的话,我可以让 60-70 个线程非常快地并行调用上述 URL?

答案1

我不会将其称为多线程,但您可以简单地在后台启动 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

答案2

尝试 ab,你也会得到一个不错的统计数据:

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

此调用将执行 10000 个请求,并发 70 个并行查询。

答案3

你可以尝试安装GNU并行。您可以从以下位置获得一些 GNU 并行示例这里

测试

我从源代码安装gnu-parallel在我的机器上,我可以让它工作。

您可以从源代码安装它这里。我有一个 redhat 系统,所以我下载了 fedora 软件包,然后运行.configure​​,make并将make installparallel安装在我的系统中。

现在,成功安装后,我创建了一个目录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选项可以根据 CPU 核心总数指定可以并行执行的作业总数。

相关内容