我有一个从另一个应用程序调用的服务。以下是我正在调用的服务 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 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
选项可以根据 CPU 核心总数指定可以并行执行的作业总数。