투명한 거대한 페이지 비활성화


63

RAID 머신 에 SAP HANA를 설치하고 있습니다. 설치 단계의 일부로 다음과 같이 언급됩니다.

 To disable the usage of transparent hugepages set the kernel settings 
 at runtime with echo never > /sys/kernel/mm/transparent_hugepage/enabled 

따라서 런타임 대신 이것을 영구적으로 변경하려면 위의 행을 /proc/vmstat파일 안에 추가해야 합니까?


2
여기에 언급 된 일부 솔루션을 사용하는 경우 '조정'도 실행하는 시스템에서 tuned가 해당 솔루션을 대체 할 수 있습니다. 자세한 정보는 여기를 참조하십시오 : bugzilla.redhat.com/show_bug.cgi?id=1189868
Dejay Clayton

답변:


80

이와 같은 옵션을 영구적으로 만들려면 일반적으로 파일에 옵션을 추가합니다 /etc/sysctl.conf. 이 명령을 사용하여 사용 가능한 전체 옵션 목록을 볼 수 있습니다.

$ sysctl -a

$ sudo sysctl -a | head -5
kernel.sched_child_runs_first = 0
kernel.sched_min_granularity_ns = 6000000
kernel.sched_latency_ns = 18000000
kernel.sched_wakeup_granularity_ns = 3000000
kernel.sched_shares_ratelimit = 750000

hugepage출력에서 다음과 같이 찾을 수 있습니다 .

$ sudo sysctl -a | grep hugepage
vm.nr_hugepages = 0
vm.nr_hugepages_mempolicy = 0
vm.hugepages_treat_as_movable = 0
vm.nr_overcommit_hugepages = 0

없어요?

그러나 나는 출력을 통해 보지 못했다 transparent_hugepage. 좀 더 인터넷 검색을 통해이 주제에 대해 설명하는이 Oracle 페이지를 보았습니다. 페이지 제목 은 Linux에서 Oracle 용 HugePages 구성 (x86-64) 입니다.

특히 해당 페이지 에서 hugepage 기능비활성화하는 방법에 대해 언급합니다 .

발췌

Transparent HugePages를 비활성화하는 가장 좋은 방법은 "/etc/grub.conf"파일의 커널 부트 라인에 "transparent_hugepage = never"를 추가하는 것입니다.

   title Oracle Linux Server (2.6.39-400.24.1.el6uek.x86_64)
            root (hd0,0)
            kernel /vmlinuz-2.6.39-400.24.1.el6uek.x86_64 ro root=/dev/mapper/vg_ol6112-lv_root rd_NO_LUKS  KEYBOARDTYPE=pc KEYTABLE=uk
    LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16  rd_NO_DM rd_LVM_LV=vg_ol6112/lv_swap rd_LVM_LV=vg_ol6112/lv_root rhgb quiet numa=off
    transparent_hugepage=never
            initrd /initramfs-2.6.39-400.24.1.el6uek.x86_64.img

이를 적용하려면 서버를 재부팅해야합니다.

또는 /etc/rc.local파일에 명령을 추가 할 수 있습니다 .

if test -f /sys/kernel/mm/transparent_hugepage/enabled; then
   echo never > /sys/kernel/mm/transparent_hugepage/enabled
fi
if test -f /sys/kernel/mm/transparent_hugepage/defrag; then
   echo never > /sys/kernel/mm/transparent_hugepage/defrag
fi

하나의 커널에서 다음 커널로 업그레이드 할 때 첫 번째 옵션이 설정되지 않을 수 있으므로 두 번째 옵션을 사용한다고 생각합니다.

재부팅 후 다음 명령으로 작동했는지 확인할 수 있습니다.

$ cat /sys/kernel/mm/transparent_hugepage/enabled
always madvise [never]

7
대부분의 배포판에서 / etc / default / grub의 GRUB_CMDLINE_LINUX_DEFAULT 옵션에 transparent_hugepage = never를 추가하여 첫 번째 옵션이 커널 업데이트를 유지하도록 만들 수 있습니다.
Rwky

2
의 출력이 경우 cat /sys/kernel/mm/transparent_hugepage/enabled입니다 [always] madvise never, 상태이다 always되거나 (음 설정되어 있는지 []주위에 괄호 always)
ub3rst4r

4
hugepages와 transparent hugepages를 혼동하지 마십시오. 후자는 메모리를 조각 모음하고 일반 4kB 페이지를 큰 2MB 페이지로 변환하려고 시도하면서 주로 CPU 사용량이 많은 문제를 일으킬 수 있습니다.
Marki555

2
@Rwky-제안에 따라 조정할 때-파일을 저장 한 후 다음 작업을 강조 sudo update-grub하여 새 설정을 "돌로 작성"하는 것이 좋습니다. grub 파일 행을 가리키는 +1
Faron

