ปิดใช้งาน hugepages แบบโปร่งใส


63

เรากำลังติดตั้ง SAP HANA ในเครื่องRAID เป็นส่วนหนึ่งของขั้นตอนการติดตั้งจะกล่าวถึงว่า

 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
โปรดทราบว่าหากคุณใช้วิธีแก้ไขปัญหาบางอย่างที่กล่าวถึงที่นี่ในระบบที่ใช้ 'ปรับ' การปรับอาจปรับแก้ปัญหาเหล่านั้นได้ ดูที่นี่สำหรับข้อมูลเพิ่มเติม: 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อย่างไรก็ตามการมองผ่านการส่งออกผมไม่ได้เห็น Googling อีกเล็กน้อยฉันเจอหน้า Oracle นี้ซึ่งกล่าวถึงหัวข้อนี้มาก หน้ามีบรรดาศักดิ์: HugePages การกำหนดค่าสำหรับ Oracle บน Linux (x86-64)

โดยเฉพาะในหน้านั้นพวกเขาพูดถึงวิธีการปิดใช้งานคุณลักษณะ hugepage

สิ่งที่สกัดมา

วิธีที่ต้องการเพื่อปิดการใช้งาน Huge HugePages คือการเพิ่ม "transparent_hugepage = never" ลงในบรรทัดการบูตเคอร์เนลในไฟล์ "/etc/grub.conf"

   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

ฉันคิดว่าฉันจะไปกับตัวเลือกที่ 2 ตั้งแต่แรกจะมีความเสี่ยงของการได้รับการตั้งค่าเมื่อคุณอัพเกรดจากเคอร์เนลหนึ่งไปยังอีก

คุณสามารถยืนยันได้ว่ามันทำงานกับคำสั่งต่อไปนี้หลังจากรีบูตเครื่อง:

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

7
คุณสามารถทำให้ตัวเลือกแรกอยู่รอดได้การอัพเดตเคอร์เนลโดยการเพิ่ม transparent_hugepage = ไม่เคยไปที่ตัวเลือก GRUB_CMDLINE_LINUX_DEFAULT ใน / etc / default / grub จากการกระจายส่วนใหญ่
Rwky

2
หากการส่งออกของcat /sys/kernel/mm/transparent_hugepage/enabledคือ[always] madvise neverแล้วสถานะคือalwaysหรือว่ามันถูกเปิดใช้งาน (หมายเหตุ[]วงเล็บรอบalways)
ub3rst4r

4
อย่าสับสน hugepages และ hugepages โปร่งใส หลังอาจทำให้เกิดปัญหามากมายส่วนใหญ่ใช้งาน CPU สูงในขณะที่พยายามจัดเรียงข้อมูลหน่วยความจำอย่างต่อเนื่องและแปลงหน้า 4kB ปกติเป็นหน้า 2MB ขนาดใหญ่
Marki555

2
@Rwky - เมื่อปรับแต่งตามคำแนะนำของคุณ - ฉันจะเน้นการกระทำต่อไปหลังจากบันทึกไฟล์คือการดำเนินการsudo update-grubเพื่อรับการตั้งค่าใหม่ "เขียนในหิน" +1 สำหรับการชี้บรรทัดไฟล์ด้วง
Faron

2
การอัพเดตสำหรับ EC2 นั้น cloudimg เพิ่มไฟล์ /etc/default/grub.d/50-cloudimg-settings.cfg ซึ่งจะแทนที่การตั้งค่าใน / etc / default / grub การเพิ่มไฟล์ /etc/default/grub.d/ 99-transparent-hugepage.cfg ที่มีเนื้อหา GRUB_CMDLINE_LINUX_DEFAULT = "$ GRUB_CMDLINE_LINUX_DEFAULT transparent_hugepage = ไม่เคย" จะแก้ปัญหานี้
Rwky

13

ฉันแค่อยากจะเพิ่มคำถามนี้เนื่องจากฉันพยายามปิดการใช้งาน hugepages แบบโปร่งใสบน CentOS v6 เพื่อเปิดใช้งาน TokuDB สำหรับ MariaDB ฉันเพิ่มสคริปต์ที่กล่าวถึงโดย @slm ไป/etc/rc.localและปิดใช้งาน hugepages แบบโปร่งใส อย่างไรก็ตามเนื่องจากวิธีการที่สคริปต์เริ่มต้นทำงานใน Linux /etc/rc.localจะถูกดำเนินการหลังจากเริ่มบริการทั้งหมด ดังนั้นเพจขนาดใหญ่ที่โปร่งใสถูกปิดใช้งานหลังจาก MariaDB เริ่มทำงานแล้วและเครื่องมือ TokuDB จะไม่เริ่มต้น อีกวิธีหนึ่งในการปิดใช้งาน hugepages แบบโปร่งใสคือการเพิ่ม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 จะตั้งค่าเพื่อให้การเปลี่ยนแปลงใด ๆ ที่ทำกับพารามิเตอร์เคอร์เนลในด้วงดังนั้นเมื่อมีการปรับปรุงพวกเขาจะถูกเก็บไว้

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-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 ล้มเหลว / logs) ที่ฉันไม่ได้ยังคงมีอยู่ผ่าน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 แต่ดังที่ระบุไว้ในรายงานข้อผิดพลาดในหลาย distros /etc/rc.localจะดำเนินการหลังจากการบริการและจะไม่มีผลกับพวกเขาจนกว่าพวกเขาจะเริ่มต้นใหม่ โปรดทราบว่าในสภาพแวดล้อมเสมือนจริง (เช่น Digitalocean) คุณไม่สามารถควบคุมการตั้งค่า GRUB ได้

วิธีการแก้ปัญหาในกรณีดังกล่าวคือการใช้เฉพาะinitสคริปต์เพื่อปิดการใช้งานหน้าขนาดใหญ่โปร่งใสเป็นหน้านี้X-Start-Beforeแสดงให้เห็นโดยการตั้งค่า ตัวอย่างเช่นสคริปต์เริ่มต้น Debian สำหรับ Redis:

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

สวัสดียินดีต้อนรับสู่ Unix 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

ใน SLES11 SP3 พร้อม YAST และ GRUB bootloader เราต้องเพิ่มtransparent_hugepage=neverใน [YAST-bootloader-edit- line พร้อมพารามิเตอร์เคอร์เนลเสริม] หมายเหตุ:/boot/grub/menu.lstเครื่องมือนี้จะเปลี่ยนไฟล์

หลังจากทำการเปลี่ยนแปลงและรีบูตแล้วจะส่งผลให้ปิดใช้งาน THP


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.