Appendix D. HugePage 설정 방법

각 운영체제별 HugePage 설정 방법에 대하여 설명합니다.

Linux

본 절에서는 Linux 환경에서 HugePage를 설정하기 위한 방법에 대하여 설명합니다. HugePage로 설정된 공간은 공유 메모리 용도로 사용되며, 이 때 특징은 다음과 같습니다.

  • 메모리 주소 변환에 사용되는 TLB(Translation Lookaside Buffer) hit 비율 상승으로 메모리 접근 성능이 향상될 수 있습니다.

  • Page 관리를 위한 구조인 Page Table Size가 줄어든다. 공유 메모리는 DB process 전체가 접근하는 공 간으로서 같은 메모리에 대한 Page Table이 process마다 생성되는데, HugePage를 사용함으로써 메모 리 사용량을 크게 줄일 수 있습니다. session 수가 증가 (process 수가 증가) 할수록 메모리 절약 효과는 증 대됩니다.

  • 확보된 HugePage 공간은 DB 인스턴스 부팅 시점에 공유 메모리로 할당되므로 사용/해제를 위해 DB 인스턴스 재기동이 필요합니다. 이 때 할당된 메모리는 공유 메모리를 위한 공간으로 고정되어 시스템 내 에서 다른 용도(kernel 메모리, process 메모리 등)로 사용되지 않습니다.

  • HugePage로 설정된 Page는 자동으로 locked 상태가 되며, 공유 메모리 영역이 디스크로 swap out되 지 않도록 보장합니다.

circle-info

참고

Page Table Size에 대한 자세한 계산식은 “D.1.4. Pagetable Size 계산”을 참고합니다.

활성화

HugePage를 활성화하기 위한 설정 방법은 아래와 같습니다.

  1. 현재 운영체제에서 지원하는 HugePage의 크기를 아래와 같이 확인합니다.

$ grep Hugepagesize /proc/meminfo 
Hugepagesize:	2048 KB
  1. Tibero를 운영하는 유저 그룹의 아이디를 다음과 같이 확인합니다.

$ id -a
uid=579(tibero) gid=579(tibero) groups=579(tibero)
  1. HugePage를 할당할 그룹과 개수를 "/etc/sysctl.conf"에 적용합니다.

커널 파라미터
설명
공식

vm.nr_hugepages

HugePage 개수

TOTAL_SHM_SIZE / HugePage 크기

vm.hugetlb_shm_group

HugePage를 할당할 그룹 아이디

Tibero를 운영하는 유저 그룹의 아이디

circle-info

참고

DB 인스턴스만을 부팅하기 위한 vm.nr_hugepages 의 최소값이 [TOTAL_SHM_SIZE + / HugePage 크기] 이기 때문에, OS 상에 타 프로그램들이 존재하는 경우 이를 고려하여 OS 담당자와 충분한 상의 후 값을 조정 및 반영합니다.

아래는 TOTAL_SHM_SIZE의 설정값이 1024MB 이고, 현재 운영체제에서 지원하는 HugePage 크기가2MB(2048 KB)인 경우에 커널 파라미터를 적용한 예제입니다.

  1. Max locked memory 제한값을 "/etc/security/limits.conf"에 적용합니다.

설정값
공식

memlock

HugePage 크기 * HugePage 개수

아래는 앞에서 구한 값으로 memlock 값을 설정한 예제입니다.

  1. 운영체제를 재시작합니다.

아래와 같이 변경된 HugePage 값을 확인할 수 있습니다.

  1. 환경설정 파일(.tip)에 다음과 같은 Tibero 초기화 파라미터를 설정합니다.

초기화 파라미터
설정값

TOTAL_SHM_SIZE

HugePage 크기 * HugePage 개수

USE_HUGE_PAGE

Y

아래는 앞에서 구한 값으로 초기화 파라미터를 설정한 예제입니다.

  1. Tibero 서버를 재기동합니다.

비활성화

HugePage 활성화를 위해 수행한 과정과 동일한 순서로 수정하였던 값을 되돌리는 과정을 진행합니다.

THP(Transparent Huge Pages) 비활성화

Linux 환경의 경우, OS 상의 메모리 사용 패턴에 따라 자동으로 메모리 페이지 단위를 높여주는 THP 라 는 기능을 지원하고 있습니다.

그러나 해당 기능을 활성화 하는 경우, 공유 메모리 뿐만 아니라 프로세스 메모리까지 HugePage 로 동작 하게 되면서 성능이 일관되지 않게 동작할 수 있습니다. (성능 저하를 야기할 수 있음)

때문에 해당 커널 파라미터를 never로 설정하는 것을 강력하게 권장합니다.

Pagetable Size 계산

x86_64 아키텍처에서 Linux는 4단계 계층적 페이지 테이블 구조(PGD→PUD→PMD→PTE)를 사용하며 페이지 크기가 커질수록(4KB→2MB→1GB) 테이블 계층이 한 단계씩 줄어들고 전체 page table 크기가 작아집니다.

  • 4KB page: 4단계 사용 (PGD→PUD→PMD→PTE)

  • 2MB page: 3단계 사용 (PGD→PUD→PMD)

  • 1GB page: 2단계 사용 (PGD→PUD)

