şeffaf sargıları devre dışı bırak


63

SAP HANA'yı bir RAID makinesine kuruyoruz . Kurulum adımının bir parçası olarak,

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

Öyleyse, çalışma zamanı yerine, bunu kalıcı bir değişiklik yapmak istersem, yukarıdaki satırı /proc/vmstatdosyanın içine eklemeli miyim ?


2
Burada belirtilen çözümlerden bazılarını kullanıyorsanız, aynı zamanda 'ayarlı' çalışan bir sistemde, ayarlıların bu çözümleri geçersiz kılabileceğini unutmayın. Daha fazla bilgi için buraya bakın: bugzilla.redhat.com/show_bug.cgi?id=1189868
Dejay Clayton

Yanıtlar:


80

Bu kalıcı gibi seçenekler yapmak için genellikle bunları dosyaya eklersiniz /etc/sysctl.conf. Bu komutu kullanarak mevcut seçeneklerin tam bir listesini görebilirsiniz:

$ sysctl -a

Örnek

$ 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Çıktıda şöyle arayabilirsiniz :

$ 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

Orada değil?

Ancak çıktı üzerinden bakarken görmedim transparent_hugepage. Google Googling, bu konuyu tartışan bu Oracle sayfasına rastladım. Sayfa: Linux için HugePages'i Linux'ta Yapılandırma (x86-64) .

Özellikle o sayfada hugepage özelliğini nasıl devre dışı bırakacağını açıklar .

alıntı

Şeffaf HugePages'ı devre dışı bırakmak için tercih edilen yöntem, "/etc/grub.conf" dosyasındaki çekirdek önyükleme satırına "transparent_hugepage = never" eklemektir.

   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

Bunun etkili olması için sunucunun yeniden başlatılması gerekir.

Alternatif olarak, /etc/rc.localdosyayı dosyanıza ekleyebilirsiniz .

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

Sanırım 2. seçeneğe gideceğim, çünkü bir çekirdekten diğerine geçtiğinizde ilk üzülme riski altında olacak.

Yeniden başlattıktan sonra aşağıdaki komutla çalıştığını onaylayabilirsiniz:

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

7
Çoğu dağıtımda / etc / default / grub'ta bulunan / etc / default / grub içindeki GRUB_CMDLINE_LINUX_DEFAULT seçeneğine asla ekleyerek ilk seçeneğin çekirdek güncellemelerinde hayatta kalmasını sağlayabilirsiniz.
Rwky

2
Çıktısı ise cat /sys/kernel/mm/transparent_hugepage/enabledise [always] madvise never, o zaman durumudur alwaysya da (not etkin olduğunu []köşeli parantez içinde always)
ub3rst4r

4
Sarılma ve saydam sargıları birbirine karıştırmayın. İkincisi, sürekli olarak belleği birleştirmeye ve normal 4kB sayfaları çok büyük 2 MB sayfalara dönüştürmeye çalışırken, çoğu zaman yüksek CPU kullanımı gibi birçok soruna neden olabilir.
Marki555

2
@Rwky - Önerinize göre ince ayar yaparken - Dosyayı kaydettikten sonra bir sonraki eylemin sudo update-grub"taşla yazılmış" yeni ayarları elde etmek için yürütülmesi gerektiğini vurgularım . Grub dosya satırını işaret etmek için +1.
Faron,

2
EC2'dekiler için bir güncelleme olan cloudimg /etc/default/grub.d/50-cloudimg-settings.cfg dosyasını / etc / default / grub içindeki ayarları geçersiz kılan /etc/default/grub.d/ dosyasını ekler 99-transparent-hugepage.cfg içerikli GRUB_CMDLINE_LINUX_DEFAULT = "$ GRUB_CMDLINE_LINUX_DEFAULT transparent_hugepage = asla" bunu çözmeyecek.
Rwky

13

MariaDB için TokuDB'yi etkinleştirmek amacıyla CentOS v6'daki şeffaf sargıları devre dışı bırakmaya çalıştığım için bu soruyu eklemek istedim. @Slm tarafından belirtilen senaryoyu ekledim /etc/rc.localve şeffaf sargıları devre dışı bıraktı. Ancak, başlangıç ​​komut dosyalarının Linux'ta çalışması nedeniyle, /etc/rc.localtüm hizmetler başlatıldıktan sonra yürütülür. Bu nedenle, saydam büyük sayfalar, MariaDB'nin başlatılmasından ve TokuDB motorunun başlatılmasından sonra devre dışı bırakıldı. Şeffaf sargıları devre dışı bırakmanın tek yolu transparent_hugepage=neverçekirdek parametresine eklemektir .

