“/ Sys / kernel / mm / transparent_hugepage / enable” nasıl değiştirebilirim


50

Mongodb 3.0 kullanıyorum ve bir uyarı buluyorum:

MongoDB shell version: 3.0.0
connecting to: test
Server has startup warnings: 
2015-03-13T16:28:29.405+0800 I CONTROL  [initandlisten] 
2015-03-13T16:28:29.406+0800 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'.
2015-03-13T16:28:29.406+0800 I CONTROL  [initandlisten] **        We suggest setting it to 'never'
2015-03-13T16:28:29.406+0800 I CONTROL  [initandlisten] 
2015-03-13T16:28:29.407+0800 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'.
2015-03-13T16:28:29.407+0800 I CONTROL  [initandlisten] **        We suggest setting it to 'never'
2015-03-13T16:28:29.407+0800 I CONTROL  [initandlisten]

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

~# cat /sys/kernel/mm/transparent_hugepage/defrag
[always] madvise never

Eko kullanmaya çalışıyorum ama kalıcı değil, yeniden başlattıktan sonra sıfırlanacak.

echo never > /sys/kernel/mm/transparent_hugepage/defrag

/sys/kernel/mm/transparent_hugepage/enabledKalıcı olarak nasıl değişiklik yapabilirim ?


1
Aşağıda iyi cevaplar olabilir, ancak IMO, MongoDB'nin
hgoebl

Yanıtlar:


70

Yapabilirsin

  1. sysfsutilspaketi kurun :

    sudo apt install sysfsutils
    
  2. ve bu ayara sahip bir satır ekleyin /etc/sysfs.conf:

    kernel/mm/transparent_hugepage/enabled = never
    

Bu en temiz çözümdür, çünkü özel başlatma komut dosyalarına güvenmek yerine tüm sysfs yapılandırmasını tek bir yerde tutar. Kodlar ve koşullu ifadelerle birlikte diğer cevaplar, çekirdeğin bu yolu göstereceğini bilmiyorsanız, yani etkilenen makinede çalışan çekirdek sürümü hakkında kabaca bir fikriniz bile yoksa, uygun olur.


4
Bu benim için Ubuntu 14.04'te bir AWS EC2 örneğinde hiçbir şey yapmadı. Sysfs.conf hakkında pek bir şey bilmiyorum ama Ubuntu destekli bir yapılandırma gibi görünüyor, ancak dosya sistemimizde daha önce mevcut değildi ve eklemek ve yeniden başlatmak, mongo çıktı uyarılarını hiç değiştirmedi. Ayrıca clayzermk1'in tavsiyesini aşağıda denedik, 'dolandırmak' uyarısı hala göründü. Resmi mongo docs init betiği her iki uyarıyı da kaldırmıştı.
Neek

Çıktı nedir cat /sys/kernel/mm/transparent_hugepage/enabled? Hiç var mı? sysfs.confnormalde açılışta tarafından değerlendirilir /etc/init.d/sysutils. Etkinleştirilmiş mi? Ne zaman çağırırsın /etc/init.d/sysutils start?
David Foerster

3
Ayrıca dosyam yok sysfs.confve /etc/init.d/sysutils. ubuntu 16.04
HEX

1
@ unhammer: Hayır, ikisinin farklı bir kapsamı var. sysctlçekirdek parametreleriyle de yapabileceğiniz ayarlar içindir; sysfs.confgirişleri içindir /sys.
David Foerster

1
@navossoc: Yeni veya takip eden bir sorunuz varsa, lütfen yeni bir soru açar mısınız? Yorum bölümü uygun değil veya yeni sorular veya genişletilmiş tartışmalar için tasarlandı. Dikkatimi çekmek için bana bir bildirim göndererek bir yorum gönderebilirsiniz. Teşekkürler.
David Foerster

25

MongoDB dokümanlarının birkaç önerisi var. http://docs.mongodb.org/manual/reference/transparent-huge-pages/

"Tercih edilen" yolu düzenlemektir /etc/default/grubve eklemek transparent_hugepage=neveriçin GRUB_CMDLINE_LINUX_DEFAULTdaha sonra çalıştırmak update-grubGRUB yapılandırması yeniden inşa etmek.

Aşağıdaki iki gömlek sadece bunu yapacak. Çıktıyı doğruladığınızdan emin olun!

sed -r 's/GRUB_CMDLINE_LINUX_DEFAULT="[a-zA-Z0-9_= ]*/& transparent_hugepage=never/' /etc/default/grub | sudo tee /etc/default/grub
sudo update-grub

