ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [flink-conf.yaml] jobmanager 메모리 설정 알아보기 ( JVM, Heap, Off-Heap, Overhead )
    Flink 2024. 7. 11. 05:55
    반응형

    - 목차

     

    들어가며.

    Apache Flinkflink-conf.yaml 파일은 Flink 클러스터의 전반적인 동작과 리소스 관리를 설정하는 설정 파일입니다.

    이번 글에서는 flink-conf.yaml 에서 JobManager 메모리를 설정하는 방법과 이를 최적화하는 방법에 대해 알아보겠습니다.

     

     

    jobmanager.memory.process.size

    jobmanager.memory.process.sizeJobManager 라는 하나의 프로세스가 사용할 수 있는 메모리의 총량이라고 생각하시면 됩니다.

    사실 일반적인 Process 는 가상 메모리 방식을 사용하기 때문에 그 내부적으로 메모리 제한이 특별히 존재하진 않습니다.

    그럼 어떠한 방식으로 Process 에 Memory 제한을 둘 수 있을까요 ?

     

    JobManager 는 하나의 JVM 프로세스이며, 이는 -Xmx 설정을 통해서 JVM Heap 메모리를 제한할 수는 있습니다.

    그리고 off-heap 메모리 또한 제한된 양만큼 Java NIO ByteBuffer 를 생성하는 방식으로 제한을 둡니다.

    그래서 jobmanager.memory.process.size = JVM Heap Memory + Off-Heap ByteBuffer 의 크기라고 생각해도 될 것 같습니다.

     

    아래의 예시는 jobmanager.memory.process.size 를 10g 로 설정한 예시입니다.

     

    cat <<'EOF'> /tmp/flink-conf.yaml
    jobmanager.rpc.address: jobmanager
    jobmanager.rpc.port: 6123
    jobmanager.bind-host: 0.0.0.0
    jobmanager.memory.process.size: 10g
    jobmanager.memory.jvm.overhead-fraction: 0.1
    parallelism.default: 1
    jobmanager.execution.failover-strategy: region
    rest.address: 0.0.0.0
    rest.port: 8081
    rest.enable: true
    rest.bind-address: 0.0.0.0
    blob.server.port: 6124
    query.server.port: 6125
    EOF
    
    docker run -d --platform linux/amd64 \
      --network flink -p 8082:8081 \
      --name jobmanager --hostname jobmanager \
      -v /tmp/flink-conf.yaml:/opt/flink/conf/flink-conf.yaml \
      --cpus 1 --memory 10g \
      flink:1.16.3-java11 jobmanager.sh start-foreground

     

    아래의 JobManager Metrics 사진에서 확인할 수 있듯이

    10g 인 jobmanager.memory.process.size 는 총 4개의 Memory 영역으로 나뉘어집니다.

    1. JVM Heap
    2. Off-Heap Memorhy
    3. JVM Metaspace
    4. JVM Overhead

    우선적으로 확인해하는 점은 jobmanager.memory.process.size 의 값은 4가지 메모리 영역으로 분리된다는 사실입니다.

     

     

     

    JVM Heap Memory.

    아래의 java 실행 명령어는 JobManager 를 실행하는 java 명령어입니다.

    조금 요약된 버전이긴 한데요.

    위 flink-conf.yaml 을 토대로 실행되는 JVM 실행 명령어입니다.

     

    /opt/java/openjdk/bin/java -Xmx9261023232 -Xms9261023232 -XX:MaxMetaspaceSize=268435456 
      -D jobmanager.memory.off-heap.size=134217728b 
      -D jobmanager.memory.jvm-overhead.min=1073741824b 
      -D jobmanager.memory.jvm-metaspace.size=268435456b 
      -D jobmanager.memory.heap.size=9261023232b 
      -D jobmanager.memory.jvm-overhead.max=1073741824b 
      --configDir /opt/flink/conf
      org.apache.flink.runtime.entrypoint.StandaloneSessionClusterEntrypoint

     

    JVM 의 최대 Heap Memory 를 설정하는 -Xmx 값은 9261023232 로 이는 8.625g 에 해당합니다.

    또한 Metaspace 의 값 또한 256Mb 에 해당합니다.

     

    jobmanager.heap.process.size 라는 JobManager 의 최대 Memory 를 기준으로

    JVM Heap, Off Heap, Overhead, metaspace 영역이 정해진 비율에 따라서 메모리를 점유합니다.

     

     

    JobManager 는 Off-Heap Memory 를 많이 사용하지 않는다.

    TaskManager 와 달리 JobManager 는 Off-Heap Memory 를 많이 사용하지 않습니다.

    거의 사용하지 않는 수준에 해당합니다.

    flink-conf.yaml 을 통해서 Off-Heap Memory 를 설정할 수 없으며 이는 128MB 로 고정됩니다.

     

    아래의 이미지는 jobmanager.memory.process.size 가 1GB 인 케이스입니다.

    이러한 경우에서도 Off-Heap Memory 는 128MB 로 고정됩니다.

    또한 jobmanager.memory.process.size 가 100GB 인 케이스에서도 마찬가지입니다.

     

     

     

    Overhead Memory.

    Overhead Memory 는 JVM Heap 이나 Off-Heap 처럼 데이터릐 저장 용도로 사용되는 메모리 공간은 아닙니다.

    이름처럼 여분의 데이터 저장 공간의 느낌으로 사용되구요.

    주로 Java NIO Socket 용도를 위한 ByteBuffer 를 생성하거나 별도의 용도로 사용됩니다.

    그리고 jobmanager.memory.jvm.overhead-fraction 와 같이 전체 메모리의 비율로써 Overhead Memory 를 설정할 수 있습니다.

    기본적으로 0.1 과 같이 10% 정도를 할당하며, 기본적으로 JobManager 는 Overhead Memory 의 사용 비율이 크지 않습니다.

     

    아래는 Overhead 로 0.5 Fraction 을 적용하는 예시입니다.

    그리고 10GB 의 50% 이지만 1GB 만큼만 Overhead 의 메모리로 저장됩니다.

    그 이유는 Overhead 의 Min Max 범위가 존재하기 때문입니다.

     

    cat <<'EOF'> /tmp/flink-conf.yaml
    jobmanager.rpc.address: jobmanager
    jobmanager.rpc.port: 6123
    jobmanager.bind-host: 0.0.0.0
    jobmanager.memory.process.size: 10g
    jobmanager.memory.jvm.overhead-fraction: 0.5
    parallelism.default: 1
    jobmanager.execution.failover-strategy: region
    rest.address: 0.0.0.0
    rest.port: 8081
    rest.enable: true
    rest.bind-address: 0.0.0.0
    blob.server.port: 6124
    query.server.port: 6125
    EOF
    
    docker run -d --platform linux/amd64 \
      --network flink -p 8082:8081 \
      --name jobmanager --hostname jobmanager \
      -v /tmp/flink-conf.yaml:/opt/flink/conf/flink-conf.yaml \
      --cpus 1 --memory 10g \
      flink:1.16.3-java11 jobmanager.sh start-foreground

     

     

    jobmanager.memory.jvm-overhead.max

    아래와 같이 jvm-overhead.max 값이 Overhead Fraction 보다 큰 경우에만 jobmanager.memory.jvm-overhead.fraction 이 적용됩니다.

     

    cat <<'EOF'> /tmp/flink-conf.yaml
    jobmanager.rpc.address: jobmanager
    jobmanager.rpc.port: 6123
    jobmanager.bind-host: 0.0.0.0
    jobmanager.memory.process.size: 10g
    jobmanager.memory.jvm-overhead.max: 6g
    jobmanager.memory.jvm-overhead.fraction: 0.5
    parallelism.default: 1
    jobmanager.execution.failover-strategy: region
    rest.address: 0.0.0.0
    rest.port: 8081
    rest.enable: true
    rest.bind-address: 0.0.0.0
    blob.server.port: 6124
    query.server.port: 6125
    EOF
    
    docker run -d --platform linux/amd64 \
      --network flink -p 8082:8081 \
      --name jobmanager --hostname jobmanager \
      -v /tmp/flink-conf.yaml:/opt/flink/conf/flink-conf.yaml \
      --cpus 1 --memory 10g \
      flink:1.16.3-java11 jobmanager.sh start-foreground

     

     

    반응형
Designed by Tistory.