티스토리 뷰

Tomcat 운영할 때 JAVA_OPT 설정을 조심해서 사용하자.

지금 프로젝트를 진행 중인 회사에서 Java Agent를 이용해서 APM을 만들고 있다. APM 운영을 위한 첫번째 검증 대상은 TOMCAT에서 구동되는 Web Application 을 기준으로 작업을 진행 중에 아주 이상한(?) 상황을 만나게 되어 문제의 원인을 찾아보다가 아주 황당한 이유를 알게되어 정리를 해 놓도록 한다.

테스트를 진행할 때 Eclipse에서라면 Servers의 Launch configuration 화면을 통해서 VM arguments에 Agent 정보를 제공하게 된다.

-javaagent:"Path to agent\msfl-study-bootstrap-0.0.1-SNAPSHOT.jar"

Shell 환경에서 처리를 한다면 TOMCAT 설치 경로의 bin 폴더에 존재하는 startup.bat/sh 또는 catalina.bat/sh 스크립트 화일에 지정하면 된다.

대부분은 JVM 옵션이므로 JAVA_OPTS 를 이용해서 설정해서 사용하게 된다. Eclipse에서 지정한 것도 역시 JAVA_OPTS 를 이용해서 연결된다.

문제 현상

우선 Agent는 아주 정상적으로 동작을 한다. 다만, Elipse에서 Servers 의 Tomcat 서버를 Shutdown 을 시키거나 아니면 Shell 환경에서 shutdown 을 시키면 Agent 가 운영하고 있는 Log file 상에 Shutdown 진행이 되고 있음에도 불구하고 Agent에서 생성했던 Profiler 인스턴스가 다시 생성되고, 바로 종료 (JVM Shutdown Hooking을 적용) 되는 정보가 찍힌 것을 확인하게 된다.

이 문제와 동일하게 생각할 수 있는 경우는 JAVA_OPTS 를 통해서 Port 정보 등을 설정하고 이를 사용하는 경우에 Shutdown 시점에 지정한 Port 가 이미 사용 중 (Port already in use...) 이라는 오류 정보를 받는 것을 생각해 볼 수 있다.

발생 상황 검증

Agent가 2번 (Start 시점, Shutdown 시점) 실행되는 경우는 생각하지도 못하고, Instance의 State 저장을 위해서 Serialize가 내부적으로 발생을 하는 것으로 의심을 했었고 이런 상황을 만들 수 있는 경우가 무엇인지 생각하면서 Agent의 검증 대상인 Application에서 사용되는 라이브러리들과 Agent에서 사용되는 라이브러리들의 버전 충돌을 회피하기 위해서 별도로 분리를 했던 Custom ClassLoader를 재 검증하기도 했다. 결과는 당연히 아무 이상 없음. ㅠㅠ

중간에 설마 Agent가 2번 실행되는거 아닐까? 라는 의심을 하고 Log 검증을 해 봤지만 이미 Shutdown 상태로 진입을 했기 때문에 정상적인 Log (주로 Console Log) 를 확인 할 수도 없었고, Eclipse 상에서 Debug 진행도 안되는 상황으로 단지 File Log 에 남겨진 일부 Log 정보만을 기준으로 볼 수 밖에는 없었기 때문에 더 황당한 상상을 하게 되었다.

이와 같은 현상이 발생하는 이유는 TOMCAT에 JVM 옵션을 전달할 때 Eclipse와 Shell 처리에서 JAVA_OPTS를 이용하기 때문으로 JAVA_OPTS 는 startup 이나 shutdown 될 때 모두 옵션으로 적용된다.

해결 방법

이런 문제를 피해가기 위해서는 설정할 옵션의 용도에 따라서 항시 적용이라면 JAVA_OPTS 를 이용하고 startup 때만 적용이라면 CATALINA_OPTS 를 이용하면 된다. catalina.bat 화일에 보면 :doStop 처리에서 CATALINA_OPTS 정보를 Clear 하고 명령을 처리하는 것을 볼 수 있다.


다시 한번 정리하면 다음과 같다.

  • 항상 적용하는 JVM 옵션은 JAVA_OPTS 를 이용한다.
  • START에만 적용할 JVM 옵션은 CATALINA_OPTS 를 이용한다.

원래 알고 있었다면 문제가 발생하지 않겠지만 모르는 상황이라면 나타나는 증상이 아주 황당하고 이를 이해하고 해결하는데 많은 시간이 소비된다. 유사한 증상에 고민 중이라면 조금의 도움이라도 될 수 있기를...


Written by MSFL. (Morris)

댓글
댓글쓰기 폼