Bunun update-grubiçin bir sarmalayıcı olduğunu unutmayın grub-mkconfig. grub-mkconfiggirişleri pataklayacak /etc/default/grubgelenler ile /etc/default/grub.d/*. Şans eseri AWS'de çalışıyorsanız, bunun yerine düzenlemeniz gerekir /etc/default/grub.d/50-cloudimg-settings.cfg.

"Alternate" yöntemi, /etc/rc.localönce aşağıdakileri düzenlemek ve eklemek içindir exit 0:

if test -f /sys/kernel/mm/transparent_hugepage/khugepaged/defrag; then
  echo 0 > /sys/kernel/mm/transparent_hugepage/khugepaged/defrag
fi
if test -f /sys/kernel/mm/transparent_hugepage/defrag; then
  echo never > /sys/kernel/mm/transparent_hugepage/defrag
fi
if test -f /sys/kernel/mm/transparent_hugepage/enabled; then
  echo never > /sys/kernel/mm/transparent_hugepage/enabled
fi

Şahsen, birbirini dışlayan olmadıkları için hem "tercih edilen" hem de "alternatif" yöntemlerle uğraştım ve dolandırmayla ilgili uyarıyı ortadan kaldırdım.

* Benim için Ubuntu 14.04, MongoDB 3.0.2 ve AWS'de çalıştı.


Bunu DigitalOcean'daki tek tıklamayla MongoDB uygulama sunucumda denedim ve işe yaramadı. Yine aynı uyarı mesajını alıyorum.
scaryguy

EC2 ve yaklaşık parçası için teşekkür ederiz50-cloudimg-settings.cfg
Martin Konecny

16

İşte AWS EC2'de Ubuntu 16.04 üzerinde çalışmak üzere test edilmiş bir çözüm. Ubuntu 16.04, systemd init sistemini kullanır ve bu config dosyası, MongoDB başlatılmadan önce bu ayarların değiştirilmesi gerektiğini ifade eder.

Adında bir dosya oluşturun /etc/systemd/system/mongodb-hugepage-fix.serviceve aşağıdaki içeriği ekleyin:

[Unit]
Description="Disable Transparent Hugepage before MongoDB boots"
#WARN: check service name on your system
# If you are using MongoDB Cloud, service name is "mongodb-mms-automation-agent.service"
Before=mongodb.service      

[Service]
Type=oneshot
ExecStart=/bin/bash -c 'echo never > /sys/kernel/mm/transparent_hugepage/enabled'
ExecStart=/bin/bash -c 'echo never > /sys/kernel/mm/transparent_hugepage/defrag'

[Install]
#WARN: check service name on your system
# If you are using MongoDB Cloud, service name is "mongodb-mms-automation-agent.service"
RequiredBy=mongodb.service

Dosyayı sisteme yüklemek için:

systemctl daemon-reload

Dosyayı MongoDB’nin önyükleme zamanı bağımlılığı olarak etkinleştirmek için

systemctl enable mongodb-hugepage-fix

Değişiklikleri hemen etkinleştirmek istiyorsanız (bir sonraki önyüklemeden önce)

systemctl start mongodb-hugepage-fix
systemctl restart mongod

Bu çözüm, systemd yerine Upstart init çözümünü kullanan Ubuntu 14.04 için uygun değildir .


1
Sistem düzeltmesi modern MongoDB kurulumları için mükemmel, teşekkür ederim.
four43

7

Aşağıdaki satırları /etc/rc.local içine ekleyin.

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

Sunucuyu yeniden başlattığınızda bu çalışır.


1
Bununla ilgili bir yapılandırma dosyası var mı? rc.localiyi bir fikir değil, çünkü rc.local sistemin başlangıcında çalıştırılacak. Bu yüzden mongodb servisi hala varsayılan ayarı kullanacaktır.
Feng Yu

2
/ etc / default / grub dosyasını düzenleyin ve "GRUB_CMDLINE_LINUX_DEFAULT =" transparent_hugepage = never "satırında değişiklik yapın ve update-grub komutunu çalıştırın, ardından sunucuyu yeniden başlatın
PKumar

2
Teşekkürler, işe yarıyor. Ancak, değiştirmenin benzer bir yolu var /sys/kernel/mm/transparent_hugepage/defragmı? Yeniden başlattığımda, mongo kabuğu da "** UYARI: / sys / çekirdek / mm / transparent_hugepage / defrag" her zaman "demiştir.
Feng Yu


0

GRUB yükseltme işleminden sonra değişecek ve rc.local sadece mongo başlatıldıktan sonra çalışacak, bu yüzden belki rc.local'in sonuna yeniden hizmet mongo yeniden başlatmalıyız.

eğer -f / sys / kernel / mm / transparent_hugepage / etkinse; sonra
  yankı asla> / sys / çekirdek / mm / transparent_hugepage / etkin
fi

eğer test -f / sys / kernel / mm / transparent_hugepage / defrag; sonra
   yankı asla> / sys / çekirdek / mm / transparent_hugepage / defrag
fi

bekleyin 1 && servie mongod yeniden başlatma

veya belki de birisi başarıyla Ubuntu 14.04'te init betiğine yukarıdaki satırları ekledi?


0

Ansible ile makineleri dağıttığımızdan, rc dosyalarını değiştirmekten hoşlanmıyorum.

Ben kullanarak denedi sysfsutils/ sysfs.confama hızlı (veya yavaş makinelerde) üzerine hizmet başlatırken sorunları zamanlama koştu. Bazen mongod sysfsutils'den önce başlatılmış gibi görünüyordu. Bazen işe yaradı, bazen işe yaramadı.

Mongod başlangıçta bir işlem olduğundan, en temiz çözümün dosyayı /etc/mongo_vm_settings.confaşağıdaki içerikle eklemek olduğunu buldum :

# Ubuntu upstart file at /etc/init/mongod_vm_settings.conf
#
#   This file will set the correct kernel VM settings for MongoDB
#   This file is maintained in Ansible

start on (starting mongod)
script
  echo "never" > /sys/kernel/mm/transparent_hugepage/enabled
  echo "never" > /sys/kernel/mm/transparent_hugepage/defrag
end script

Bu, mongod başlatılmadan hemen önce betiği çalıştıracaktır. Mongod ( sudo service mongod restart) uygulamasını yeniden başlatın ve bitti.


Bu çözümün "Upstart" init sistemini kullandığını ve Ubuntu 16.04'ün systemd init sistemine dayandığını unutmayın.
Mark Stosberg

0

Uyarı günlüğünde biraz okuduktan sonra bu iki satırı /etc/sysfs.confy voilá'ya ekledim.

kernel/mm/transparent_hugepage/enabled = never
kernel/mm/transparent_hugepage/defrag = never

Bu değişiklikleri uyguladıktan sonra makineyi yeniden başlatın.


Bu hala sysfsutilspaketi gerektirir (cevabımı görün).
David Foerster

elbette ihtiyaç duyulmaktadır
Ulv3r 16:18
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.