메모리 문제 트러블슈팅

메모리 문제 트러블슈팅 (Memory Troubleshooting)

Flink에서 흔히 겪는 메모리 관련 예외(IllegalConfigurationException, OutOfMemoryError, 네트워크 버퍼 부족, 컨테이너 메모리 초과)를 진단하고 해결하는 방법을 설명해요.

출처: Troubleshooting (Memory)

본문

IllegalConfigurationException

TaskExecutorProcessUtilsJobManagerProcessUtils에서 IllegalConfigurationException이 던져지는 것을 보면, 보통 유효하지 않은 구성 값(예: 음수 메모리 크기, 1보다 큰 분수 등)이나 구성 충돌이 있음을 나타내요. 예외 메시지에 언급된 메모리 컴포넌트와 관련된 문서 장 또는 구성 옵션을 확인하세요.

OutOfMemoryError: Java heap space

이 예외는 보통 JVM Heap이 너무 작다는 것을 나타내요. total memory를 증가시켜 JVM Heap 크기를 키워볼 수 있어요. 또한 TaskManager의 task heap memory나 JobManager의 JVM Heap memory를 직접 늘릴 수도 있어요.

정보: TaskManager의 framework heap memory를 늘릴 수도 있지만, Flink 프레임워크 자체가 더 많은 메모리가 필요하다고 확신할 때만 이 옵션을 변경해야 해요.

OutOfMemoryError: Direct buffer memory

이 예외는 보통 JVM direct memory 한도가 너무 작거나 direct memory 누수가 있음을 나타내요. 사용자 코드나 다른 외부 의존성이 JVM direct memory를 사용하고 있는지, 그리고 그것이 제대로 계산되었는지 확인하세요. direct off-heap memory를 조정해 한도를 높여볼 수 있어요. off-heap memory를 구성하는 방법은 TaskManagers, JobManagers와 Flink가 설정하는 JVM arguments도 참고하세요.

OutOfMemoryError: Metaspace

이 예외는 보통 JVM metaspace 한도가 너무 작게 구성되었음을 나타내요. TaskManager(taskmanager-memory-jvm-metaspace-size)나 JobManager(jobmanager-memory-jvm-metaspace-size)의 JVM metaspace 옵션을 늘려볼 수 있어요.

IOException: Insufficient number of network buffers

이것은 TaskManager에만 해당돼요.

이 예외는 보통 구성된 network memory 크기가 충분하지 않음을 나타내요. 다음 옵션을 조정해 network memory를 늘려볼 수 있어요:

Container Memory Exceeded

Flink 컨테이너(Yarn 또는 Kubernetes)가 요청된 크기 이상으로 메모리를 할당하려 하면, 보통 Flink가 충분한 네이티브 메모리를 예약하지 않았음을 나타내요. 이는 외부 모니터링 시스템을 사용하거나 컨테이너가 배포 환경에 의해 종료될 때의 오류 메시지로 관찰할 수 있어요.

JobManager 프로세스에서 이 문제가 발생하면 jobmanager.memory.enable-jvm-direct-memory-limit 옵션을 설정해 JVM Direct Memory 한도를 활성화해 잠재적인 JVM Direct Memory 누수를 배제할 수 있어요.

RocksDBStateBackend를 사용하는 경우:

  • 메모리 제어가 비활성화된 경우: TaskManager의 managed memory를 늘려볼 수 있어요.
  • 메모리 제어가 활성화되었고 savepoint나 full checkpoint 동안 non-heap 메모리가 증가하는 경우: glibc 메모리 할당자 때문일 수 있어요(glibc bug 참고). TaskManager에 환경 변수 MALLOC_ARENA_MAX=1을 추가해볼 수 있어요.

대안으로 JVM Overhead를 늘릴 수도 있어요.

컨테이너 메모리를 구성하는 방법도 참고하세요.

더 알아보기 (Learn more)