본문 바로가기
Data PipeLine/Debezium

[Debezium] 최초 스냅샷 뜰 경우 OOM 에러 조치

by 연습장이 2023. 12. 11.
728x90
반응형

에러 내용

[2023-12-08 14:46:11,583] WARN  (org.eclipse.jetty.util.thread.QueuedThreadPool:1048)
java.lang.OutOfMemoryError: Java heap space
[2023-12-08 14:46:11,583] INFO [schema_30|task-0] [Producer clientId=connector-producer-schema_30-0] Closing the Kafka producer with timeoutMillis = 30000 ms. (org.apache.kafka.clients.producer.KafkaProducer:1204)
[2023-12-08 14:46:11,583] ERROR [schema_30|task-0] Producer failure (io.debezium.pipeline.ErrorHandler:31)
java.lang.OutOfMemoryError: Java heap space
[2023-12-08 14:46:11,584] INFO [schema_30|task-0] Metrics scheduler closed (org.apache.kafka.common.metrics.Metrics:659)
[2023-12-08 14:46:11,584] INFO [schema_30|task-0] Closing reporter org.apache.kafka.common.metrics.JmxReporter (org.apache.kafka.common.metrics.Metrics:663)
[2023-12-08 14:46:11,584] INFO [schema_30|task-0] Metrics reporters closed (org.apache.kafka.common.metrics.Metrics:669)
[2023-12-08 14:46:11,584] INFO [schema_30|task-0] App info kafka.producer for connector-producer-schema_30-0 unregistered (org.apache.kafka.common.utils.AppInfoParser:83)
[2023-12-08 14:46:11,586] INFO [schema_30|task-0] Finished streaming (io.debezium.pipeline.ChangeEventSourceCoordinator:141)
[2023-12-08 14:46:11,586] INFO [schema_30|task-0] Connected metrics set to 'false' (io.debezium.pipeline.metrics.StreamingChangeEventSourceMetrics:60)
[2023-12-10 22:52:27,606] INFO WorkerInfo values:
        jvm.args = -Xms256M, -Xmx2G, -XX:+UseG1GC, -XX:MaxGCPauseMillis=20, -XX:InitiatingHeapOccupancyPercent=35, -XX:+ExplicitGCInvokesConcurrent, -XX:MaxInlineLevel=15, -Djava.awt.headless=true, -Dcom.sun.management.jmxremote, -Dcom.sun.management.jmxremote.authenticate=false, -Dcom.sun.management.jmxremote.ssl=false, -Dkafka.logs.dir=/home/apps/kafka/bin/../logs, -Dlog4j.configuration=file:/home/apps/kafka/bin/../config/connect-log4j.properties
        jvm.spec = Red Hat, Inc., OpenJDK 64-Bit Server VM, 1.8.0_302, 25.302-b08

 

원인

카프카 커넥트는 java 기반이며 카프카 커넥트에 할당된 max heap size가 2GB였고 소스 데이터 최초 스냅샷 시 메모리 사용량은 이보다 더 커서 에러가 발생함

진단 방법

  1. jps 나 ps -ef 등으로 카프카 커넥트의 pid를 획득
  2. jmap -heap pid 입력
       MinHeapFreeRatio         = 40
       MaxHeapFreeRatio         = 70
       MaxHeapSize              = 2147483648 (2048.0MB) # ★여기 부분에 2G가 할당되어 있음
       NewSize                  = 1363144 (1.2999954223632812MB)
       MaxNewSize               = 1287651328 (1228.0MB)
       OldSize                  = 5452592 (5.1999969482421875MB)
       NewRatio                 = 2
       SurvivorRatio            = 8
       MetaspaceSize            = 21807104 (20.796875MB)
       CompressedClassSpaceSize = 1073741824 (1024.0MB)
       MaxMetaspaceSize         = 17592186044415 MB
       G1HeapRegionSize         = 1048576 (1.0MB)
    
    Heap Usage:
    G1 Heap:
       regions  = 2048
       capacity = 2147483648 (2048.0MB) # ★여기 부분에 2G가 할당되어 있음
       used     = 374015624 (356.68909454345703MB) # 부하가 치는 순간 여기가 2G에 가까워지며 커넥터가 죽음
       free     = 1773468024 (1691.310905456543MB)
       17.416459694504738% used
    G1 Young Generation:
    Eden Space:
       regions  = 63
       capacity = 70254592 (67.0MB)
       used     = 66060288 (63.0MB)
       free     = 4194304 (4.0MB)
       94.02985074626865% used
    Survivor Space:
       regions  = 8
       capacity = 8388608 (8.0MB)
       used     = 8388608 (8.0MB)
       free     = 0 (0.0MB)
       100.0% used
    G1 Old Generation:
       regions  = 351
       capacity = 1410334720 (1345.0MB)
       used     = 299566728 (285.68909454345703MB)
       free     = 1110767992 (1059.310905456543MB)
       21.240824873119482% used​
     