@ Rwky'nin yorumunu fark ettim 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.ve CentOS'un /etc/default/grubdosyayı desteklemediğini ve transparent_hugepage=nevergüncellendiğinde çekirdek parametrelerinden kaybolma konusunda endişelendiğini öğrendim . Ancak endişelenmeyin, CentOS, çekirdek parametrelerinde yapılan değişiklikleri grubun içinde tutmak için kurulur, böylece güncellendiğinde saklanırlar.

Ayrıca, grub için çekirdek parametrelerini değiştirmenin uygun yolu da ile grubby. transparent_hugepage=neverHer çekirdeğe aşağıdakileri eklemek için bu basit betiği yarattım 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

Bunun gibi bir seçenek için muhtemelen / üzerine eklemeye çalışacağım / ekleyeceğim etc/sysctl.confçünkü bu, kutuya yüklenebilecek herhangi bir Çekirdeğe sürekli olarak uygulanacaktır.
slm

Sadece <code> / etc / default / grub </code> dosyasını değiştirirseniz, grub-mkconfiggrub için gerçek yapılandırma dosyasını oluşturmak için 'root' olarak çalıştırmanız gerektiğini eklemek istedim .
seattlegaucho

3
Bir EC2 ubuntu örneği için, çalışmasını sağlamak /etc/default/grub.d/50-cloudimg-settings.cfgyerine dosyayı değiştirmem /etc/default/grubgerekiyor.
zhengyue

CentOS 6.6 kullanıyorum. Değiştim /etc/rc.localama bu benim için çalışmıyor. Kök vakasını bana açıklar mısınız?
Sandeep Singh,

@ s.singh Dediğim gibi /etc/rc.local is executed after all the services are started, çekirdek düzeyinde devre dışı bırakılması gerekiyor
ub3rst4r

6

İşte kukla kullanarak bir uygulama:

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

Yukarıdakilerin hepsi benim için EC2 Ubuntu 16.04'te işe yaramadı, ama bu yaptı:

sudo apt install hugepages
sudo hugeadm --thp-never

4

Çekirdek hattı yana transparent_hugepage=neverKeşke devam etmediğini, (başarısız can sıkıcı MongoDB / günlükleri için hem) ihtiyacım olanı yarısını devre dışı bırakır systemdşimdi başlatma komut ama vardır: echo never | sudo tee /sys/kernel/mm/transparent_hugepage/enabled. Bu ya sistemctl önyükleme komut dosyasında (düzgün şekilde yapılandırıldığında /etc/systemd/system) ya da doğrudan cli'den olduğu gibi çalışır.


Talimatlarınızı "düzgün bir şekilde yapılandırılmış komut dosyası" ve her şeyin nasıl kurulacağını da içerecek şekilde genişletebilir misiniz? Resmi MongoDB talimatları docs.mongodb.org/manual/tutorial/transparent-huge-pages eski yolu gösterir, şimdi sistemd daha yaygın olsa da, bunu sistemli bir şekilde yapmak güzel olurdu.
ssasa

3

Redis durumunda, THP'yi devre dışı bırakmayı öneren bir uyarı da verir. Ancak hata raporunda da belirtildiği gibi , birçok dağıtım /etc/rc.localkonusunda hizmetler sonrası yürütüldü ve yeniden başlatılıncaya kadar bunlar üzerinde etkisi yok. Ayrıca sanallaştırılmış ortamlarda (örn. Digitalocean) GRUB ayarlarını kontrol edemediğinizi unutmayın.

Böyle durumlarda çözüm adanmış kullanmaktır init devre dışı bırakmak için komut şeffaf kocaman sayfaları olarak bu sayfayı ayarları tarafından, anlaşılacağı X-Start-Before. Örneğin, Redis için Debian init betiği:

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

Tam olarak aradığım şeydi.
nelaaro

2

Sayesinde github & PyYoshi
ben systemd için bu örneği bulundu

Dosyayı oluşturun

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

Bunu servis dosyasına ekle

[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

Debian / ubuntu kullanıcıları için

[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

Ardından hizmeti etkinleştirin

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

1

Sorunla karşılaşırsanız

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

sudo ile bile, aşağıdaki komutları deneyin:

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

Merhaba, Unix SE’e hoş geldiniz! Ayrıca, komutlarınızın ne yaptığını da açıklarsanız daha iyi olacağını unutmayın.
user259412

1

İşte Ansible için hızlı bir kesmek (için bir şablon yönetmeye gitmek istemiyorum /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 ve GRUB önyükleyicili SLES11 SP3'te, transparent_hugepage=neveristeğe bağlı çekirdek parametresi olan [YAST-bootloader-edit- satırını eklememiz gerekir. NOT: Bu araç dosyayı değiştirir /boot/grub/menu.lst.

Sadece bu değişikliği yaptıktan ve yeniden başlattıktan sonra THP'nin devre dışı bırakılmasına neden oldu.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.