nonaktifkan hugepage transparan

63

Kami menginstal SAP HANA di mesin RAID . Sebagai bagian dari langkah instalasi, disebutkan bahwa,

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

Jadi alih-alih runtime, jika saya ingin membuat ini perubahan permanen, haruskah saya menambahkan baris di dalam /proc/vmstatfile?

Ramesh
sumber
2
Perhatikan bahwa jika Anda menggunakan beberapa solusi yang disebutkan di sini, pada sistem yang juga menjalankan 'tuned', tuned dapat menimpa solusi tersebut. Lihat di sini untuk info lebih lanjut: bugzilla.redhat.com/show_bug.cgi?id=1189868
Dejay Clayton

Jawaban:

80

Untuk membuat opsi seperti ini permanen, Anda biasanya akan menambahkannya ke file /etc/sysctl.conf. Anda dapat melihat daftar lengkap opsi yang tersedia menggunakan perintah ini:

$ sysctl -a

Contoh

$ 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

Anda dapat mencari hugepagedalam output seperti ini:

$ 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

Itu tidak ada di sana?

Namun melihat melalui output saya tidak melihat transparent_hugepage. Googling sedikit lagi saya menemukan halaman Oracle ini yang membahas topik ini. Halaman tersebut berjudul: Mengkonfigurasi HugePages untuk Oracle di Linux (x86-64) .

Khususnya pada halaman itu mereka menyebutkan cara menonaktifkan fitur hugepage .

kutipan

Metode yang lebih disukai untuk menonaktifkan Transparent HugePages adalah dengan menambahkan "transparent_hugepage = never" ke baris boot kernel di file "/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

Server harus di-boot ulang agar ini berlaku.

Atau Anda dapat menambahkan perintah ke /etc/rc.localfile Anda .

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

Saya pikir saya akan memilih opsi ke-2, karena yang pertama akan beresiko menjadi tidak disetel ketika Anda meningkatkan dari satu kernel ke kernel berikutnya.

Anda dapat mengkonfirmasi bahwa itu berhasil dengan perintah berikut setelah reboot

$ cat /sys/kernel/mm/transparent_hugepage/enabled
always madvise [never]
slm
sumber
7
Anda dapat membuat opsi pertama selamat dari pembaruan kernel dengan menambahkan transparent_hugepage = tidak pernah ke opsi GRUB_CMDLINE_LINUX_DEFAULT di / etc / default / grub pada sebagian besar distribusi.
Rwky
2
Jika outputnya cat /sys/kernel/mm/transparent_hugepage/enabledadalah [always] madvise never, maka statusnya alwaysatau itu diaktifkan (perhatikan []tanda kurung di sekitar always)
ub3rst4r
4
Jangan bingung hugepage dan hugepage transparan. Yang terakhir dapat menyebabkan banyak masalah, terutama penggunaan CPU yang tinggi sambil terus mencoba defragment memori dan mengkonversi halaman 4kB normal menjadi halaman 2MB besar.
Marki555
2
@Rwky - ketika mengutak-atik sesuai saran Anda - Saya akan menekankan tindakan selanjutnya setelah menyimpan file adalah untuk mengeksekusi sudo update-grubuntuk mendapatkan pengaturan baru "ditulis dalam batu". +1 untuk menunjuk baris file grub.
Faron
2
Pembaruan untuk mereka yang menggunakan EC2, cloudimg menambahkan file /etc/default/grub.d/50-cloudimg-settings.cfg yang mengabaikan pengaturan di / etc / default / grub menambahkan file /etc/default/grub.d/ 99-transparent-hugepage.cfg dengan konten GRUB_CMDLINE_LINUX_DEFAULT = "$ GRUB_CMDLINE_LINUX_DEFAULT transparent_hugepage = never" akan menyelesaikan masalah ini.
Rwky
13

Saya hanya ingin menambahkan pertanyaan ini karena saya mencoba untuk menonaktifkan hugepages transparan pada CentOS v6 untuk mengaktifkan TokuDB untuk MariaDB. Saya menambahkan script yang disebutkan oleh @slm ke /etc/rc.localdan menonaktifkan hugepages transparan. Namun, karena cara skrip startup bekerja di Linux, /etc/rc.localdijalankan setelah semua layanan dimulai. Oleh karena itu, halaman besar transparan sedang dinonaktifkan setelah MariaDB sudah dimulai dan mesin TokuDB tidak akan menginisialisasi. Satu-satunya cara lain untuk menonaktifkan hugepages transparan adalah dengan menambahkan transparent_hugepage=neverke parameter kernel.

Saya perhatikan komentar @ 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.dan menemukan bahwa CentOS tidak mendukung /etc/default/grubfile dan khawatir akan transparent_hugepage=nevermenghilang dari parameter kernel ketika diperbarui. Tetapi tidak perlu khawatir, CentOS diatur untuk menjaga setiap perubahan yang dilakukan pada parameter kernel di grub sehingga ketika diperbarui mereka disimpan.

