부하 테스트를 할 수 있는 여러 좋은 툴들이 많지만 bash도 연습할 겸 로컬에서 실행시킬 간단한 스크립트를 만들었다.
#!/bin/bash
TPS=$1
URL=$2
LOG=./result.log
function exit_trap() {
echo -e "\nHTTP CODE"
cut -f1 ${LOG} | sort | uniq -c | sort -nr
echo "RESPONSE TIME"
cut -f2 ${LOG} | awk '{ sum += $1 } END { print sum / NR}'
exit 0
}
trap exit_trap INT
for((i=0;;i++))
do
echo -en "\r$i sec"
for _ in `seq 1 $TPS`
do
curl -o /dev/null -s -w '%{http_code}\t%{time_total}' "${URL}" | awk 1 >> ${LOG} &
done
sleep 1
done
TPS를 인자로 받아 background로 curl 요청을 해당 수만큼 실행시키고 1초씩 쉬게 했다.
curl에 여러 옵션이 붙었는데 -o 옵션으로 output을 버리고, -s로 progress meter도 숨겼다. -w 옵션으로는 요청의 응답 http code와 시간만 출력하도록 했다. http_code
와 time_total
은 curl에서 지원하는 format variables이다.
여기까지 하면 background로 실행되는 과정에서 http_code와 time_total이 tap(\t)으로 연결된 하나의 문자열로 인식되지 않고 쪼개지는 현상이 발생한다. 하나의 문자열로 취급하기 위해 불필요해 보이지만 pipe를 한번 더 태운 후 log 파일에 기록했다.
마지막으로 인터럽트 시그널을 trap 해서 log 파일에 기록한 http code 분포와 평균 응답 시간을 출력했다.
실행은 아래와 같이 TPS와 대상 API를 넘기면 된다.
./run.sh 100 localhost:4000
'기타' 카테고리의 다른 글
간단한 파일 대칭키 암호화/복호화 (0) | 2019.12.24 |
---|---|
MySQL DATE INTERVAL 함수 함정 (1) | 2019.12.13 |
[bash] sed 사용 설명서 (0) | 2019.12.01 |
[bash] awk 사용 설명서 (0) | 2019.11.21 |
삭제된 라인의 git commit 찾기 (0) | 2019.11.20 |
댓글