본문 바로가기
OS-OE Knowledge/Linux-Unix KB

How to disable Transparent Huge Pages (THP)

by 스쳐가는인연 2013. 8. 21.

THP는 대용량 사이즈의 페이지를 응용프로그램이 필요로 할 때, 관리자의 특정한 설정 없이 가장 활성화 되어 있는 프로세서로 부터 대용량 사이즈의 페이지를 보다 쉽게 접근하도록 허용하기 위한 기능이다.


대부분의 경우 THP 기능을 사용하면 성능 향상을 기대할 수 있으나, 상황(특정 프로그램)에 따라서는 THP로 인해 System Hang 이 유발되는 경우가 있다. (DB의 경우는 더 많은 듯 하다 ...)


- 사용하지 않도록 변경하는 방법 -


아래 명령을 통해 현재 사용 중인 옵션을 확인 할 수 있다.

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

[always] madvise never

변경 >>
always madvise [never]


옵션은 always, madvise, never 의 세 가지가 있으며, THP를 사용하지 않도록 하기 위해서는 Never를 선택하면 된다.

아래 명령을 통해 실시간으로 적용할 수 있으나, 단발성으로 시스템이 리부팅 되면 원래 값으로 되돌아 간다.
# echo never >/sys/kernel/mm/transparent_hugepage/enabled

시스템에 영구적으로 적용하기 위해서는 특정 파일을 수정하여야 한다.
1) /etc/init.d/boot.local 파일에 아래 명령 줄을 추가하거나,
    /bin/echo never > /sys/kernel/mm/transparent_hugepage/enabled

2) /boot/grub/menu.lst 또는 /etc/grub.conf 또는 /etc/sysconfig/mic/default.conf 파일에 아래 항목을 추가해도 동일 하다.
    transparent_hugepage=never

- 설정 적용 후 확인 하는 방법 - 
아래 명령을 통해 Anonymous HugePages의 크기가 0으로 확인되면 적용된 것이다.
설정이 적용된다 하더라도 리부팅하지 않으면 AnonHugePages는 Clear되지 않으니 참고하자.

# cat /proc/meminfo

MemTotal:       264667788 kB

MemFree:         2308868 kB

Buffers:         2591388 kB

Cached:         26603576 kB

SwapCached:            0 kB

Active:         227425612 kB

Inactive:       30682760 kB

Active(anon):   224429252 kB

Inactive(anon):  7217284 kB

Active(file):    2996360 kB

Inactive(file): 23465476 kB

Unevictable:           0 kB

Mlocked:               0 kB

SwapTotal:       2097148 kB

SwapFree:        2097048 kB

Dirty:              1772 kB

Writeback:             0 kB

AnonPages:      228908064 kB

Mapped:          3063852 kB

Shmem:           2739000 kB

Slab:             955204 kB

SReclaimable:     553600 kB

SUnreclaim:       401604 kB

KernelStack:        9408 kB

PageTables:       493132 kB

NFS_Unstable:          0 kB

Bounce:                0 kB

WritebackTmp:          0 kB

CommitLimit:    134431040 kB

Committed_AS:   241550964 kB

VmallocTotal:   34359738367 kB

VmallocUsed:      782784 kB

VmallocChunk:   34224749156 kB

HardwareCorrupted:     0 kB

AnonHugePages:  208003072 kB

HugePages_Total:       0

HugePages_Free:        0

HugePages_Rsvd:        0

HugePages_Surp:        0

Hugepagesize:       2048 kB

DirectMap4k:      555248 kB

DirectMap2M:    36134912 kB

DirectMap1G:    231735296 kB



참고

Huge Pages 및 Transparent Huge Pages

https://access.redhat.com/site/documentation/ko-KR/Red_Hat_Enterprise_Linux/6/html/Performance_Tuning_Guide/s-memory-transhuge.html


메모리는 페이지 (pages)라는 블록에서 관리됩니다. 한 페이지는 4096 바이트입니다.

1MB 메모리는 256 페이지에 상응하며 1GB 메모리는 256,000 페이지에 상응합니다.

CPU에는 이러한 페이지 목록이 포함된 내장 메모리 관리 장치가 있고 각 페이지는 페이지 테이블 엔트리를 통해 참조됩니다. 


대량의 메모리를 관리하기 위해 시스템을 활성화할 수 있는 다음과 같은 두 가지 방법이 있습니다: 

- 하드웨어 메모리 관리 장치에서 페이지 테이블 엔트리 수를 늘림 

- 페이지 크기를 확대함 


현재 프로세서에 있는 하드웨어 메모리 관리 장치는 수백에서 수천 페이지 테이블 엔트리만을 지원하므로 첫 번째 방법은 비용이 많이 듭니다. 또한 수천 페이지 (메가바이트 메모리)에서 잘 작동하는 하드웨어 및 메모리 관리 알고리즘은 수백만 (심지어 수십억) 페이지에서는 실행에 어려움이 있을 수 있습니다. 이러한 경우 성능 문제를 일으킬 수 있습니다. 애플리케이션이 메모리 관리 장치가 지원하는 것 보다 많은 메모리 페이지를 사용해야 할 경우 시스템은 더 느린 소프트웨어 기반 메모리 관리로 폴백하여 시스템 전체가 더 느리게 실행됩니다. 

Red Hat Enterprise Linux 6에서는 huge pages를 사용하여 두 번째 방법을 구현하고 있습니다. 


간단하게 말하면 huge pages는 2MB 및 1GB 크기의 메모리 블록입니다.

2MB 페이지를 사용하는 페이지 테이블은 여러 기가 바이트의 메모리 관리에 적합한 반면 1GB 페이지의 페이지 테이블은 테라바이트 메모리 까지의 확장에 가장 적합합니다. 


Huge pages는 부팅시 할당해야 합니다.

이는 수동으로 관리하기 어려우므로 효과적으로 사용하기 위해 코드를 크게 변경해야 할 경우가 많습니다.

이를 위해 Red Hat Enterprise Linux 6에서는 THP (transparent huge pages)의 사용을 구현하고 있습니다.

THP는 huge pages의 생성, 관리, 사용의 대부분을 자동화하는 추상화 계층입니다. 



http://scn.sap.com/community/oracle/blog/2013/06/17/oracle-myths-and-common-misconceptions-about-transparent-huge-pages-for-oracle-databases-on-linux-uncovered

http://software.intel.com/en-us/blogs/2013/07/09/transparent-huge-pages-on-intel-xeon-phi-coprocessors

http://seblog.mirr4u.com/651

반응형