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였고 소스 데이터 최초 스냅샷 시 메모리 사용량은 이보다 더 커서 에러가 발생함
진단 방법
- jps 나 ps -ef 등으로 카프카 커넥트의 pid를 획득
- 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
반응형
'Data PipeLine > Debezium' 카테고리의 다른 글
[Debezium] 1.8 Release Note 주요 내용 정리 (0) | 2024.01.20 |
---|---|
[Debezium] 1.7 Release Note 주요 내용 정리 (0) | 2024.01.15 |
[Debezium] 1.6 Release Note 주요 내용 정리 (0) | 2024.01.14 |
[Debezium] 1.5 Release Note 주요 내용 정리 (0) | 2024.01.13 |
[Debezium] 1.4 Release Note 주요 내용 정리 (0) | 2024.01.12 |