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

Stress test API using multiple JSON files

我正在尝试使用 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。

files/requests看起来都像

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

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

我在 SO 上遇到了 this 示例(针对此问题进行了修改)。 不确定我是否理解为什么当 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 parallel。该工具通过在您的机器上使用多个内核来实现作业并发的好方法。

下载过程非常简单。按照 获取快速简便的步骤列表。该工具有很多更复杂的标志来解决多个用例。不过,根据您的要求,只需转到包含这些 JSON 文件的文件夹并执行

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

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

删除 --dry-run 到 运行 您的实际命令。并记录完成该过程所花费的时间,使用 time 命令,只需在实际命令前加上前缀 time parallel ...