문서유형ㅣ장애해결
분야ㅣ관리/환경설정
적용제품버전ㅣTibero 6, Tibero 7
문서번호ㅣTADTS069
현상
Linux 환경에서 SGA 영역(TOTAL_SHM_SIZE)를 크게 설정하고 SESSION 수 (MAX_SEISSON_COUNT)를 많게 설정한 경우 아래와 같은 현상이 나타날 수 있습니다.
Memory Swap Out/In
$ sar -W 1 14:20:00 pswpin/s pswpout/s 14:20:01 120.00 150.00 14:20:02 300.00 220.00 14:20:03 250.00 200.00 14:20:04 180.00 170.00 14:20:05 400.00 350.00 ...
- pswpout/s: Memory Free 공간 부족으로 Swap Memory로 1초당 이동 된 Page 개수
- pswin/s: Memory Free공간이 확보되어, Swap Memory로 Out 된 Page가 Process에 의해 재 사용 되어, Memory Free 공간으로 1초당 이동 된 Page 개수
Out of Memory
$ more /var/log/message ... Out of memory: Killed process 3760158 (tbsvr) total-vm:74067532kB, anon-rss:8090192kB, file-rss:1456kB, shmem-rss:46178864kB, UID:1501 pgtables:111604kB oom_score_adj:0 ...
- Linux에서는 Memory Free 공간을 더 이상 가용할 수 없고 Swap Memory 또한 가용할 수 없는 경우 발생
Memory가 부족한 상황에서 가장 많은 Memory를 확보할 수 있는 Process를 KILL
Tibero Database 서버에서는 tbsvr의 SHM 공간이 가장 많은 Memory를 차지 하여, tbsvr을 KILL
Server Hang
$ more /var/log/message ... Sep 23 10:24:18 DB01 abrt-hook-ccpp: Process 11283 (tbsvr) of user 1000 killed by SIGABRT - dumping core Sep 23 10:24:18 DB01 abrt-hook-ccpp: Process 11280 (tbsvr) of user 1000 killed by SIGABRT - ignoring (repeated crash) Sep 23 10:24:18 DB01 abrt-hook-ccpp: Process 11284 (tbsvr) of user 1000 killed by SIGABRT - ignoring (repeated crash) Sep 23 10:24:18 DB01 abrt-hook-ccpp: Process 11278 (tbsvr) of user 1000 killed by SIGABRT - ignoring (repeated crash) Sep 23 10:24:21 DB01 abrt-hook-ccpp: Process 11275 (tbsvr) of user 1000 killed by SIGABRT - ignoring (repeated crash) ...
- Memory Free 공간이 부족하여, Swap Memory를 사용하게 되는 상황에서 Swap Memory 용량이 여유있는 경우
- 성능 저하가 발생하여, 120초(defualt: 120초) 동안 응답이 없으면, Hang으로 판단하게 되어, 응답이 없는 Process를 KILL하게 되는 상황
원인
위와 같은 현상은 Linux Total Memory 크기 대비 Tibero Memory 산정을 했음에도 Page Table Memory 사용량이 측정되지 않은 경우 발생할 수 있는 문제입니다.
해결
Tibero Memory 산정 시 Page Table Memory 용량이 클 것으로 예상되는 경우 Huge Page를 적용하여,
해당 문제를 해소할 수 있습니다.
Huge Page 설정 방법 (Linux)
Linux에서 Huge page 설정하는 방법은 크게 2가지가 있습니다.
- Static Huge Page: 시스템 관리자가 일부 영역만 Huge Page 영역으로 설정하는 방법
- Transparent Huge Page(THP): Kernel에서 자동으로 4KB 단위를 묶어서 처리하는 방법
Static Huge Page
본 문서에서 적용하는 Tibero Huge Page 방식 입니다.
시스템 관리자가 Huge Page를 적용할 Memory 용량을 산정
일부 Memory 영역만 Huge Page로 사용할 수 있게 설정
Transparent Huge Page (THP)
시스템 관리자가 아닌 Kernel에서 자동으로 Page Size 단위를 묶어서 Huge Page 처리
Tibero Huge Page
서버 Memory 크기 대비 Tibero Instance Memory 설정 시 Page Table 용량이 클 것으로 예상되는 경우, 다음 방법을 통해 Huge Page를 적용합니다.
Tibero Huge Page 공식
PGA 영역
- PGA 영역은
MEMORY_TARGET - TOTAL_SHM_SIZE로 산정합니다. - PGA 영역은 Process 별로 각각 가지는 Non-Shared Memory로 Page Table 크기가 작습니다.
SGA 영역
- Tibero Huge Page (
USE_HUGE_PAGE=Y) 파라미터는 SGA 영역에만 적용됩니다. - SGA 영역은 tbsvr Process들이 모두 접근하기 때문에 Page Table 크기가 커질 수 있습니다.
- TAS Instance와 Storage Server Instnace는 제외, Huge Page 적용을 할 필요가 없습니다.
Non-Huge Page, Page Table 크기
총 페이지 수 = (TOTAL_SHM_SIZE * 1024 * 1024) / 4KBTOTAL_SHM_SIZE GB 단위라고 가정하여, SGA 영역을 Page Size 단위 (default 4KB)로 나눕니다.
프로세스 당 Page Table 크기 = ("총 페이지 수" * 8) / 1024 / 1024 MB
8은 Page Table Entry 크기 (byte) 입니다.
총 Page Table 크기 = ("프로세스 당 Page Table 크기" * "프로세스 개수") / 1024 GB
프로세스 개수는 ps -ef |grep $TB_SID |grep -v grep| wc-l 통해 확인할 수 있습니다. 즉, Tibero Database Instance에서 기동한 tbsvr 개수 (+리스너) 입니다.
Huge Page, Page Table 크기
총 페이지 수 = (TOTAL_SHM_SIZE * 1024) / 2MBTOTAL_SHM_SIZE GB 단위라고 가정하여, SGA 영역을 Huge Page 단위 (2MB) 나눕니다.
프로세스 당 Page Table 크기 = ("총 페이지 수" * 8) / 1024 KB
8은 Page Table Entry 크기 (byte)
총 Page Table 크기 = ("프로세스 당 Page Table 크기" * "프로세스 개수") / 1024 MB
프로세스 개수는 ps -ef |grep $TB_SID |grep -v grep| wc-l 통해 확인할 수 있습니다.
즉, Tibero Database Instance에서 기동한 tbsvr 개수 (+리스너) 입니다.
Huge Page 적용 순서
1. THP 기능 비활성화
- Huge Page와 THP가 같이 활성화 되어 있는 경우: PGA 또는 타 Process에서 Huge Page를 사용할 수 있어, THP 기능을 비활성화합니다.
- 시스템 엔지니어에게 OS 리부팅 시에도 적용이 되도록 요청합니다.
2. sysctl.conf 수정
- 필요한 Huge Page 용량을 산정하여, Memory Used 공간에 활성화시킵니다.
- Used 된 Huge Page 공간을 사용할 Linux GROUP ID를 지정합니다.
3. limits.conf 수정
- Linux Tibero 계정에 memlock을 지정하여, Swap 영역으로 SGA 영역이 빠지지 않도록 설정합니다.
4. $TB_SID.tip
- Tibero Database TIP에
USE_HUGE_PAGE=Y파라미터 활성화합니다. - TAS Instance, Storage Server Instance 제외합니다.
Kernel 설정
/etc/sysctl.conf
vm.nr_hugepage=%d vm.hugetlb_shm_group=%d
vm.nr_hugepage
- hugepage로 사용할 페이지 개수
(페이지 수 * 2MB) + 1~2% 여유으로 계산하여, 적용sysctl -p적용 시 Memory Used에 Huge Page Memory가 할당됨
vm.hugetlb_shm_group
- Tibero 엔진 계정의 그룹 ID지정
cat /etc/passwd에서 확인
/etc/security/limits.conf
tibero soft memlock %d tibero hard memlock %d
- Tibero 엔진 계정의 Swap Out을 하지 않도록 Memory에 LOCK을 설정할 수 있습니다.
- %d =
2MB * vm.nr_hugepage
Transparent Hugepage Disable
cat /sys/kernel/mm/transparent_hugepage/enabled
위 결과 값에 [] 괄호가 적용된 키워드대로 동작합니다.
- always: 항상 사용
- madvise: 애플리케이션 요청 시 사용
- never: 사용하지 않음
madvise 또는 never로 사용합니다.
Tibero Datbase 외에 동작하는 솔루션이 없다면, never로 적용
서버 재기동 시에도 영구 적용 되도록 설정이 필요합니다.
- 서버가 재기동 될 시 THP 기능을 never로 변경하는 스크립트 사용
- grup 설정을 통해 영구적으로 THP 기능을 never로 변경
참고
위 2가지 방법 중 1개를 통해 설정하며, 시스템 엔지니어에게 요청합니다.
Tibero 설정
Tibero Database TIP ($TB_SID.tip)
USE_HUGE_PAGE=Y
- Tibero에서
USE_HUGE_PAGE활성화 시 SGA 영역에만 적용됩니다.- SGA:
TOTAL_SHM_SIZE
- SGA:
- SGA 영역만 적용되며, PGA 영역은 여전히 Kenrel Page Size 단위로 메모리 할당됩니다.