본문 바로가기

Apache / Tomcat

[Tomcat] OutOfMemory시 톰캣 자동 재시작

반응형

운영중인 톰캣이 OutOfMemory를 뱉어내고 작동을 안하는 경우가 있다. 


관제 시스템이 잘 갖춰진 운영 환경이라면, 담당자에게 바로 알림이 가고 특정 시간내에 처리가 가능하겠지만,

그렇지 않은경우에는 의도치 않게 장애가 길어지게 된다.


OutOfMemory가 발생된 후 톰캣이 실행중인데 작동 불능에 빠졌을경우 누군가 조치를 취해주지 않거나 톰캣 상태를 모니터링해주는 자동화된 도구가 없다면 어떻게 해야할까?


이럴때는 JVM 옵션을 이용하여 후속 조치가 가능하다.


OnOutOfMemoryError 옵션을 이용할 경우 OutOfMemroy 발생 이후에 특정 동작을 지정할 수 있다.


톰캣 catalina.sh 파일의 CATALINA_OPTS 옵션에 "-XX:+HeapDumpOnOutOfMemoryError -XX:OnOutOfMemoryError"을 이용하면 된다.



예1 : OOM 발생시 톰캣을 재시작하는 쉘 스크립트를 실행

CATALINA_OPTS="-Djava.awt.headless=true -server -Xms256m -Xmx1024m -XX:MaxPermSize=128m -XX:+HeapDumpOnOutOfMemoryError -XX:OnOutOfMemoryError=/home/test/tomcatRestart.sh"



예2 : OOM 발생시 해당 톰캣을 강제로 중지.

CATALINA_OPTS="-Djava.awt.headless=true -server -Xms256m -Xmx1024m -XX:MaxPermSize=128m -XX:+HeapDumpOnOutOfMemoryError -XX:OnOutOfMemoryError=kill -9 %p"





* 톰캣 재시작 스크립트(tomcatRestart.sh)
#!/bin/sh

export JAVA_HOME=/usr/local/java
export PATH="$PATH:$JAVA_HOME/bin"
export CATALINA_HOME=/usr/local/tomcat7


# 톰캣 재시작
/usr/local/tomcat7/bin/shutdown.sh

sleep 10

/usr/local/tomcat7/bin/startup.sh


shutdown.sh를 실행시킬때에는 간혹가다 톰캣이 중지가 안되는경우가 있으므로  shutdown.sh에 force 옵션등을 추가하여 강제로 중지 시킬수 있도록 처리 하는게 좋다.