다음은 TOTAL_SHM_SIZE의 설정값이 50GB 인 경우 증가할 수 있는 page table의 최대 크기를 계산한 예제입니다.

  • 전체 shared memory 크기 / 페이지 크기 = 필요한 페이지 개수

  • 각 엔트리 크기 = 8 bytes (x86_64 기준)

  • 마지막 레벨 테이블 크기 = 페이지 개수 × 8 bytes

  • 전체 page table size = 모든 레벨의 테이블 크기 합

[표 1] 페이지 크기별 page table size (SHM 50GB 기준)

Page Size
필요 page 개수
마지막 레벨 테이블 크기
프로세스 page table size

4KB

13,107,200

102,400KB

(1GB page table size) + (2MB page table size) + 102,400KB

2MB

25,600

200KB

(1GB page table size) + 200KB

1GB

50

400B

400B

전체 page table size는 상위 레벨 테이블 크기가 누적되는 방식이므로 페이지 크기가 커질수록 필요한 테 이블 레벨이 줄고, 전체 page table size가 감소합니다.

  • 4KB: 1GB page table size + 2MB page table size + 마지막 레벨(pte) 크기

  • 2MB: 1GB page table size + 마지막 레벨(pmd) 크기

  • 1GB: 마지막 레벨(pud) 크기만 필요

최종적으로, <DB 프로세스 개수 * 프로세스 page table size> 의 결과값이 DB 인스턴스 전체 page table 최대 size가 됩니다.

circle-info

참고

Processs Memory를 위한 Page Table Size는 별도로 계산됩니다.

AIX

AIX에서는 HugePage 대신 Large page라는 용어를 대신 사용하며 기본적인 장점은 HugePage와 동일합니다.

활성화

HugePage를 활성화하기 위한 설정 방법은 아래와 같습니다.

1. 운영체제 Large page 설정값을 변경합니다.

AIX는 내부적으로 4KB 및 16MB 크기의 물리 Memory Pool을 유지합니다. 이 Pool의 크기는 vmo 명령을 통해 16MB Memory Pool의 크기를 변경할 수 있다. 나머지 공간은 자연스럽게 4KB로 할당됩니다.

AIX 5.3 이후부터는 Large page Pool이 동적으로 유지되므로 변경 후 시스템을 재부팅할 필요가 없습니다.

먼저 공유 메모리 할당된 공간이 디스크로 스왑되지 않도록 v_pinshm 설정이 별도로 필요합니다. percent_of_real_memory는 전체 메모리 중에서 TSM이 차지하는 비율을 지정합니다.

Large page Pool 크기를 설정합니다. num_of_large_pages는 TSM을 16MB로 나눈 값이 되며, 정수 단위로 입력합니다.

2. 사용자 권한을 설정합니다.

보안 정책 상 root 이외의 사용자는 Large page를 사용하기 위해서 아래와 같은 권한을 Tibero 사용자에게 부여해 주어야 합니다. chuser 명령을 통해 해당 권한을 설정할 수 있습니다.

3. 환경설정 파일(.tip)에 아래와 같은 Tibero 초기화 파라미터를 설정합니다.

초기화 파라미터
설정값

TOTAL_SHM_SIZE

1GB(기본값)

USE_HUGE_PAGE

Y

아래는 앞에서 구한 값으로 초기화 파라미터를 설정한 예제입니다.

4. Tibero 서버를 재기동합니다.

비활성화

Large page를 활성화면서 변경했던 값을 다시 원래대로 복구합니다.

Solaris

ISM(Intimate Shared Memory) 기능을 통해서 HugePage 기능을 적용할 수 있습니다. Solaris에서는 HugePage 대신 Large page라는 동일한 의미의 용어를 대신 사용합니다.

ISM을 사용할 때의 이점은 아래와 같습니다.

  • ISM 공유 메모리는 생성될 때 자동으로 운영체제에 의해서 locked 상태가 됩니다. 이를 통해 해당 메모리 영역이 디스크로 스왑되지 않도록 보장하며, 운영체제 커널 내부에서 I/O를 위해 더 빠르게 동작하는 locking 매커니즘을 사용할 수 있습니다.\

  • 커널의 가상 메모리를 주소와 물리 메모리 주소 간 변환을 위한 메모리 구조를 여러 프로세스 사이에서 공유하게되므로, CPU 소모 시간을 줄이고 커널 메모리 공간을 절약할 수 있습니다.\

  • 시스템의 MMU(Memory Management Unit)에서 지원하는 Large page가 자동으로 ISM 메모리 세그먼트에 할당됩니다. 이를 통해 page 관리를 위한 메모리 공간이 절약되고, 가상 메모리 주소 변환이 간단해지므로 시스템 성능을 향상시킬 수 있습니다.

활성화

아래와 같은 서버 초기화 파라미터 설정을 통해 활성화 할 수 있습니다. 해당 파라미터는 Solaris에서만 유효하며 기본값은 Y입니다.

이 기능을 켜면 shmget으로 공유 메모리를 만들고, shmat로 attach할 때 SHM_SHARED_MMU라는 옵션이 추가됩니다. 서버 프로세스와 리스너 프로세스에만 한정되어 적용되며, 서버의 TSM을 attach하는 클라이언트 모듈은 이 옵션을 적용하지 않습니다. 만약, 해당 파라미터의 설정값이 Y가 아닌 경우에는 Y로 수정 하고 Tibero 서버를 재기동합니다.

비활성화

서버 초기화 파라미터 _USE_ISM 값을 N으로 수정하고 Tibero 서버를 재기동합니다.

Last updated