Я использую этот запрос 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 и т. д.?
Я также не мог заставить xargs -P
работать, когда мне нужно было сделать что-то подобное, и в итоге я использовал &
.
Изman bash
:
Если команда завершается управляющим оператором &, оболочка выполняет команду в фоновом режиме в подоболочке. Оболочка не ожидает завершения команды, и статус возврата равен 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
, а затем обработать его, используя ваш любимые инструменты анализа.