2
EC2에 대한 업데이트 인 cloudimg는 /etc/default/grub.d/ 파일을 추가하는 /etc/default/grub.d/50-cloudimg-settings.cfg 파일을 추가합니다. GRUB_CMDLINE_LINUX_DEFAULT = "$ GRUB_CMDLINE_LINUX_DEFAULT transparent_hugepage = never"컨텐츠가있는 99-transparent-hugepage.cfg로 해결됩니다.
Rwky

13

TokuDB for MariaDB를 활성화하기 위해 CentOS v6에서 투명한 hugepages를 비활성화하려고 시도 하면서이 질문에 추가하고 싶었습니다. @slm에서 언급 한 스크립트를 추가하고 /etc/rc.local투명한 hugepages를 비활성화했습니다. 그러나 Linux에서 시작 스크립트가 작동하는 방식 때문에 /etc/rc.local모든 서비스가 시작된 후에 실행됩니다. 따라서 MariaDB가 이미 시작되고 TokuDB 엔진이 초기화되지 않은 후 투명한 대형 페이지가 비활성화되었습니다. 투명한 거대한 페이지를 비활성화하는 유일한 다른 방법 transparent_hugepage=never은 커널 매개 변수를 추가 하는 것입니다.

@Rwky의 의견 You can make the first option survive kernel updates by adding transparent_hugepage=never to the GRUB_CMDLINE_LINUX_DEFAULT option in /etc/default/grub on most distributions.을 발견하고 CentOS가 /etc/default/grub파일을 지원하지 않으며 transparent_hugepage=never업데이트 될 때 커널 매개 변수에서 사라질까 걱정 했습니다. 그러나 걱정할 필요는 없습니다. CentOS는 커널 매개 변수에 대한 변경 사항을 grub에 유지하도록 설정되어 있으므로 업데이트 될 때 유지됩니다.

또한 grub의 커널 매개 변수를 수정하는 올바른 방법은입니다 grubby. 이 간단한 스크립트를 작성 transparent_hugepage=never하여 각 커널에 grubby다음 을 추가 했습니다 .

#!/bin/sh

if [[ $EUID -ne 0 ]]; then
   echo "This script must be run as root" 1>&2
   exit 1
fi

for KERNEL in /boot/vmlinuz-*; do
    grubby --update-kernel="$KERNEL" --args='transparent_hugepage=never'
done

이와 같은 옵션의 etc/sysctl.conf경우 상자에 설치할 수있는 모든 커널에 일관되게 적용되므로 여전히 /에 추가하려고 시도 합니다.
slm

<code> / etc / default / grub </ code> 파일을 수정하는 경우 grub grub-mkconfig의 실제 구성 파일을 생성하려면 'root'로 실행해야한다고 덧붙였습니다.
seattlegaucho

3
EC2 우분투 인스턴스의 경우 /etc/default/grub.d/50-cloudimg-settings.cfg파일 을 수정 하지 않고 파일 을 수정 /etc/default/grub해야합니다.
zhengyue

CentOS 6.6을 사용하고 있습니다. 나는 수정 /etc/rc.local했지만 그것은 나를 위해 작동하지 않습니다. 근본 사례를 설명해 주시겠습니까?
Sandeep Singh

@ s.singh 내가 말했듯 /etc/rc.local is executed after all the services are started이 커널 수준에서 비활성화해야합니다
ub3rst4r

6

꼭두각시를 사용한 구현은 다음과 같습니다.

exec { "disable_transparent_hugepage_enabled":
  command => "/bin/echo never > /sys/kernel/mm/transparent_hugepage/enabled",
  unless  => "/bin/grep -c '\[never\]' /sys/kernel/mm/transparent_hugepage/enabled 2>/dev/null",
}

exec { "disable_transparent_hugepage_defrag":
  command => "/bin/echo never > /sys/kernel/mm/transparent_hugepage/defrag",
  unless  => "/bin/grep -c '\[never\]' /sys/kernel/mm/transparent_hugepage/defrag 2>/dev/null",
}

6

위의 모든 것이 EC2 Ubuntu 16.04에서 작동하지 않았지만 다음과 같이 작동했습니다.

sudo apt install hugepages
sudo hugeadm --thp-never

4

커널 라인 transparent_hugepage=never은 내가 필요로하는 것 (성가신 mongodb 실패 / 로그 모두)의 절반 만 비활성화 하기 때문에 systemd시작 스크립트를 통해 지속되지 않았지만 이제는 다음을 갖습니다 echo never | sudo tee /sys/kernel/mm/transparent_hugepage/enabled. 이는 systemctl 부팅 스크립트 (에서 올바르게 구성한 경우 /etc/systemd/system) 또는 cli에서 그대로 작동합니다 .


