JMeter 설치

https://jmeter.apache.org/download_jmeter.cgi

현재 버전, Apache JMeter 5.3 (Requires Java 8+) 을 다운받았습니다.

Apache Jmeter 실행

압축을 풀고 bin 폴더의 jmeter.bat 을 클릭하여 실행합니다.
기본적인 테스트를 위해 플러그인을 2개 설치합니다.

jmeter-plugins-manager-1.4.jar 와 jmeter-plugins-graphs-basic-2.0.jar

이 두개입니다.

플러그인 추가

https://jmeter-plugins.org/wiki/PluginsManager/

외의 플러그인을 다운받으면 현재 1.4 버전의 파일을 다운받을 수 있습니다.

jmeter-plugins-manager-1.4.jar

위의 페이지에서 설명하는데로, lib/ext 경로에 파일을 넣고 실행하면

Option > Plugins Manager 를 클릭하면, Installed Plugins 을 할 수 있으며, 거기서 3 Basic Graphs를 클릭합니다.

1차 테스트 시해 예상하지 못했던 2가지 에러가 발생했습니다.
하나는 시간이 지난 후에 갑작스럽게 발생하는,

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is java.util.ConcurrentModificationException

에러와,

500 Internal Server Error: [{"timestamp":"2020-11-10T09:03:50.900+0000","status":500,"error":"Internal Server Error","message":"Request processing failed; nested exception is org.springframework.core.task.TaskRejectedException: ... (440 bytes)]

500 에러 2가지가 부하 테스트를 진행하면서 발생했습니다.

  1. TCP_FIN_TIMEOUT 변경설정
cat /proc/sys/net/ipv4/tcp_fin_timeout

default 60 에서 8로 변경. 통신완료 후, 대기했다가 커넥션을 끊는 시간으로 알고 있는데, 해당 커넥션을 굳이 길게 잡을 필요 없어 보여 과감하게 낮췄습니다.
(실제 제가 운영하는 다른 서비스는 3초로 설정한 서비스도 존재합니다!

  1. IP_LOCAL_PORT_RANGE
    cat /proc/sys/net/ipv4/ip_local_port_range
    

    default 값이 32768 ~ 60999 로 되어있었는데요. 해당 내부 증가되는 포트 수를 15000 ~ 65000 정도로 늘렸습니다. 내부 소켓 통신이 빈번하게 늘어남에 따라 발생하는 이슈로,
    내부 증가포트를 늘려보았는데요.

위 2가지 수행시,

2차 테스트 진행시, 에러는 확연히 줄어들었지만,

500 Internal Server Error: [{"timestamp":"2020-11-10T09:03:50.900+0000","status":500,"error":"Internal Server Error","message":"Request processing failed; nested exception is org.springframework.core.task.TaskRejectedException: ... (440 bytes)]

는 여전히 발생하고 있었습니다. 원인 분석을 위해 소스를 분석해보니, 의미없는 소스 라인에 Aync 가 걸려있는 것을 확인하였고,
담당자에게 문의시, 해당 서비스에 굳이 Aync를 걸 필요없다는 답변을 받아, 해당 기능을 제거했습니다.

추후 서비스에 비동기 기능들이 필요한 곳에 구현되어있는 부분이 있는데, 서비스가 늘어남에 따라 해당 부분은 같이 고민해보기로 했습니다.

3차 테스트 진행시 1초당 10000건의 유입에서 fail이 발생하지 않는 것을 확인하였고,
실제 유입 수 5만건, ngnix 처리 건 5만건, 통계 데이터 4만 9천998건으로 2건의 유실로 최종 결론나, 서비스 안정화에 성공했다고 클로즈했습니다.

팀별 개발 시, 혹은 레거시와 리팩토링 작업시 양쪽에 데이터를 확인하여, 리팩토링시 장점이 명확한지를 확인하기에는 꼭 jmatter 등의 스트레스 테스트 등이 꼭 필요하다고 생각됩니다.