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에 따라 모니터링하면서 의사결정하는 것도 맞을 것 같다.