我使用这个 curl 请求将数据发送到 API:
curl --location --request POST 'MY_IP' \
--header 'Content-Type: text/plain' \
--data-raw ' [{
"event_id": "123",
}]
'
我想通过异步发送请求来检查 API 性能,并测量所花费的时间。我尝试过并行xargs -P 10
发送 10 个请求,但无法做到?有什么帮助吗?我该如何测量时间?
我的代码:
#!/bin/bash
Body='{
"event_id": "12",
"metric_name": "API",
"value" : "1",
"dimensions": {
},
"timestamp_ms": 1615552313
}';
seq 1 2 | xargs -n1 -P10 curl --location --request POST '10.33.137.98:8080' --header 'Content-Type: text/plain' --data-raw "$Body"
但是如何计算 P95、P90 等时间?
答案1
当我需要做类似的事情时,我也无法xargs -P
工作,最后我使用了&
。
从man bash
:
如果命令以控制操作符 & 结束,则 shell 会在子 shell 中在后台执行该命令。shell 不会等待命令完成,返回状态为 0。这些被称为异步命令。
所以也许是这样的?
#!/bin/bash
Body='{
"event_id": "12",
"metric_name": "API",
"value" : "1",
"dimensions": {
},
"timestamp_ms": 1615552313
}';
function run() {
for i in $(seq 1 10); do
echo "running task $i"
curl --location --request POST '10.33.137.98:8080' --header 'Content-Type: text/plain' --data-raw "$Body" &
done
wait
}
time run
解释:
time
用于测量总执行时间,请参见man time
wait
确保所有后台作业在继续之前完成,否则time
只会测量启动所有请求需要多长时间,而不是获取响应需要多长时间parallel
也可能有效代替&
time
要计算统计数据,您可以使用循环中的第二个调用输出每个请求的时间for
,然后使用您最喜欢的分析工具对其进行处理。
答案2
创建一个 bash 函数。从 GNU Parallel 调用它。用来--joblog
查看时间。
doit() {
curl --location --request POST 'MY_IP' \
--header 'Content-Type: text/plain' \
--data-raw ' [{
"event_id": "123",
}]
'
}
export -f doit
seq 10000 | parallel -j 10 --joblog my.log doit
现在看看 my.log。
GNU Parallel 每个作业的开销为 1-10 毫秒,因此如果你的curl
s 真的很短,你可以执行多个:
seq 10000 | parallel -j 10 --joblog my.log 'doit;doit;doit;doit;doit;doit;doit;doit;doit;doit'