HANA DB 시스템 모니터링 중, 단기간에 메모리를 피크를 찍는 이슈를 발견하여, 해당 이슈의 원인 분석과 추적 과정을 서술한다.
아래 원인 분석 과정은 다음 글을 토대로 진행하였다.
단기간에 평균 사용량의 배를 뛰어넘는 메모리를 사용하여 HANA DB 메모리 피크치를 찍는 이슈 현상이다.
해당 이슈가 발생하는 이유는 다양하겠지만, HANA DB 파라미터 설정을 통해 해당 이슈를 사전에 예방할 수도 있다.
(=> 해당 글 5. 이슈 처리
문단에 기술)
해당 이슈 사항으로 예상할 수 있는 사이드 이펙트는 다음과 같다.
1. HANA DB 설정 라이선스 값(Memory) 초과로 인한 DB Lock (서비스 중지 후, Lock)
2. 과다한 메모리 독점으로 다른 워크 프로세스의 메모리 할당을 차단
3. HANA DB Memory Load/Unload 로 인한 퍼포먼스 저하
4. HANA DB 메모리 누수
경험적으로 HANA DB 에서 과도한 메모리를 사용하는 경우는 보통 다음과 같으며, 해당 부분을 하나씩 점검했다.
이슈 시간대의 CPU, 네트워크, 트랜잭션, read, write 등등을 확인했으나, 평균과 비교해 부하가 많이 늘어나거나, 작업량이 갑자기 늘어나는 등의 특이 사항은 없었다.
즉, DB 부하로 인한 메모리 사용량 증가는 아닌것으로 확인
Cost가 비싼 SQL 문이 수행될 때에도 메모리 사용량이 대폭 증가할 수 있다.
그러나 이슈 시간대에 수행되어 기록된 Expensive Statements 는 없었다.
HANA DB 는 인메모리 DB 이므로, 보통의 DB 와 다르게 Main storage, Delta storage 두개를 사용하여 데이터를 Read, Write 한다. (간략한 설명)
Delta storage 가 Main storage 에 병합하는 작업을 Delta Merge 라 하며 Merge Dog에 의해서 자동으로 수행된다.
이때 대량의 메모리가 필요한데, 모니터링 뷰 M_DELTA_MERGE_STATISTICS 를 확인했을때, 이슈 시간대에 Delta Merge 이력은 없었다.
HANA DB 에서 컬럼 테이블을 메모리로 Load 할 때에도 메모리 사용량이 증가할 수 있다.
다음 DB 추적파일을 확인하였으나, 특이사항은 없었다.
indexserver_<DB Host>.<port>.loads.<XXX>.trc
HANA DB 에 다른 이슈가 있는지 확인하기 위해 indexserver alert 추적 파일과, DB Alert 도 확인했으나, 특이사항은 없었다.
위 기본 사항을 점검한 결과, 스탠다드 이슈 또는 설정등의 문제가 아니라고 생각했으며, 다음과 같은 사항을 추가로 확인했다.
아래 사항 확인을 위해서는 SAP 에서 제공하는 SQL Statement 가 필요하다.
다음 글을 참조하여, SQL Statement 를 준비할 수 있다.
(SAP SQL Statement) HANA_Memory_TopConsumers_TimeSlices 실행 결과, 이슈 시간대에서 다음 할당자에서 높은 메모리를 사용했다는 것을 확인했다.
다음 Notes 를 확인하여, 위 할당자 (Pool/JoinEvaluator/JE*
) 가 Join Engine 과 관련된 할당자라는 것을 확인했으며, 해당 할당자 호출로 큰 메모리 사용이 있을 수도 있다는 내용을 확인했다.
SAP Notes 1999997 - FAQ: SAP HANA Memory -> 13. What can I do if a certain heap allocator is unusually large?
다음 Notes 를 통해 이슈 할당자의 Statement Hash 를 확인했다.
SAP Notes 3203727 - How to find the SQL statements responsible for memory growth of Join Engine
(SAP SQL Statement) HANA_Threads_ThreadSamples_FilterAndAggregation 실행 결과, 이슈 할당자의 Statement Hash 를 확인했으며,
(SAP SQL Statement)
HANA_SQL_StatementHash_SQLText 에서 위 Hash 값으로 SQL 텍스트 문을 확인했다.
이슈 SQL 문을 분석하여, 문제의 프로그램과 테이블을 확인할 수 있다.
추적 결과, 확인한 프로그램과 테이블을 통해 담당자에게 내용 공유 및 가이드
메모리 사용량은 시스템을 운영하면서 필연적으로 증가할 수 밖에 없다.
다만, 위와 같이 급격한 메모리의 증가, 또는 피크를 치는 경우 여러 잠재적인 문제를 유발할 수 있으니 다음과 같은 조치를 통해 예방이 가능하다.
다음 메모리 제한 파라미터를 통해서 HANA DB 의 메모리 사용량을 제한할 수 있다.
메모리 제한 파라미터에 대한 자세한 설명과 설정값 가이드는 다음 글을 참고하기 바란다.
- SAP HANA DB 메모리 구조__SAP HANA DB Memory Structure -> 3-4. 메모리 사용 제한)
SAP HANA DB 에는 강제 타입(Enforced) 과 비강제 타입(Unenforced), 두 가지 타입의 라이선스가 존재한다.
시스템 모니터링 뷰
M_LICENSE
의ENFORCED
값이 TRUE 일 경우 "강제" 타입, FALSE 일 경우 "비강제" 타입.
이 중 "강제" 타입일 경우, 다음 상황에서 DB 가 잠금 모드로 전환된다.
따라서, 이러한 불상사를 미연에 방지하기 위해서는 자신이 운영하는 HANA DB 의 라이선스가 "강제" 타입인지 확인해두어야 한다. ("비강제" 타입일 경우, 라이선스 제한을 초과해도 DB 가 잠기지 않는다.)
help.sap 문서 참조