"올바로 구성된 스크립트"및 모든 설정 방법 단계를 포함하도록 지시 사항을 확장 할 수 있습니까? 공식 MongoDB 지침 docs.mongodb.org/manual/tutorial/transparent-huge-pages 는 옛날 방식을 보여줍니다. 이제 systemd가 더 일반적이지만 systemd 방식으로 사용하는 것이 좋습니다.
ssasa

3

Redis의 경우 THP를 비활성화하라는 경고 메시지도 표시됩니다. 그러나 버그 보고서 에서 언급했듯이 많은 배포판에서 /etc/rc.local서비스 후에 실행되며 다시 시작할 때까지 영향을 미치지 않습니다. 또한 가상화 된 환경 (예 : Digitalocean)에서는 GRUB 설정을 제어 할 수 없습니다.

이 경우 해결책은 전용 init 스크립트를 사용 하여이 페이지에서 제안한 대로 투명한 대형 페이지 를 비활성화 하는 것 입니다. 예를 들어 Redis 용 Debian init 스크립트는 다음과 같습니다.X-Start-Before

#!/bin/bash
### BEGIN INIT INFO
# Provides:          disable-thp
# Required-Start:    $local_fs
# Required-Stop:
# X-Start-Before:    redis-server
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Disable THP
# Description:       disables Transparent Huge Pages (THP) on boot
### END INIT INFO

case $1 in
start)
  if [ -d /sys/kernel/mm/transparent_hugepage ]; then
    echo 'never' > /sys/kernel/mm/transparent_hugepage/enabled
    echo 'never' > /sys/kernel/mm/transparent_hugepage/defrag
  else
    return 0
  fi
;;
esac 

정확히 내가 찾던 것.
nelaaro

2

github & PyYoshi 덕분
에 systemd에 대한이 예제를 찾았습니다.

파일 만들기

sudo vim /etc/systemd/system/disable-transparent-huge-pages.service

이것을 서비스 파일에 넣으십시오

[Unit]
Description=Disable Transparent Huge Pages

[Service]
Type=oneshot
ExecStart=/usr/bin/sh -c "/usr/bin/echo "never" | tee /sys/kernel/mm/transparent_hugepage/enabled"
ExecStart=/usr/bin/sh -c "/usr/bin/echo "never" | tee /sys/kernel/mm/transparent_hugepage/defrag"

[Install]
WantedBy=multi-user.target

데비안 / 우분투 사용자

[Unit]
Description=Disable Transparent Huge Pages

[Service]
Type=oneshot
ExecStart=/bin/sh -c "/usr/bin/echo "never" | tee /sys/kernel/mm/transparent_hugepage/enabled"
ExecStart=/bin/sh -c "/usr/bin/echo "never" | tee /sys/kernel/mm/transparent_hugepage/defrag"

[Install]
WantedBy=multi-user.target

그런 다음 서비스를 활성화하십시오

systemctl enable disable-transparent-huge-pages
systemctl start disable-transparent-huge-pages
systemctl status disable-transparent-huge-pages

1

문제가 발생하면

-bash: /sys/kernel/mm/transparent_hugepage/khugepaged/defrag: Permission denied

sudo를 사용하더라도 아래 명령을 시도하십시오.

sudo /bin/bash -c 'echo never > /sys/kernel/mm/transparent_hugepage/enabled'
sudo /bin/bash -c 'echo never > /sys/kernel/mm/transparent_hugepage/defrag'

안녕하세요, 유닉스 SE에 오신 것을 환영합니다! 명령이 수행하는 작업을 설명하면 훨씬 좋습니다.
user259412

1

Ansible에 대한 빠른 해킹은 다음과 같습니다 (의 템플릿을 관리하고 싶지 않습니다 /etc/rc.local).

- name: Disable Transparent Huge Pages at boot
  lineinfile:
    dest: /etc/rc.local
    line: "if [ -d /sys/kernel/mm/transparent_hugepage ]; then echo 'never' > /sys/kernel/mm/transparent_hugepage/enabled ; echo 'never' > /sys/kernel/mm/transparent_hugepage/defrag ; fi"
  register: transparent_hugepage
- name: Disable disabled rc.local
  lineinfile:
    dest: /etc/rc.local
    line: 'exit 0'
    state: absent
- name: Disable Transparent Huge Pages at run time 1/2
  command: echo never > /sys/kernel/mm/transparent_hugepage/defrag
  when: transparent_hugepage|changed
- name: Disable Transparent Huge Pages at run time 2/2
  command: echo never > /sys/kernel/mm/transparent_hugepage/enabled
  when: transparent_hugepage|changed

0

YAST 및 GRUB 부트 로더가있는 SLES11 SP3에서는 [YAST transparent_hugepage=never-bootloader-edit-line with optional kernel parameter] 를 추가해야합니다 . 참고 : 이 도구는 파일을 변경합니다 /boot/grub/menu.lst.

이 변경을 수행하고 재부팅 한 후에 만 ​​THP가 비활성화되었습니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.