Untuk menambahkan, cara yang tepat untuk memodifikasi parameter kernel untuk grub adalah dengan grubby. Saya membuat skrip sederhana ini untuk ditambahkan transparent_hugepage=neverke setiap kernel dengan 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
ub3rst4r
sumber
Untuk opsi seperti ini, saya mungkin masih akan mencoba dan menambahkannya ke / etc/sysctl.confkarena itu akan secara konsisten diterapkan pada Kernel yang mungkin pernah diinstal pada kotak.
slm
Saya hanya ingin menambahkan bahwa jika Anda memodifikasi file <code> / etc / default / grub </code>, Anda perlu menjalankan grub-mkconfigsebagai 'root' untuk menghasilkan file konfigurasi aktual untuk grub.
seattlegaucho
3
Untuk instance ubuntu EC2, saya harus memodifikasi /etc/default/grub.d/50-cloudimg-settings.cfgfile alih-alih /etc/default/grubmembuatnya berfungsi.
zhengyue
Saya menggunakan CentOS 6.6. Saya telah memodifikasi /etc/rc.localtetapi tidak berfungsi untuk saya. Bisakah Anda jelaskan kasus root kepada saya.
Sandeep Singh
@ s.singh Seperti yang saya nyatakan /etc/rc.local is executed after all the services are startedjadi itu harus dinonaktifkan pada tingkat kernel
ub3rst4r
6

Berikut ini adalah implementasi menggunakan boneka:

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",
}
J Maurer
sumber
6

Semua hal di atas tidak berhasil bagi saya di EC2 Ubuntu 16.04, tetapi ini berhasil:

sudo apt install hugepages
sudo hugeadm --thp-never
Legel
sumber
4

Karena garis kernel transparent_hugepage=neverhanya menonaktifkan setengah dari apa yang saya butuhkan (baik, karena gagal mongodb mengganggu / log), bahwa saya tidak bertahan melalui systemdskrip startup tapi sekarang memiliki: echo never | sudo tee /sys/kernel/mm/transparent_hugepage/enabled. Itu bekerja di salah satu skrip boot systemctl (bila dikonfigurasi dengan benar satu di /etc/systemd/system) atau langsung dari cli apa adanya.

Rob Jens
sumber
Bisakah Anda memperluas instruksi Anda untuk juga memasukkan "skrip yang dikonfigurasi dengan benar" dan langkah-langkah cara mengatur semuanya? Instruksi MongoDB resmi docs.mongodb.org/manual/tutorial/transparent-huge-pages menunjukkan cara lama, sementara sekarang systemd lebih umum, akan lebih baik untuk memiliki ini dengan cara systemd.
ssasa
3

Dalam kasus Redis, itu juga mengeluarkan peringatan yang menyarankan untuk menonaktifkan THP. Tetapi seperti yang disebutkan dalam laporan bug , pada banyak distro /etc/rc.localdieksekusi setelah layanan dan tidak berpengaruh pada mereka sampai mereka me-restart. Perhatikan juga bahwa di lingkungan tervirtualisasi (misalnya Digitalocean) Anda tidak dapat mengontrol pengaturan GRUB.

Solusi dalam kasus ini adalah menggunakan skrip init khusus untuk menonaktifkan halaman besar transparan seperti halaman ini menyarankan, dengan pengaturan X-Start-Before. Misalnya, skrip init Debian untuk 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 
saaj
sumber
Persis apa yang saya cari.
nelaaro
2

Berkat github & PyYoshi
saya menemukan contoh ini untuk systemd

Buat file

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

Masukkan ini ke dalam file layanan

[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

Untuk pengguna debian / ubuntu

[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

Kemudian aktifkan layanan

systemctl enable disable-transparent-huge-pages
systemctl start disable-transparent-huge-pages
systemctl status disable-transparent-huge-pages
nelaaro
sumber
1

Jika Anda menemui masalah

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

bahkan dengan sudo, coba perintah di bawah ini:

sudo /bin/bash -c 'echo never > /sys/kernel/mm/transparent_hugepage/enabled'
sudo /bin/bash -c 'echo never > /sys/kernel/mm/transparent_hugepage/defrag'
Qiang Du
sumber
Hai, selamat datang di Unix SE! Catatan, akan jauh lebih baik jika Anda juga menjelaskan, apa perintah Anda lakukan.
user259412
1

Ini adalah hack cepat untuk Ansible (Saya tidak ingin mengelola template untuk /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
dannyman
sumber
0

Dalam SLES11 SP3 dengan YAST dan GRUB bootloader kita harus menambahkan transparent_hugepage=never[YAST-bootloader-edit-line dengan parameter kernel opsional]. CATATAN: Alat ini mengubah file /boot/grub/menu.lst.

Hanya setelah melakukan perubahan dan reboot ini menghasilkan penonaktifan THP.

Detlef
sumber