부하 테스트 프로세스 단순화

Q&A·2023년 12월 14일

이슈

  • 회사 모듈 중 하나에서 크래시 이슈가 발생했다.
  • 멀티 인스턴스 환경을 구축하여 여러 회사의 인스턴스를 동시에 작업하다보니 어떤 인스턴스에 작업해야 하는지 헷갈리는, 휴먼 에러가 종종 발생했다.
  • 일의 프로세스를 단순화하고 싶었다. 타 팀에서 주는 새로운 모듈을 특정 폴더에 옮기기, 톰캣을 켜고, nmon 시작 명령어를 치고, jmeter로 요청을 만들어 보내는 4가지 절차를 매번 하기 번거로웠다. 하루에도 몇번씩 새로운 모듈도 크래시가 발생하는지 테스트 요청이 오는데 다른 일과 병행하여 테스트를 수행하다보니 절차를 단순화하고 싶어졌다.

해결책: 쉘 스크립트 코드

크래시 이슈의 원인은 모듈의 메모리가 일부 해제되지 않기 때문이었다. 모듈을 실행할 때마다 메모리가 해제되지 않고 쌓이다가 용량이 다 차서 크래시가 발생하는 것이었다.
따라서 동시에 여러 요청을 보내는 것보다 일정 시간 동안 반복적으로 요청을 보내는 것이 더 중요했다. 굳이 jmeter를 쓰기보다는 쉘스크립트 코드를 작성해서 휴먼 에러를 줄이는 것이 더 효율적이겠다는 생각이 들었다.

아래의 쉘 스크립트 코드를 사용하여

  1. 모듈 옮기기
  2. 톰캣 시작
  3. nmon 시작
  4. 특정 시간 동안 http 요청 보내기
  5. 톰캣 종료
  6. nmon 종료

6가지 절차를 쉘 스크립트 코드 하나로 끝내도록 했다.

# 모듈 옮기기
mv -i [테스트 폴더의 새 모듈] [모듈을 옮겨야 할 폴더] 

# 톰캣 시작 : source [테스트할 인스턴스 경로]/bin/startup.sh
source /home/instance2/bin/startup.sh

# 몇 분 동안 테스트할 것인지 저장하는 변수
min=3

# 실행 시간 (초 단위)
duration=60*$min

# nmon 시작, 1초에 한번씩 min분 동안 기록하며, 지정된 경로에 기록한 nmon 파일을 생성한다.
nmon -f -s 1 -c $duration -m [nmon 저장할 파일]

# 현재 시간을 기준으로 종료 시간 계산
end_time=$((SECONDS + duration))

# 종료 시간이 될 때까지 계속 while문 실행
while [ $SECONDS -lt $end_time ]; do
    
    # 시간 간격 추가: 톰캣이 시작하기 전 요청이 보내져서 response fail이 떴음
    sleep 1 

    # curl로 요청을 보내 제대로 실행되고 있는지 확인
    response=$(curl -s -o /dev/null -w "%{http_code}" -d [로컬로 http 요청]
    
    if [ "$response" -eq 200 ]; then
    	echo "response: $response"
    else
    	echo "Failed with HTTP status code: $response"
	break
    fi
	
    # 시간 간격 추가: 이미지처리 작업을 수행할 시간이 필요함, 요청을 처리하는 중에 너무 많은 요청이 오면 삭제되지 못한 중간 이미지들이 쌓이는 등 크래시 발생하기도 했음
    sleep 3

done

# 톰캣 종료 : source [테스트할 인스턴스 경로]/bin/shutdown.sh
source /home/instance2/bin/shutdown.sh

# nmon 프로세스 종료
kill $(ps | grep nmon | awk '{print $1}')

# 작업 완료 확인 문구
echo done
profile
스스로에게 질문을 던지고, 대답하는 블로그

0개의 댓글