Dev/Web

[Tomcat] catalina.sh 와 setenv.sh

창문닦이 2020. 2. 14. 22:22

스프링으로 외부 속성파일의 값을 @value 어노테이션으로 스프링 빈에 주입할 수 있다. 그런데 아무리 뒤져봐도 프로퍼티 파일에 관련된 내용이 없어 도대체 이 값이 어디서 가져오는 건지 찾아봤다. 알고보니 setenv.sh를 통해 설정한 값이었다. 톰캣 환경 설정에 대한 개념이 없어 정리한다. 

catalina.sh

톰캣의 catalina.sh 파일에는 다양한 설정이 존재한다. catalina.sh 파일에는 자바 옵션 설정 및 톰캣 로그 경로등 각종 설정을 저장할 수 있다. 이 때문에 설정 변경시 실수가 발생할 가능성이 높다.(유지보수에 큰 어려움 발생!). 만약 톰캣 버전이 업그레이드 되거나 서버 이전이 되는 경우 설정된 옵션을 반영하기 위해 조심히 추출해야한다. 그래서 추가 옵션을 설정하는 또다른 방법으로, 톰캣이 설치된 bin 디렉토리 하위의 setenv.sh 파일을 생성하고 추가 커스텀 옵션을 설정할 수 있다.

  • CATALINA_OPTS : start, run, debug 명령어 구동 시 사용되는 자바 런타입 옵션에 해당한다. 톰캣 자체에서만 사용되는 옵션들만 포함되며 중지 프로세스, 버전 명령 등으로는 사용해서는 안된다.
  • JAVA_OPTS : 명령이 실행될 때 사용되는 자바 런타임 옵션이다. 톰캣에 의해서 사용가능하고 중지 프로세스, 버전 명령에도 사용된다.

setenv.sh

setenv.sh tomcat 구동시 실행 환경 설정 파일이다. JAVA_OPTS  환경 설정이 가능하다. 멀티라인으로 작성할 경우 역슬래시를 통해 작성할 수 있다. 이 파일은 기본으로 제공되는 파일이 아니다. 직접 쉘 파일을 생성 및 작성해야한다. 

export JAVA_OPTS="-Dspring.profiles.active=local \
    -server \
    -Xms2G \
    -Xmx2G "
  • Dspring.profiles.active : 스프링에서 로컬 머신, 개발 테스트 서버, 상용 서버를 분리해서 속성을 설정하고 싶을 때 사용한다. local, dev 등
  • server : Server HotSpot JVM을 사용하는 옵션입니다. Server HotSpot JVM은 Desktop용 Appkication을 구동하는데 유리하고, 최적화(Optimization)에 필요한 모든 과정을 최대한으로 수행합니다. Application의 시작시간은 느리지만, 일정 시간이 흐르면 Client HotSpot JVM에 비해 훨씬 뛰어난 성능을 보장합니다. (Jdk 1.5부터는 Server-Class머신인 경우에는 -server 옵션이 기본값이며, Server-Class머신이란 2장 이상의 CPU와 2G이상의 메모리를 갖춘 머신을 의미합니다.)

startup.sh 호출 -> catalina.sh 호출 -> setenv.sh 파일이 존재하는 경우 설정을 반영한다. documentation 들어가보면 다 나온다. 보는 습관을 들이자. 

http://tomcat.apache.org/tomcat-8.5-doc/architecture/startup/serverStartup.txt

JVM  옵션 정보 

  • -Xms<Size> : 최소 Java Heap size. 최초 JVM이 로드될 때 부여되는 메모리이다(start size).
  • -Xmx<Size> : 최대 Java Heap size. 최대 JVM이 가질 수 있는 메모리이다(maximum size). 
    • Sun HotSpt JVM 계열에서는 최초 크기와 최대 크기를 동일하게 부여하는 것을 권장한다. 동적으로 크기가 변동되는 것으로 인한 오버 헤드를 최소화 하기 위해서 이다.
  • -XX:NewSize=<Value> : Young Generation의 최소 size(시작 크기)
  • -XX:MaxNewSize=<Value> : Young Generation의 최대 size
    • Young Generation의 크기는  NewSize와 MaxNewSize 옵션에 의해 결정된다.
  • -XX:PermSize=<Size> : Permanent Generation의 최소 size(시작 크기)
  • -XX:MaxPermSize=<Size> : Permanent Generation의 최대 size
    • Permanent Generation의 크기는 PermSize와 MaxPermSize 옵션에 의해 결정된다.
    • 클래스 수가 많은 어플리케이션이라면 MaxPermSize를 크게 두어야 한다. 만약 Permanent Generation이 작아서 전체 클래스를 모두 로딩하지 못하면 Out of Memory Error가 발생한다.
  • -XX:NewRatio=<Value> : Young Generation와 Old Generation의 영역비율
    • 2로 설정할 경우 Young:Old = 1 : 2 가 된다. 전체 힙 중 Young Generation의 크기는 33%가 된다.
  • -XX:SurvivorRatio=<Value> : Survivor Space와 Eden Space의 영역비율
    • 서바이버 영역은 1, 2 총 두 개가 존재한다. 이 값을 6으로 설정하면 s1 : s2 : eden = 1 : 1 : 6 이라는 의미이다.
    • Survivor의 영역이 크면 Tenured Generation으로 옮겨가기 전 중간 버퍼의 영역이 커진다. Full GC의 빈도를 줄이는 역할을 할 수 있다. 반면 Eden Space 크기가 줄어들어 Minor GC가 자주 발생한다.

 


Reference 

톰캣 setenv.sh 옵션 설정 https://lucaskim.tistory.com/37

tomcat 구동 시 setenv.sh로 실행환경 설정하기 http://lionks80.blogspot.com/2015/01/tomcat-setenvsh.html

자바 애플리케이션 성능 튜닝의 도(道) https://d2.naver.com/helloworld/184615

tomcat - 성능 튜닝 및 JVM 옵션 https://linuxism.ustd.ip.or.kr/236 

tomcat 메모리 설정 출처: https://mycup.tistory.com/215 [한글창제의 기쁨]

'Dev > Web' 카테고리의 다른 글

HTML 기초  (0) 2019.02.13
웹 서버 (tomcat 설치), 웹 프로젝트 생성  (0) 2019.02.11
웹 프로그래밍 기초  (0) 2019.02.11