使用多个 JSON 文件的压力测试 API



我正在尝试使用 40000 个不同的 JSON 文件向 API 发出 40000 个请求。

通常我可以做这样的事情:

for file in /dir/*.json
do
#ab -p $file -T application/json -c1 -n1 <url>
curl -X POST -d@"$file" <url> -H "Content-Type: application/json"
done;

我的问题是我想同时运行请求,例如 100 个,我希望记录发送所有请求等所花费的总时间。我不能在 ab 中使用 -c 100 -n 40000,因为它是具有不同文件的相同 URL。

文件/请求看起来都像

{"source":"000000000000","type":"A"}
{"source":"000000000001","type":"A"}
{"source":"000000000003","type":"A"}

我找不到任何开箱即用支持此功能的工具(例如Apache Benchmark - ab)。

我在 SO 上遇到了这个例子(针对这个问题进行了修改)。 不确定我是否理解为什么当 mkfifo tmp 是一个文件而不是目录时,该示例会"cat/tmp"。可能有效吗?

mkfifo tmp
counter=0
for file in /dir/*.json
do
if [ $counter -lt 100 ]; then
curl -X POST -H "Content-Type: application/json" -d@"$file" <url> &
let $[counter++];
else
read x < tmp
curl -X POST -H "Content-Type: application/json" -d@"$file" <url> &
fi
done;
cat /tmp > /dev/null
rm tmp

我应该如何在perl,ksh,bash或类似文件中实现这一目标,或者有谁知道任何开箱即用的工具支持它?

谢谢!

如果你的请求只是为了计算每次发送这 40000 个curl请求所花费的总时间,使用不同的 JSON,你可以很好地使用 GNU 并行。该工具通过利用计算机上的多个内核,具有实现作业并发的好方法。

下载过程非常简单。按照 如何在 CentOS 7 上安装 GNU 并行 (noarc.rpm) 来快速轻松地列出步骤。该工具具有更复杂的标志来解决多个用例。不过,根据您的要求,只需转到包含这些 JSON 文件的文件夹并执行

parallel --dry-run -j10 curl -X POST -H "Content-Type: application/json" -d@{} <url> ::: *.json

上面的命令尝试干运行你的命令,就parallel如何设置标志和处理其参数以及开始运行你的命令而言。此处{}表示您的 JSON 文件。我们在此处指定一次运行 10 个作业,并根据它在计算机上的运行速度以及检查计算机上的内核数来增加数量。还有一些标志可以限制parallel允许使用的整体 CPU,这样它就不会完全阻塞您的系统。

删除--dry-run以运行实际命令。要记录该过程完成所需的时间,请使用time命令,只需在实际命令之前将其前缀作为time parallel ...

最新更新