Transparent Huge Pages 기능 비활성화 - THP

Share

Last Updated on 8월 13, 2023 by Jade(정현호)

Transparent Huge Pages

Linux 는 메모리에 대한 관리를 Pages 단위로 관리/사용되고 있고 기본 페이지는 4096바이트(4K)로 고정되어 있습니다.

1GB의 메모리는 256,000개의 page로 구성되어있는 것이고 이러한 페이지는 메모리 크기가 늘어남에 따라 관리테이블(TLB)도 커지게 되어 OS의 관리되는 요건이 늘어난다 던지 메모리를 Access 하는 과정에서의 많은 페이지로 인하여 overhead 가 발생할수 있는 내역이 존재합니다.


이런 문제를 해결하기 위해서는 페이지의 크기를 확대하는 방법이 도입되었으며 이것을 Huge Pages라 지칭하며 보통 Oracle과 같은 DB서버에서 활용하곤 합니다.

이런 hugepage는 커널파라미터를 지정하여 재부팅을 하거나 kernel 파라미터가 필요할 때마다 설정후 systel -p 등으로 적용하는 작업이나 관리 요소가 필요 하였기 때문에 이를 자동으로 관리해주는 기능은 Transparent Huge Pages(THP) 이 도입되었고 어플리케이션의 많은 메모리를 요구하게 되면 알아서 2MB large page 를 할당을 해주게 되는데 이러한 과정에서 오히려 performance degree 현상이나 application crash 가 발생하는 등 side effect 가 발생되는 사례가 나타났습니다.

그래서 많은 어플리케이션의 knowledge document나 support 문서등에서는 처음부터 THP 의 disable 설정을 권고하는 어플리케이션도 많이 있습니다(ie oracle, mongodb .. etc)

Disable 하는 방법은 여러가지 방법이 있습니다. 포스팅에서는 service 등록하는 형태로 진행하려고 합니다.
          

활성화 여부 확인

먼저 활성화 여부를 확인 해보도록 하겠습니다.


[root]# cat /sys/kernel/mm/transparent_hugepage/enabled

[always] madvise never

[root]# cat /sys/kernel/mm/transparent_hugepage/defrag
[always] madvise never


위와 같이 hugepage/enable  와 hugepage/defrag 조회시 [always] 라고 보인다면 현재 기능이 활성화되어 있는 상태입니다.
        

비활성화 설정

포스팅에서는 서비스를 등록하여 비활성화 를 진행하도록 하겠습니다.
           

서비스 생성 및 등록

아래와 같이 disable-thp.service 명으로 서비스를 생성 및 등록하도록 하겠습니다.


• 서비스 생성 및 등록

~]# vi /etc/systemd/system/disable-thp.service

## 아래 내용 입력 ##

[Unit]
Description=Disable Transparent Huge Pages (THP)

[Service]
Type=simple
ExecStart=/bin/sh -c "echo 'never' >/sys/kernel/mm/transparent_hugepage/enabled && echo 'never' >/sys/kernel/mm/transparent_hugepage/defrag"

[Install]
WantedBy=multi-user.target



• 서비스 시작 및 활성화

~]# systemctl daemon-reload

~]# systemctl start disable-thp

~]# systemctl enable disable-thp

~]# systemctl status disable-thp

       

kernel command 수정

/etc/default/grub 파일내 GRUB_CMDLINE_LINUX entry 에 인자를 추가합니다.

# vi /etc/default/grub

GRUB_CMDLINE_LINUX="elevator=deadline audit=1 crashkernel=auto rd.lvm.lv=rootvg/rootlv rd.lvm.lv=rootvg/swaplv rd.lvm.lv=rootvg/usrlv transparent_hugepage=never"


변경 사항 적용

~]# grub2-mkconfig -o /boot/grub2/grub.cfg
       

비활성화 여부 확인

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

위의 조회 결과가 아래와 같이 never 로 되어 있다면 정상적으로 disable 된 것 입니다.
always madvise [never]
          

tuned-adm

시스템에 따라서 Tuned 데몬이 동작하게 되면 tuned 서비스를 통해 THP 기능이 활성화 될 수도 있습니다.

현재 사용중인 profile 및 가능한 profile 리스트는 아래와 같이 확인할 수 있습니다.

[root]# tuned-adm list
Available profiles:
- balanced - General non-specialized tuned profile
- desktop - Optimize for the desktop use-case
- hpc-compute - Optimize for HPC compute workloads
- latency-performance - Optimize for deterministic performance at the cost of increased power consumption
- network-latency - Optimize for deterministic performance at the cost of increased power consumption, focused on low latency network performance
- network-throughput - Optimize for streaming network throughput, generally only necessary on older CPUs or 40G+ networks
- powersave - Optimize for low power consumption
- throughput-performance - Broadly applicable tuning that provides excellent performance across a variety of common server workloads
- virtual-guest - Optimize for running inside a virtual guest
- virtual-host - Optimize for running KVM guests
Current active profile: virtual-guest   <--!!


tuned 서비스가 동작 중인지 확인하고 profile에 무엇인지를 확인하여 profile에 THP 를 활성화하는 내용이 있는지를 확인해야 합니다.

[root]# systemctl status tuned
* tuned.service - Dynamic System Tuning Daemon
Loaded: loaded (/usr/lib/systemd/system/tuned.service; enabled; vendor preset: enabled)
Active: active (running) since Wed 2020-09-09 01:37:43 KST; 1 weeks 1 days ago


linux7 에서의 경로 "/etc/tuned"  이고 아래는 리눅스 6버전에서 enterprise-storage profile 사용환경에서의 예시입니다.

/etc/tune-profiles/enterprise-storage/ktune.sh

#!/bin/sh

. /etc/tune-profiles/functions

start() {
  set_cpu_governor performance
  set_transparent_hugepages always ---->>>> set transparent_hugepages always
  disable_disk_barriers
  multiply_disk_readahead 4

  return 0
}

stop() {
  [ "$1" != "restart" ] && restore_cpu_governor
  restore_transparent_hugepages
  enable_disk_barriers
  restore_disk_readahead

  return 0
}

process $@ 


위와 같이 현재 사용중인 profile 을 확인 하여  tuned 설정 디렉토리를 추가적으로 환경에 따라서 마지막으로 확인해보면 정상적으로 THP 기능을 비활성화 할 수 있습니다.


연관된 글 :  MySQL 에서 Large Page(HugePage) 사용/설정하기

          

0
글에 대한 당신의 생각을 기다립니다. 댓글 의견 주세요!x