Transparent Huge Pages 기능 비활성화

Last Updated on 12월 6, 2020 by 태랑(정현호)

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


비활성화 진행


서비스 생성 및 등록

# 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

Disable 되었는지 확인

# 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) 사용/설정 하기

답글 남기기