부록 F. Linux 컨테이너에서 실행되도록 JVM 튜닝

JVM ergonomics 가 가비지 수집기, 힙 크기 및 런타임 컴파일러에 대한 기본값을 설정할 수 있는 경우 Linux 컨테이너 내에서 실행되는 Java 프로세스는 예상대로 작동하지 않습니다. 튜닝 매개변수를 조정하지 않고 Java 애플리케이션을 실행하는 경우, java -jar mypplication-fat.jar Cryostat- Cryostat- everything JVM은 컨테이너 제한이 아닌 호스트 제한에 따라 여러 매개변수를 자동으로 설정합니다.

이 섹션에서는 Linux 컨테이너 내에서 Java 애플리케이션 패키징에 대한 정보를 제공하여 기본값을 계산하기 위해 컨테이너의 제한을 고려합니다.

F.1. JVM 튜닝

현재 생성된 Java JVM은 컨테이너를 인식하지 않으므로 컨테이너 크기가 아니라 물리적 호스트의 크기에 따라 리소스를 할당합니다. 예를 들어 JVM은 일반적으로 최대 힙 크기를 호스트의 실제 메모리의 1/4로 설정합니다. 대규모 호스트 시스템에서 이 값은 컨테이너에 정의된 메모리 제한을 쉽게 초과할 수 있으며 런타임에 컨테이너 제한을 초과하면 OpenShift에서 애플리케이션을 종료합니다.

이 문제를 해결하려면 Java JVM이 제한된 컨테이너 내에서 실행되고 수동으로 수행하지 않는 경우 최대 힙 크기를 자동으로 조정할 수 있는 OpenShift 기본 이미지에서 Fuse를 사용할 수 있습니다. 애플리케이션을 실행하는 JVM에서 최대 메모리 제한과 코어 제한을 설정하는 솔루션을 제공합니다. OpenShift 이미지의 Fuse의 경우 다음을 수행할 수 있습니다.

  • 컨테이너 코어를 기반으로 CICompilerCount 설정
  • 컨테이너 메모리 제한이 300MB 미만인 경우 C2#159 컴파일러 비활성화
  • 300MB 미만의 경우 기본 힙 크기에 대해 컨테이너 메모리 제한의 1/4을 사용합니다.