본문 바로가기

개발일지/TIL

(89)
[230826] 입찰 API 병목 현상 로직 점검 입찰 API 로직 점검 💬 입찰 API에서 생기는 병목 현상을 해결하기 위해 로직을 확인했습니다. 로직의 중요 부분의 수행 시간을 측정하고 로그를 찍어서 확인했습니다. ✔ 로직 수행 시간 측정 로그 💬 Slf4j를 사용해서 로그를 출력했습니다. 하지만 화면에 출력된 로그는 DEBUG, ERROR, INFO 등 모두 찍혔습니다. 수행 시간만 별도로 확인을 하기 위해 INFO로 설정해 출력했으며, logback을 사용해 별도의 파일에 저장을 했습니다. 1. Dependency 추가 implementation ( 'ch.qos.logback:logback-classic:1.4.11', 'ch.qos.logback:logback-core:1.4.11', ) 2. logback.xml 작성 INFO ACCEPT ..
[230825] 입찰 테스트 중 겪은 Jmeter 한계 Scale-Up으로 인한 성능 테스트 💬 AWS EC2 Instance를 t2.micro에서 c5.large로 업그레이드한 후에 입찰 성능 향상이 얼마나 되었는지 확인을 해야 했습니다. 병목 현상이 어느 정도 완화가 되었는지 확인하기 위해서였습니다. ✔ Jmeter 문제 💢 Scale-Up 하기 전에 문제가 되었던 SSE 400명 연결, 1분당 입찰 3000건 테스트는 Scale-Up 이후로 정상적으로 처리가 되는 것으로 확인이 되었습니다. 이후 해당 서버가 감당할 수 있는 요청에 대해서 알아보기 위해 SSE 연결 수와 1분당 입찰 건수를 증가시킬 때 Jmeter에서 에러가 발생했습니다. ✔ 해결 방법 💬 문제는 Jmeter에 할당된 메모리(기본 3G)가 부족했기 때문입니다. 메모리가 부족했을 때 해결 ..
[230824] 성능 향상을 위한 EC2 Instance Scale-Up 성능 향상을 위한 EC2 Scale-Up 💬 전체 조회에서 QueryDSL, DB Index 적용 등을 하고 나서도 원하는 성능(TPS 500건)이 나오지 않는다고 했습니다. 입찰 기능에서도 HikariCP 병목 현상으로 문제를 겪고 있었습니다. 이 두 가지를 모두 개선할 수 있는 방법으로 Scale-Up이 있었기에 적용을 해보기로 했습니다. 현재 사용하고 있는 EC2 Instance t2.micro(cpu 1 core, memory 1G)가 사양이 너무 낮은 것도 한 몫했습니다. ✔ 기준 💬 Scale-Up 할 EC2 Instance을 선정하기 위해서 기준이 필요했습니다. ➡ 프로젝트에 가용할 수 있는 금액이 총 28만원 이었기에 Redis, RDS 등에 드는 비용을 제외하고 약 16만원(2/3) 책정..
[230823] 입찰 테스트 시 HikariCP Timeout 문제 입찰 테스트 💬 SSE를 연결하고 정상적으로 데이터가 전송이 되는지 확인하기 위해서 입찰 API를 호출했습니다. SSE 위한 연결을 하고 입찰 API를 1분 단위로 건수를 늘려가며 테스트를 진행했습니다. ✔ 문제 💢 t2.micro 환경에서 SSE 400명 연결, 1분에 입찰 3000건을 테스트를 할 때 Connection Timeout 문제가 발생했습니다. ✔ 원인 💬 Connection Timeout에 원인을 찾다 보니 HikariCP에 할당된 Connection이 전부 연결이 되어있고 Lock으로 인해 병목 현상이 발생해 대기하고 있던 Thread들이 기본 Timeout(30초)을 초과해서 발생한다는 것을 알게 되었습니다. ➡ Transaction이 실행될 때, Connection Pool에선 들어..
[230822] Jmeter에서 SSE 에러 실패로 표시하기 Jmeter에서 SSE 에러 실패로 표시하기 💬 Jmeter에서 서버에서 보내는 에러가 받아지는 것을 확인했습니다. 이제는 그 에러를 가지고 메시지를 출력해주려고 합니다. 결과를 실패로 변경해야 합니다. ✔ 첫 번째 시도 💬 JSR223 Sampler에 작성한 스크립트에서 발생하는 에러를 JSR233 Assertion에서 받아서 실패로 처리해주려고 했습니다. 두 작업 간에 데이터를 공유시켜 줄 수 있는 내장 변수 객체 vars를 사용하기로 했습니다. 💢 공유할 데이터가 vars에 업데이트가 되지 않았습니다. 원인은 EventHandler 클래스 같은 외부 라이브러리에서 Jmeter 내장 객체 vars를 사용할 수 없기 때문이었습니다. ✔ 두 번째 시도 💬 vars를 사용할 수 없다면 그것을 대체할 수 있..
[230821] 서버에서 클라이언트로 SSE 예외 전달하기 서버에서 클라이언트로 SSE 예외 전달하기 💬 Jmeter에서 데이터가 수신이 되는 것까지 확인되었습니다. 이후 테스트에서 실패 케이스를 잡아내야 하기 때문에 에러까지 수신이 되는지 확인해야 했습니다. ✔ 서버에서 예외를 던졌을 경우 문제 💢 서버에서 SSE 연결이 끊어져 Throw를 던질 경우 프로젝트에서 클라이언트로 데이터를 전송하는 For문에서 벗어나게 됩니다. 이것 때문에 받아야 할 다른 클라이언트는 데이터를 전송받지 못하는 문제가 발생했습니다. 이것을 Jmeter로 여러 번의 요청을 테스트하다가 발견했습니다. for(CustomSseEmitter sendEmitter : sendEmitters) { try { sendEmitter.sseEmitter() .send(SseEmitter.event(..
[230819] Jmeter SSE 테스트 데이터 전송 받지 못하는 문제 테스트 시 SSE 데이터 전송받지 못하는 문제 💬 Jmeter에서 SSE 테스트 스크립트가 정상적으로 데이터를 받지 못하는 문제가 발생했습니다. 테스트를 진행하기 위해 이 문제를 해결해야 했습니다. ✔ 원인 분석 💬 원인을 알아보기 위해 연결, 종료, 데이터를 전송받을 때 메시지를 출력해 봤습니다. 어느 지점에서 문제가 일어나는지 확인하기 위해서였습니다. ➡ 연결이 정상적으로 이루어지는 메시지 출력 ( O ) ➡ 연결 완료되었을 때 전송되는 메시지 출력 ( O ) ➡ 연결이 종료되었을 때 전송되는 메시지 출력 ( O ) 💬 모든 메시지가 정상적으로 출력이 되는 것을 확인했습니다. 그런데 이걸 확인하는 과정에서 이상한 패턴이 확인할 수 있었습니다. 연결, 연결 메시지, 종료 이 과정에 4~5초 안에 이루어..
[230818] Jmeter SSE 테스트 Jmeter SSE 테스트 💬 서비스에서 가장 핵심이 되는 경매 입찰 기능이 SSE로 구현되어 있습니다. Jmeter에서 SSE 테스트 환경을 구성을 해야 합니다. ✔ 스크립트 작성 💬 Jmeter에서 SSE 테스트 환경을 구성하기 위해서는 JSR223 Sampler에 Groovy 언어로 스크립트를 작성을 해야 합니다. 스크립트에 EventSource 라이브러리를 사용해 SSE 테스트 기능을 작성했습니다. import com.launchdarkly.eventsource.EventSource import com.launchdarkly.eventsource.EventHandler import com.launchdarkly.eventsource.MessageEvent import java.net.URI imp..