Curl 命令发送异步请求

Curl 命令发送异步请求

我使用这个 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 毫秒,因此如果你的curls 真的很短,你可以执行多个:

seq 10000 | parallel -j 10 --joblog my.log 'doit;doit;doit;doit;doit;doit;doit;doit;doit;doit'

相关内容