BASH 스크립트로 서비스 부하 테스트 하기
성능 테스트를 위해 몇 가지 툴들을 알아보다 제품의 특성에 맞게 구현하기 위해 쉘 스크립트로 구현하려고 한다.
오랜만에 쉘 스크립트를 만지려니 이건 뭐 완행열차가 따로 없다.
단순한 반복문이나 문자열 처리부터 chatGPT에게 물어보면서 하려니 영 속도가 나지 않는다.
뭐! 삽질 한두번 해본것도 아니고!! 또 해본다.
순차적으로 증가하는 일련번호 만들기.
서비스 시뮬레이션을 위해 기준이 되는 정보가 필요한데 데이터는 텍스트 파일에서 읽어오기로 한다.
데이터에는 순차적으로 증가하는 일련번호가 필요해서 아래와 같이 vim을 이용해보자.
엑셀로 만들어도 되겠지만 터미널에서 vim으로 일련번호를 만들어보자.
vim의 명령어 모드에서
Ctrl-v 로 원하는 영역에 “Visual Block”을 설정하고.
g Ctrl-a 하면 아래와 같이 D0002 ~ D0011 과 같은 순서대로 증가하는 일변번호를 만들 수 있다.
$ cat application.lst
D0002,7000002,I,A,1528100002
D0003,7000003,I,A,1528100003
D0004,7000004,I,A,1528100004
D0005,7000005,I,A,1528100005
D0006,7000006,I,A,1528100006
D0007,7000007,I,A,1528100007
D0008,7000008,I,A,1528100008
D0009,7000009,I,A,1528100009
D0010,7000010,I,A,1528100010
D0011,7000011,I,A,1528100011
콤마(,)로 구분된 텍스트 파일 읽어 loop
만들어진 데이터를 순서대로 읽어 API로 던질 포맷을 만들어 일정한 간격으로 전송하려고 할 때 아래와 같이 while loop 의 IFS(필드 분리자)를 콤마(,)로 설정하고 읽어 올 변수를 설정하면 FILE의 라인 수만 큼 loop가 반복된다.
FILE='application.lst'
# main loop
echo "START : "`date +%T.%3N` # 시작시간을 마이크로초 단위로 기록
while IFS=',' read col1 col2 col3 col4 col5 # WHILE 루프
do
# action
echo "docid=$col1 appid=$col2 inout=$col3 type=$col4 cid=$col5"
sleep 0.01
done < $FILE # 파일 읽기
echo "END : "`date +%T.%3N` # 종료시간을 마이크로초 단위로 기록
# 터미널 출력 결과
START : 01:44:54.887
docid=D0002 appid=7000002 inout=I type=A cid=1528100002
docid=D0003 appid=7000003 inout=I type=A cid=1528100003
docid=D0004 appid=7000004 inout=I type=A cid=1528100004
docid=D0005 appid=7000005 inout=I type=A cid=1528100005
docid=D0006 appid=7000006 inout=I type=A cid=1528100006
docid=D0007 appid=7000007 inout=I type=A cid=1528100007
docid=D0008 appid=7000008 inout=I type=A cid=1528100008
...
END : 01:44:55.006
bash 시간 포맷
시뮬레이션을 하는 동안 기록한 시간은 마이크로초 단위가 필요하고 아래와 같이 date 명령어로 시간 포맷을 정할 수 있다.
%T : %H:%M:%S 형식으로 시:분:초를 표시한다.
%N : nanoseconds 단위를 표시한다.
%3N : 소수점 이하 3자리 까지 표시
❯ date +%T.%N
01:55:26.893696184
❯ date +%T.%3N
01:57:52.356
경과 시간 구하기 (ChatGPT )
트랜잭션 단위로 경과시간을 구하기 위해 구글 검색을 돌렸더니 chatGPT 플러그인이 튀어나와 아래처럼 하라고 한다.
date +%s : 현재 시간을 초 단위로 변환하여 저장.
시작_시간=$(date +%s)
# 여기에 작업을 수행
끝_시간=$(date +%s)
경과_시간=$((끝_시간 - 시작_시간))
echo "작업에 소요된 시간: $경과_시간 초"
밀리세컨드 단위 경과 시간 구하기 (ChatGPT)
다시 elapsed time milliseconds in bash 로 검색했더니 아래처럼 알려준다.
start_time=$(date +%s%N) # 시작 시간을 초와 나노초로 저장
# 수행할 작업
end_time=$(date +%s%N) # 종료 시간을 초와 나노초로 저장
# 경과 시간 계산
elapsed_milliseconds=$((($end_time - $start_time) / 1000000))
echo "경과 시간: $elapsed_milliseconds 밀리초"
bc 로 계산하기.
리눅스의 bc 명령어를 이용하면 초.밀리세컨드 형식으로 직접 연산도 가능하다.
start_time=$(date +%s.%3N)
# perform a task
end_time=$(date +%s.%3N)
# elapsed time with millisecond resolution
# keep three digits after floating point.
elapsed=$(echo "scale=3; $end_time - $start_time" | bc)
tldr
웬만 한 쉘 명령어 사용법은 chatGPT가 다 알고 있다.
bash 스크립트 문법은 항상 헷갈리니 GPT를 잘 활용하자..