서버 성능 테스트를 위해 k6 셋팅을 하고 테스트로 요청을 하는 도중에 아래와 같은 에러가 발생했다.
WARN[0000] Request Failed error="Get \"http://localhost:8080/test/ping\": read tcp 127.0.0.1:62761->127.0.0.1:8080: read: connection reset by peer"

K6 script
export const options = {
scenarios: {
spike: {
executor: 'constant-vus',
vus: 200,
duration: '1s',
},
}
};
export default function () {
let signupRes = http
.get(`${BASE_URL}/test/ping`)
check(signupRes,{
'ping status is 200': (r) => r.status === 200
});
sleep(1);
}
Spring controller
@GetMapping("/test/ping")
public String ping(){
return "pong";
}
요청받는 api는 pong을 리턴하는 아주 간단한 api이다.
해당 에러는 클라이언트에서 요청을 보냈는데 서버에서 연결이 닫힌 경우에 발생하는 에러이다. 이후엔 서버가 연결이 닫힌 이유를 찾아보았다.
1. Tomcat 쓰레드 이슈인가?
- application.yml
server:
tomcat:
threads:
max: 200
min-spare: 10
max-connections: 8192
accept-count: 200
connection-timeout: 60000 #
- Grafana application threads 대시보드

활성화 되어있는 쓰레드의 수는 200으로 되어있으며 max-connections : 8192, accept-count : 200으로 되어있다. max-connections이 8192 의미는 서버가 요청을 처리할 수 있는 connection의 수를 의미한다. 요청된 max-connecions 값보다 더 많은 요청이 오면 accept-count 값 만큼 받아두고 이후 요청은 거절을 하게된다. 테스트에서는 200의 요청을 동시에 보냈으며 쓰레드의 이슈는 아니라고 생각했다.
2. CPU 과부하

CPU 과부하는 아니다..
레퍼런스를 찾으려 구글링을 하다 stackoverflow에 질문을 찾았는데 나와 비슷한 질문이다.
Errors shown by k6 when reaching a bigger number of virtual users
I'm evaluating k6 for my load testing needs. I've set up a basic load test and I'm currently trying to interpret the error messages and result values I get. Maybe someone can help me interpret what...
stackoverflow.com
"해당 답변을 보면 테스트 러너의 cpu를 모두 소모하고 있으며 다른 요청이 불가능하다"라는 답변이 있어 요청을 보내는 k6에 문제임을 확인하기 위해 같은 조건으로 다른 툴을 이용하여 테스트를 했다.
JMeter와 Postman을 이용하여 요청을 보내면 문제없이 완료된다.
다음은 외부 변수를 제거한 테스트 환경을 만들기 위해 도커를 이용하기로 했다.

p(90) = 26.94s, p(95) = 26.94 및 200개의 request가 모두 성공했다.
그럼 로컬 환경에서 실행을 시키면 왜 문제가 발생할까?
반대로 application 서버를 docker 컨테이너에로 실행을 시키고 로컬 k6로 요청을 보냈는데 같은 에러가 발생하였다.
k6를 실행하는데 docker 환경과 local환경의 어떠한 차이 때문에 생기는 문제 같은데 정확하게 파악은 못했다.
이렇게 성능테스트를 위한 테스트가 끝났으며 이제 시나리오를 정해 테스트 예정이다.
GitHub - DonateDonate/api-performance-test: gather-here-api 서버 성능테스트를 위한 repository
gather-here-api 서버 성능테스트를 위한 repository. Contribute to DonateDonate/api-performance-test development by creating an account on GitHub.
github.com
'Programming > Back-end Language' 카테고리의 다른 글
여기로 모여라 회고-1 (0) | 2024.10.18 |
---|---|
Docker 환경에서 Nginx를 사용하여 letsencrypt SSL 설정 (1) | 2024.10.18 |
Apache Tomcat과 JAVA (0) | 2024.05.16 |
트랜잭션 (0) | 2024.04.19 |
[Spring] WebClient 란? (0) | 2022.08.29 |