로그 유무에 따른 성능 측정
on 조잘조잘
JMeter
JMeter 는 성능 측정을 위해 사용하는 오픈소스이다. 오픈소스 중에서는 항상 TOP7에 랭크될 정도로 많이 사용한다. 순수 자바 어플리케이션이며 정적, 동적, 웹 동적 어플리케이션 테스팅 모두 가능하다. Apache JMeter 공식 문서 에 따르면,
- Web - HTTP, HTTPS (Java, NodeJS, PHP, ASP.NET, …)
- SOAP / REST Webservices
- FTP
- Database via JDBC
- LDAP
- Message-oriented middleware (MOM) via JMS
- Mail - SMTP(S), POP3(S) and IMAP(S)
- Native commands or shell scripts
- TCP
- Java Objects
위와 같이 다양한 어플리케이션, 서버, 프로토콜에서 사용할 수 있다.
대규모 테스트에는 좀 불리하다고 한다🤔 그래도 여러 플러그인을 지원한다는 장점도 있다.
JMeter 설치
아래 설치 방법은 Mac OS 기준이다.
$ brew install jmeter
JMeter 실행
$ open /opt/homebrew/Cellar/jmeter/5.4.1/bin/jmeter
# 찾아보면 보통 아래처럼 하라는데 나는 brew 위치가 달라서 알아서 찾아서 했다.
$ open /usr/local/bin/jmeter
plugin 설치
Options → Plugin Manager
Available Plugin 탭에서
- 3 Basic Graphs
- Custom Thread Groups
두 개를 설치한다.
ThreadGroup 생성 및 측정
여러 개의 스레드 그룹을 만들어서 실행해 볼 수 있다. JMeter 의 실행 단위가 이 스레드 그룹이다.
하나의 스레드 그룹에 여러 개의 HTTP Request 를 만들 수 있지만, 나는 같은 요청을 여러 형태로 보존하고 싶었기 때문에 따로 만들었다.
결과를 여러 형태의 리스너로 볼 수 있다.
나는 그 중에서 요청을 하나씩 볼 수 있는 View Results Tree
와 TPS 등을 요약해서 보여주는 Summary Report
, 같은 정보를 그래프로 표현하는 Graph Results
세 개만 볼 것이다.
Thread Group
은 아래와 같이 스레드 수만 변경한다.
Numbers of Threads (users)
가 말 그대로 스레드 수, 요청하는 사용자의 수를 나타낸다. 아래는 어느정도 시간 간격으로 할거냐, 반복할거냐 이런건데 옵션을 바꿔가며 주면 좋을 것 같다.
그리고 HTTP Request 에 다음과 같이 요청 보낼 곳 정보를 입력한다.
지금은 단순 조회 테스트라 내용이 많지 않은데, POST 요청 등에서 body 값을 넣어주면 된다.
그리고 Start 를 누르면 끝~!🕺
성능 측정
성능 측정 대상
우리 어플리케이션은 크게 두 가지 로그를 출력한다.
- Logback 을 사용한 로그
- P6spy 를 사용한 SQL 쿼리 로그
Logback 을 사용한 로그의 경우, 개발 서버는 INFO
레벨, 운영 서버는 WARN
레벨로 출력하고 있다. 여기에 더해 LogAOP
라는 별도 설정을 통해 다양한 형태의 로그 포맷을 만들었다.
500
대 에러의 경우 StackTrace를 출력한다.- 컨트롤러단부터 모든 레이어의 모든 메서드에 대한 로그를 출력한다. 이 로그란 파라미터, 메서드가 수행되는 시그니처(클래스와 메서드명), 반환값을 말한다.
- 어노테이션을 사용해 특정 메서드 수행에 소요되는 시간을 출력할 수 있다.
그리고 Logback 설정 파일에서는 시간, 스레드 등을 표시하며 HTTP Request&Response 설정도 별도로 해 둔 상태이다.
LogAOP X
, P6spy O
(개발 서버)
LogAOP X
, P6spy O
LogAOP O
, P6spy X
LogAOP X
, P6spy X
(운영 서버)
결론
콘솔 출력이 꽤 많은 시간을 잡아먹는다는 것을 알게 되었다. 성능 향상을 위해 운영 버전에는 에러 출력 이외의 모든 로그를 제외했다.