본문 바로가기

Cloud/Server

[LINUX] THP (Transparent Huge Pages) 개념 및 비활성화

LINUX 환경에서 메모리는 페이지(Pages)라는 일정한 크기의 블록 단위로 관리되는데, 기본적으로 한 페이지는 4KB (4096 Byte)이다.

 

Huge Pages는 기본 4KB 크기가 아닌, 2MB 혹은 1GB 크기의 페이지를 동적으로 할당해주는데,

이 Huge Pages를 자동으로 제어해주는 것이 THP 이다.

자세하게 풀어보자면, CPU는 메모리를 효율적으로 요청하기 위해

매번 물리 메모리 주소로 접근하는 것이 아니라 매핑 정보를 가진 Cache 역할의 TLB(Translation Lookaside Buffer)에 액세스하는데,
이 TLB를 조회할 때 발생하는 오버헤드를 자동으로 관리해주는 것이 THP(Transparent Huge Pages) 기능이다.

 


이렇게 메모리를 효율적으로 관리하고자 하는 의도와 달리, THP는 비활성화해야 하는 경우가 많다.

WHY?
THP를 통해 작은 메모리 페이지를 큰 메모리 페이지로 변환해주는 것도 오버헤드가 발생할 수 있다.
만약 메모리 할당/해제가 빈번한 시스템(이를테면 DB)에서는 오히려 성능 저하를 일으킬 수 있다.

메모리 누수 같은 현상을 방지하기 위해 THP 비활성화를 권장하기도 한다.

 

 

 


 

THP 활성화 상태

# cat /sys/kernel/mm/transparent_hugepage/enabled

[always] madvise never

 

THP 비활성화 상태

# cat /sys/kernel/mm/transparent_hugepage/enabled

always madvise [never]

 

 

 

 

#1 THP 영구 비활성화 방법(OS 재시작 필요)

 

# vi /etc/default/grub  -- 리눅스 부팅 시 해당 파일의 커널 설정값이 파라미터에 전달

내용 中 GRUB_CMDLINE_LINUX 값에 "transparent_hugepage=never" 값을 추가해준다.

 

ex)

(변경 전) GRUB_CMDLINE_LINUX="crashkernel=auto rhgb quiet"

(변경 후) GRUB_CMDLINE_LINUX="crashkernel=auto rhgb quiet transparent_hugepage=never "

 

 

# grub2-mkconfig -o /boot/grub2/grub.cfg  -- GRUB 변경사항 적용

# shutdown -r now

 

 

 

 

OS 재시작 후, 사진과 같이 비활성화 되어 있으면 된다 !

 

 

 

 

 

 

#2 THP 임시 비활성화 방법(OS 재시작 생략)

 

# echo never > /sys/kernel/mm/transparent_hugepage/enabled

 

OS 재부팅은 없어도 되지만, 재부팅 후에 다시 원복된다.

 

 

 

 


 

THP 비활성화에 따라, OS에 올라간 서비스의 설정을 변경해야 하는 경우도 있다.

내 경우는 MariaDB가 설치되어 있었고, Jemalloc 패키지를 설치 및 적용해야 했다. (여기서부턴 MariaDB 내용)

 

Jemalloc 이란?

고성능 메모리 할당 라이브러리.

메모리 할당/해제가 빈번한 환경에서 성능 최적화와 메모리 단편화 감소를 목적으로 만들어진 패키지

 

 

 

패키지 설치 방법

# yum install -y jemalloc

 

혹은, rpm 패키지를 서버에 업로드해서 수동 설치

# rpm -Uvh jemalloc*

 

# rpm -qa | grep jemalloc   -- 설치 여부 확인

# rpm -ql jemalloc  -- jemalloc 라이브러리 설치 위치 확인

 

 

 

MariaDB 적용 방법(DB 재시작 필요)

# vi /etc/my.cnf

 

 

아래 옵션 추가로 입력

 

[mysqld_safe]

malloc-lib=[위에서 확인한 jemalloc 라이브러리 설치 위치 입력]

ex) malloc-lib=/usr/lib64/libjemalloc.so.1

 

 

# systemctl restart mariadb  -- MariaDB 재시작

 

SQL> show global variables like '%malloc%';  -- MariaDB에 Jemalloc 정상 인식 확인

Value 값이 'system'에서 'jemalloc ~' 으로 변경되어 있는 것을 확인

 

 

 

 


 

 

사실 내 경우는 몇년 간 THP로 성능 저하가 발생한 적이 없지만,

이번에 엔지니어 의견으로 검토해보고 시스템 작업 때 적용하게 되었다.

 

비활성화가 주 권장사항인 경우가 많아 보이는데

메모리 누수가 진짜 발생하는지 Application에 따라 모니터링하면서 의사결정하는 것도 맞을 것 같다.