현상
DPI 수행 도중 메모리 사용량이 지속적으로 증가하다가, 일정 시점 이후 out of memory 현상이 발생합니다.
참고
DPI(Data Processing Interface)는 대량의 데이터를 추출·가공·저장하는 일련의 배치 작업에서 사용되는 인터페이스로, 주로 데이터 마이그레이션이나 연계 시스템과의 인터페이스 처리에 활용됩니다.
원인
DPI 수행 시, 각 row의 정보를 저장하기 위한 구조체 변수가 사용되며, 이 변수 내에 실제 데이터를 저장하는 배열 변수가 존재합니다. 문제는 이 배열 변수의 길이가 "최대 컬럼 개수 × 각 컬럼이 가질 수 있는 최대 길이" 기준(약 98MB)으로 고정되어 있다는 점입니다. 이로 인해 구조체 크기가 과도하게 설정되어, 메모리 과다 사용 및 out-of-memory 문제가 발생하게 됩니다.
해결
DPI 수행 시 발생하는 out-of-memory 문제를 해결하기 위해, 구조체 내 실제 데이터가 저장되는 배열 변수의 크기를 컬럼 개수 × 각 컬럼이 가질 수 있는 최대 길이만큼만 동적으로 할당하도록 개선합니다.
아래는 개선 전후의 메모리 사용 방식 비교입니다.
[패치 전]
•
구조체 크기:
dop × 최대 컬럼 개수 × 컬럼 최대 길이
•
예시:
16 × 1500 × 65536 = 약 1.6GB
[개선 패치 후]
•
구조체 크기:
dop × 실제 컬럼 개수 × 각 컬럼의 최대 길이
•
예시 (컬럼 5개 기준):
16 × 5 × 65536 = 약 5MB
필요 시 dop 값을 줄이는 방식으로도 메모리 사용량을 줄일 수 있습니다.
참고
파라미터 | 값 | 설 |
_EX_SSGMT_MBRC | 4 | Executor노드들이 2 pass 작업을 할 때에 한번에 read/write 하는 CHUNK의 개수를 의미하는 파라미터 |
_OP_MEM_PX_MAX_SIZE | 36 | Parallel로수행되는 Executor Node의 최대 PGA 사용량 |