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

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파일 안에 추가해야 합니까?



답변

이와 같은 옵션을 영구적으로 만들려면 일반적으로 파일에 옵션을 추가합니다 /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]


답변

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


답변

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

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",
}


답변

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

sudo apt install hugepages
sudo hugeadm --thp-never


답변

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


답변

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


답변

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