이 부분은 free -m 명령어로 캐치할 수가 없음

해결 방법

카프카 커넥트 우선 죽임

jps 또는 ps -ef 로 pid 획득
kill -9 pid

 

카프카 커넥트를 띄울 때 사용하는 connect-distributed.sh 파일 내에 아래처럼 변경

if [ "x$KAFKA_HEAP_OPTS" = "x" ]; then
#  export KAFKA_HEAP_OPTS="-Xms256M -Xmx2G"
# 처음에 6G로 했는데도 모자라서 아예 24G로 줬음. 참고로 서버 메모리는 32G짜리임
   export KAFKA_HEAP_OPTS="-Xms256M -Xmx24G"
fi

 

카프카 커넥트 데몬모드로 띄움

$카프카경로/bin/connect-distributed.sh -daemon $카프카경로/config/connect-distributed.properties

 

커넥터 생성 명령어 날린 후 max heap size 변경 확인

Attaching to process ID 99999, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.302-b08

using thread-local object allocation.
Garbage-First (G1) GC with 6 thread(s)

Heap Configuration:
   MinHeapFreeRatio         = 40
   MaxHeapFreeRatio         = 70
   MaxHeapSize              = 25769803776 (24576.0MB) # ★ 24G로 변경 확인
   NewSize                  = 1363144 (1.2999954223632812MB)
   MaxNewSize               = 15460204544 (14744.0MB)
   OldSize                  = 5452592 (5.1999969482421875MB)
   NewRatio                 = 2
   SurvivorRatio            = 8
   MetaspaceSize            = 21807104 (20.796875MB)
   CompressedClassSpaceSize = 1073741824 (1024.0MB)
   MaxMetaspaceSize         = 17592186044415 MB
   G1HeapRegionSize         = 4194304 (4.0MB)

Heap Usage:
G1 Heap:
   regions  = 6144
   capacity = 25769803776 (24576.0MB) # ★ 24G로 변경 확인
   used     = 19765727664 (18850.066818237305MB) # 다행히 18G 까지만 사용하고 2단계로 넘어감
   free     = 6004076112 (5725.933181762695MB)
   76.70111823827028% used
G1 Young Generation:
Eden Space:
   regions  = 57
   capacity = 1191182336 (1136.0MB)
   used     = 239075328 (228.0MB)
   free     = 952107008 (908.0MB)
   20.070422535211268% used
Survivor Space:
   regions  = 39
   capacity = 163577856 (156.0MB)
   used     = 163577856 (156.0MB)
   free     = 0 (0.0MB)
   100.0% used
G1 Old Generation:
   regions  = 4622
   capacity = 24415043584 (23284.0MB)
   used     = 19363074480 (18466.066818237305MB)
   free     = 5051969104 (4817.933181762695MB)
   79.30796606355139% used

14674 interned Strings occupying 1591880 bytes.

 

참고

  최초 스냅샷을 뜰 경우에만 대용량 메모리가 필요하며 최초 스냅샷이 완료되면 스냅샷 프로세스가 죽고 스트리밍 프로세스가 이어서 생성됨. 이 때 메모리 사용량은 줄어들게 되므로 카프카 커넥트에 할당된 heap size의 축소가 필요할 수 있음

728x90
반응형