투명 거대 페이지 비활성화

투명 거대 페이지 비활성화

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

답변1

이러한 옵션을 영구적으로 만들려면 일반적으로 해당 옵션을 파일에 추가합니다 /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(x86-64)에서 Oracle용 대용량 페이지 구성.

특히 해당 페이지에서 그들은 방법을 언급합니다.큰 페이지 기능 비활성화.

발췌

투명 거대 페이지를 비활성화하는 가장 좋은 방법은 "/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]

답변2

MariaDB용 TokuDB를 활성화하기 위해 CentOS v6에서 투명한 hugepage를 비활성화하려고 할 때 이 질문에 추가하고 싶었습니다. /etc/rc.local투명한 hugepages를 비활성화하는 @slm에서 언급한 스크립트를 추가했습니다 . 그러나 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=nevergrubby

#!/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

답변3

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

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

답변4

감사해요깃허브&피 요시
이 시스템 예제를 찾았습니다.

파일 만들기

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

관련 정보