티스토리 뷰
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)
'개발 > 자바' 카테고리의 다른 글
Divide by Zero === Exception?? Really?? (0) | 2017.03.28 |
---|---|
[Maven] Multi-Module Project에서 Java Compiler 설정하기 (0) | 2016.12.18 |
[TOMCAT] 수동으로 배포해 보기 (0) | 2016.11.22 |
- Total
- Today
- Yesterday
- Kubernetes
- macos
- CentOS 8
- GIT
- ssh
- kudo-cli
- SolrCloud
- Replica
- opencensus
- Galera Cluster
- Cluster
- Kudo
- Packages
- KUBECTL
- 쿠버네티스
- leader
- custom resource
- terrminating
- k8s
- galera
- provisioner
- docker
- operator framework
- NFS
- dynamic nfs client provisioner
- collection
- operator
- zookeeper
- CentOS
- Node
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | 31 |