-
Notifications
You must be signed in to change notification settings - Fork 0
부하 테스트 일대
Web UI를 통해 스크립트와 테스트를 간편히 작성하고 실행할 수 있고, 테스트 문법으로 groovy (JUnit과 비슷)를 제공해주는 장점을 바탕으로 Ngrinder를 활용해 부하 테스트를 해보고자 하였다.
(TMI. 네이버의 오픈 소스라서 한국말도 지원해줌 bb)
컨트롤러 → 테스트가 돌아가게끔 만드는 서버
에이전트 → 부하를 발생시키는 주체
(사실 컨트롤러와 에이전트는 다른 서버에 두는 것이 정확한 성능 측정에 good)
참고한 페이지들
https://velog.io/@jhyun223/ubuntu-20.04-docker-%EC%84%A4%EC%B9%98%ED%95%98%EA%B8%B0-64o0sc5w
(ubuntu 20.04 환경에서 도커 설치)
https://velog.io/@flaehdan/nGrinder-%EC%9E%90%EB%8F%99%ED%99%94
(나중에 보면 좋을 ngrinder 자동화)
https://peachytree.tistory.com/31
(docker 버전 낮추는 명령어)
https://imjeongwoo.tistory.com/111
(도커 옵션들)
controller, agent 실행에 사용한 명령어들
(원래 agent는 직접 사이트에서 파일을 다운받아서 쓰라고 하던데, 이렇게 pull 해와도 잘 돌아간다!)
$ docker pull ngrinder/controller:3.5.5
$ docker run -d -v ~/ngrinder-controller:/opt/ngrinder-controller --name controller5
-p 80:80 -p 16001:16001 -p 12000-12009:12000-12009 ngrinder/controller:3.5.5
$ docker pull ngrinder/agent:3.5.5
$ docker run -d --name agent6 --link controller5:controller ngrinder/agent:3.5.5
-
테스트 자체가 돌아가지 않던 에러
버전을 가장 최신 버전 3.5.8로 해두고 있었는데, 찾아보니 안정성 문제가 꽤 있다고 하여 버전을 3.5.5로 낮추었다.
-
ERROR java.util.concurrent.ExecutionException: javax.net.ssl.SSLException: Received fatal alert: handshake_failure
에러java.lang.System.setProperty("https.protocols", "TLSv1.2") (뺀 거) import org.ngrinder.http.HTTPRequest (넣은 거 / 구 버전일 때 문제 없이 잘 돌아간다는 글을 읽었다) import net.grinder.plugin.http.HTTPRequest (또 도전해본거) System.setProperty("https.protocols", "TLSv1.1,TLSv1.2,TLSv1.3"); grep -r 'tls'로 적힐 만한 곳을 찾았으나 fail...
ngrinder-user-kr - SSLHandshakeException오류에 대해 질문드립니다.
버전이 1.3이라 그런가???
-
(문제는 아니지만) 파일 업로드 테스트 할 때 파일 어떻게 업로드 하지?
테스트 스크립트와 동일한 위치에 resources 디렉토리 생성해서 파일 업로드 해주면 됨!!
일단은 임시 방편으로 우리 서버 주소를 http
로 바꿔서 요청 넣었다.
(어차피 https로 redirect 하게끔 cloudflare에서 설정해줘서…)
저 https의 tls 1.3 버전을 테스트 서버에서 맞출 방도를 아직 못찾겠다 🥲
- TPS (Test Per Seconds) = 초당 테스트가 몇 번 일어났는지
이게 테스트는 성공으로 나왔는데 http
로 요청을 넣어도 cloudflare 자체에서 https
로 redirect 된다. 근데 문제는 우리 서버의 포트가 3000으로 되어 있어 포트를 옮겨야 하는데, 이 과정에서 응답 코드가 301(Moved Permanently)로 뜨면서 테스트 자체는 해보지도 못하고 종료되는 것 같다. 그래서 본 서버 IP 주소로 테스트를 해보고자 하는데 … 테스트가 안돌아간다. 본 서버의 ACG 설정이 아무래도 덜 되어있어서 그런 것 같다(고 추측을 해본다). 근데 아니었고…
(혹시나해서 java와 agent를 다운 받았는데도 잘 안돌아간다.. ㅠㅜㅠㅜ)
우리는 한 서버에서 controller와 agent를 사용하기 때문에 서버 자체에서 지연이 발생해 나타난 테스트 결과보다 실제 성능이 아주 조금(?) 더 좋을 것이다.
nGrinder에 지친 심신을 위해, 간단한 부하 테스트 툴을 찾고 있던 중에 k6를 발견했다!
테스트 코드가 js로 작성되어 있어 ts와 js에 절여진 우리에게 좋았고, 이전에 고민했던 JMeter보다 스크립트가 5배 이상 짧다고 한다. 또한 k6는 Go언어로 작성되어 있는데, Java보다 더 적은 메모리와 CPU를 사용하므로 리소스 사용 면에서도 유리하다.
(참고 링크: https://velog.io/@hooni_/K6-성능-테스트#작성해야하는-스크립트-형식
다만, nGrinder는 웹 UI라서 테스트 코드나 리소스, 결과를 한눈에 보고 작성하고 관리하는 것이 편했는데 k6는 gui가 제공되지 않아 결과를 직접 확인해야 한다는 점은 아쉬웠다. 하지만 부하 테스트를 실시하는 과정이 매우매우매우 수월하기 때문에 모든 단점을 감당할 만 하다 !!
⇒ 시각적으로 확인하려면 Grafana를 연동하면 된다!
window 로컬에 설치하는 방법도 있다고는 하던데, 우리 서버 안에서 직접 테스트 해보고 싶어서 위 링크의 ‘ubuntu 환경 설치 명령어’를 따라 작성했다.
그리고 서버에 script.js
파일을 넣고 로컬에서 작성한 테스트 코드 파일을 넣어서 돌려봤다.
(우리 서버 IP 빼고는 일단 기본적인 코드를 참고하였다)
import http from 'k6/http';
import { sleep } from 'k6';
export const options = {
stages: [
{ duration: '30s', target: 10 }, //rampup
{ duration: '1m', target: 10 }, //load
{ duration: '30s', target: 0 }, //rampbackdown
],
};
export default function () {
let res = http.get('http://서버IP:3000/musics/genres');
sleep(0.5);
}
-
stages
- 테스트 부하가 주입되는 단계 설정
- 테스트는 보통 RampUp → Load → RampBackDown의 순서로 수행
k6 run script.js
명령어를 작성하여 결과를 확인하였다.
(—out
옵션을 사용하면 결과 내용을 어떤 파일?에 옮겨준다고 하여 json
파일에 담아봤는데, 가독성이 별로라 아래 결과를 그냥 확인하기로 했다.)
** 파일 전송은 scp C:윈도우/파일/경로 우분투계정@ip 주소: /home/우분투계정
를 통해!
- 프로젝트 생성
- 프로젝트 구조
- PR에 대한 단위 테스트 자동화
- 역/직렬화 라이브러리 비교
- Github Release 자동화
- Firebase App 배포 자동화
- 플러그인을 이용하여 공통 설정 없애기
- Timber 라이브러리를 사용한 이유
- 네트워크 예외 처리
- Kotest 도입기