Kubernetes 및 JVM 메모리 설정
Kubernetes 및 JVM 메모리 설정
수많은 마이크로서비스가 있는 클러스터에서 그 중 하나는 데이터 처리 애플리케이션을 실행하는 (JVM) 전용으로 사용된다.
최근까지 해당 JVM 포드에서 실행되는 작업은 1GB 미만의 RAM을 사용했기 때문에 JVM에 대한 명시적인 힙 크기 설정 없이 4GB의 최대 메모리를 사용하여 포드를 설정했습니다.
현재 일부 새로운 데이터는 JVM을 포함하여 전체 포드에 약 2.5GB가 필요하지만(명령어에 의해 보고된 바와 같이, 메모리 제한이 8GB로 증가하여 실행된 후) 포드는 4GB로 시작하자마자 충돌한다.
4GB 제한과 같은 헤드 크기 범위를 사용해도 문제가 해결되지 않습니다. 사실, 이제 포드는 시작조차 하지 않습니다.
포드의 최대 메모리 4GB를 늘리지 않고 필요한 2.5GB를 수용하기 위해 JVM을 매개 변수화할 수 있는 방법이 있습니까?
지정하지 않을 경우 기본 "최대 힙"은 호스트 RAM의 1/4(25%)입니다. JDK 10은 기본 호스트 대신 컨테이너의 RAM 제한을 사용한다는 점에서 컨테이너에 대한 지원을 개선했습니다. @David Maze가 지적한 바와 같이 이것은 JDK 8로 역포팅되었다.
JDK 8의 최신 버전이 있다고 가정하면 를 사용하여 최대 힙에 사용되는 총 RAM의 기본 백분율을 수정할 수 있습니다. 따라서 지정하는 대신 예를 들어, 항목 참조
다음은 알파인 JDK 도커 이미지를 사용한 예입니다(특히 "JVM이 CPU 및 RAM 제한을 준수하도록 설정" 섹션 참조).
# this is running on the host with 2 GB RAM
docker run --mount type=bind,source="$(pwd)",target=/pwd -it openjdk:8
# running with MaxRAMPercentage=50 => half of the available RAM is used as "max heap"
root@c9b0b4d9e85b:/# java -XX:+PrintFlagsFinal -XX:MaxRAMPercentage=50.0 -version | grep -i maxheap
uintx MaxHeapFreeRatio = 100 {manageable}
uintx MaxHeapSize := 1044381696 {product}
openjdk version "1.8.0_265"
OpenJDK Runtime Environment (build 1.8.0_265-b01)
OpenJDK 64-Bit Server VM (build 25.265-b01, mixed mode)
# running without MaxRAMPercentage => default 25% of RAM is used
root@c9b0b4d9e85b:/# java -XX:+PrintFlagsFinal -version | grep -i maxheap
uintx MaxHeapFreeRatio = 100 {manageable}
uintx MaxHeapSize := 522190848 {product}
openjdk version "1.8.0_265"
나의 K8s 설정에서 나는 consur를 사용하여 포드 구성을 관리하고 있다. 다음은 jvm 설정을 즉시 재정의하는 명령입니다. 이는 프로젝트별로 매우 구체적이지만 구성을 위해 영사를 사용하는 경우 힌트를 줄 수 있습니다.
kubectl -n <namespace> exec -it consul-server -- bash -c "export CONSUL_HTTP_ADDR=https://localhost:8500 && /opt/../home/bin/bootstrap-config --token-file /opt/../config/etc/SecurityCertificateFramework/tokens/consul/default/management.token kv write config/processFlow/jvm/java_option_xmx -Xmx8192m"