2016년 7월 11일 월요일

EXADATA X5-2 Performance Test Memory Issue

Symptom
성능테스트 부하를 주기 시작하면 memory used 및 cache 가 빠른 속도로 증가하고 free memory가 고갈되는 시점에 서버 hang 상태로 빠져 테스트 불가.
free memory 가 고갈되기 전까지는 정상적으로 트래픽 수용 함.
특이하게 1번 노드의 memory used 가 매우 높은 상태 ( Node1:128G, Node2:12G)
양쪽 노드의 SGA 크기는 85G로 설정 되어 있음.
ASMM 사용 안함. (max_sga_size=85G)




Cause
1번 노드의 hugepage 설정이 크게 잡혀 있어 1번 노드의 used 가 기본적으로 많이 높은 상태를 유지하였다.
2번 노드는 실수로 hugepage 설정을 빠뜨려서 used가 낮은 상태를 유지된 것임.

[EXA]root@dbnode1:/root#grep Huge /proc/meminfo
HugePages_Total:   60000
HugePages_Free:    58982
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB

[EXA]root@dbnode2:/root#grep Huge /proc/meminfo
HugePages_Total:    1024
HugePages_Free:        6
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB

커널 파라미터의 hugepage 사용량을 설정한 만큼은 기본적으로 memory used 로 할당 된다.
즉, 1번 노드는 설정에 따라 HugePages_Total x Hugepagesize = 60000 X 2048K = 117G 만틈은 항상 used 로 할당된 것이다.
60000으로 설정한 이유는 과거 11g Exadata 서버 구축 시 hugepage 설정이 SGA 크기보다 작으면 에러가 발생하여 설정한 것이다.

use_large_pages DB parameter 에 의해 SGA할당 시 hugepage 사용 여부가 결정되는데 TRUE(사용), FALSE(미사용), ONLY(무조건사용) 중에 하나의 값을 가진다.
과거 11g Exadata 에서는 ONLY로 설정되어 있어서 SGA증가 했을 시 DB가 기동되지 않았고 hugepage를 먼저 크게 설정한 다음 기동했어야 했다.
그런데 12c 에서는 use_large_pages 가 FALSE 로되어 있어서 1번 노드에서 미리 크게 잡아놓은 hugepage는 무의미해지고 free memory 로부터 SGA를 할당하여 메모리 고갈이 발생한 것이다.

SQL> show parameter use_large_pages

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
use_large_pages                      string      FALSE

과거 11g 버전의 Exadata 에서는 초기 셋팅 시 use_large_pages=ONLY 로 변경하는 절차가 있었으나..
고객이 SGA를 늘릴 경우 DB가 올라오지 않는 혼선으로 인해 최근 부터는 use_large_pages=ONLY 로 적용하는 절차가 제외 되었다고 한다.
즉, DB버전 차이로 인한 문제가 아닌 오라클 설치 정책의 변화로 인한 차이이며, 12c 에서도 best practice는 SGA를 크게 잡을 시 use_large_pages=ONLY로 하고 hugepage를 사용하는 것이다.



Solution
양쪽 DB노드 모두 hugepage 사이즈를 동일하게 크게 설정하고 use_large_pages=ONLY 로 적용.

[EXA]root@dbnode1:/root# sysctl -w vm.nr_hugepages=51200
[EXA]root@dbnode1:/root# echo "vm.nr_hugepages=51200" >> /etc/sysctl.conf
[EXA]root@dbnode1:/root# cat /etc/sysctl.conf | grep nr_huge
# vm.nr_hugepages = 1024
vm.nr_hugepages=51200
[EXA]root@dbnode1:/root#grep Huge /proc/meminfo
HugePages_Total:   51200
HugePages_Free:     1669
HugePages_Rsvd:      119
HugePages_Surp:        0
Hugepagesize:       2048 kB

SQL> alter system set use_large_pages scope=both sid='*';
SQL> show parameter use_large_pages

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
use_large_pages                      string      ONLY

적용 후 성능테스트 부하를 발생했을 시 SGA를 hugepage로 미리 할당된 used에서 사용하므로 메모리 사용량에 큰 변화가 크게 없다.


Conclusion
SGA 설정 시 hugepage 사용 여부 및 관련 파라미터도 확인하자.
* DB Parameter : use_large_pages
* Kernel Parameter :  vm.nr_hugepages



댓글 없음: