Bagaimana cara mengubah “/ sys / kernel / mm / transparent_hugepage / diaktifkan”

50

Saya menggunakan mongodb 3.0 dan saya menemukan peringatan:

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

Saya mencoba menggunakan gema, tetapi itu tidak permanen, setelah reboot itu akan diatur ulang.

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

Bagaimana cara saya memodifikasi /sys/kernel/mm/transparent_hugepage/enabledsecara permanen?

Feng Yu
sumber
1
Mungkin ada jawaban yang baik di bawah ini, tetapi IMO Anda harus melihat dokumentasi resmi MongoDB: docs.mongodb.org/master/tutorial/transparent-huge-pages
hgoebl

Jawaban:

70

Kamu bisa

  1. instal sysfsutilspaket:

    sudo apt install sysfsutils
    
  2. dan menambahkan baris dengan pengaturan itu ke /etc/sysfs.conf:

    kernel/mm/transparent_hugepage/enabled = never
    

Ini adalah solusi terbersih, karena menjaga semua konfigurasi sysfs di satu tempat daripada mengandalkan skrip start-up kustom. Jawaban lainnya, dengan skrip dan ekspresi kondisional, cocok jika Anda tidak tahu melalui jalur mana kernel akan mengekspos pengaturan itu, yaitu jika Anda bahkan tidak memiliki gagasan kasar tentang versi kernel yang berjalan pada mesin yang terpengaruh.

David Foerster
sumber
4
Ini tidak membantu saya di Ubuntu 14.04 pada instance AWS EC2. Saya tidak tahu banyak tentang sysfs.conf tetapi tampaknya itu adalah konfigurasi yang didukung Ubuntu, namun file itu tidak ada pada sistem kami sebelumnya, dan menambahkannya dan me-reboot sama sekali tidak mengubah peringatan output mongo. Juga mencoba saran clayzermk1 di bawah ini, peringatan 'defrag' masih muncul. Script mongo docs init resmi memang menghapus kedua peringatan.
Neek
Apa output dari cat /sys/kernel/mm/transparent_hugepage/enabled? Apakah itu ada? sysfs.confbiasanya dievaluasi saat boot oleh /etc/init.d/sysutils. Apakah ini diaktifkan? Apa yang terjadi, ketika Anda memohon /etc/init.d/sysutils start?
David Foerster
3
Saya juga tidak punya sysfs.conffile dan /etc/init.d/sysutils. ubuntu 16.04
HEX
1
@unhammer: Tidak, keduanya memiliki cakupan yang berbeda. sysctladalah untuk pengaturan yang juga dapat Anda capai dengan parameter kernel; sysfs.confuntuk entri di /sys.
David Foerster
1
@navossoc: Bisakah Anda membuka pertanyaan baru jika Anda memiliki pertanyaan baru atau tindak lanjut? Bagian komentar tidak cocok atau dimaksudkan untuk pertanyaan baru atau diskusi panjang. Anda dapat mengirim saya komentar dengan pemberitahuan untuk menarik perhatian saya padanya. Terima kasih.
David Foerster
25

Dokumen MongoDB memiliki beberapa saran. http://docs.mongodb.org/manual/reference/transparent-huge-pages/

Cara "yang disukai" adalah mengedit /etc/default/grubdan menambahkan transparent_hugepage=neveruntuk GRUB_CMDLINE_LINUX_DEFAULTkemudian dijalankan update-grubuntuk membangun kembali konfigurasi GRUB.

Dua baris berikut akan melakukan hal itu. Pastikan untuk memverifikasi output!

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

Perhatikan bahwa itu update-grubadalah pembungkus untuk grub-mkconfig. grub-mkconfigakan menerima entri /etc/default/grubdari orang-orang dari /etc/default/grub.d/*. Jika kebetulan Anda menjalankan AWS, Anda harus mengedit /etc/default/grub.d/50-cloudimg-settings.cfg.

Metode "pengganti" adalah mengedit /etc/rc.localdan menambahkan yang berikut sebelumnya 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

Secara pribadi, saya akhirnya melakukan kedua metode "disukai" dan "alternatif" karena mereka tidak saling eksklusif dan menghilangkan peringatan tentang defrag.

* Bekerja untuk saya di Ubuntu 14.04, MongoDB 3.0.2, dan AWS.

clayzermk1
sumber
Saya mencoba ini di server aplikasi MongoDB satu-klik saya di DigitalOcean dan tidak berhasil. Masih mendapatkan pesan peringatan yang sama.
scaryguy
Terima kasih untuk bagian tentang EC2 dan50-cloudimg-settings.cfg
Martin Konecny
16

Inilah solusi yang telah diuji untuk bekerja pada Ubuntu 16.04 pada AWS EC2. Ubuntu 16.04 menggunakan sistem init systemd, dan file konfigurasi ini menyatakan bahwa pengaturan ini harus diubah sebelum MongoDB boot.

Buat file dengan nama /etc/systemd/system/mongodb-hugepage-fix.servicedan tambahkan konten berikut:

[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

Untuk memuat file ke systemd:

systemctl daemon-reload

Untuk mengaktifkan file sebagai ketergantungan waktu boot MongoDB

systemctl enable mongodb-hugepage-fix

Jika Anda ingin segera mengaktifkan perubahan (sebelum boot berikutnya)

systemctl start mongodb-hugepage-fix
systemctl restart mongod

Solusi ini tidak cocok untuk Ubuntu 14.04, yang menggunakan solusi Init pemula bukannya systemd.

Mark Stosberg
sumber
1
Perbaikan systemd sangat cocok untuk pemasangan MongoDB modern, terima kasih.
four43
7

Tambahkan baris berikut di bawah ini ke dalam /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

Ini akan berjalan ketika Anda me-reboot server.

PKumar
sumber
1
Apakah ada file konfigurasi tentang ini? rc.localbukan ide yang baik, karena rc.local akan dijalankan pada akhir sistem start up. Jadi layanan mongodb masih akan menggunakan pengaturan default.
Feng Yu
2
edit file / etc / default / grub dan buat perubahan pada baris "GRUB_CMDLINE_LINUX_DEFAULT =" transparent_hugepage = never "dan jalankan perintah update-grub kemudian restart server
PKumar
2
Terima kasih, ini berhasil. Tetapi, adakah cara yang serupa untuk memodifikasi /sys/kernel/mm/transparent_hugepage/defrag? Ketika saya reboot, mongo shell juga memberi tahu saya "** PERINGATAN: / sys / kernel / mm / transparent_hugepage / defrag adalah 'selalu'."
Feng Yu
0

GRUB akan berubah setelah peningkatan, dan rc.local akan berjalan hanya setelah mongo dimulai, jadi mungkin kita harus menambahkan layanan mongo restart di akhir rc.local seperti ini

jika test -f / sys / kernel / mm / transparent_hugepage / diaktifkan; kemudian
  gema tidak pernah> / sys / kernel / mm / transparent_hugepage / diaktifkan
fi

jika test -f / sys / kernel / mm / transparent_hugepage / defrag; kemudian
   echo never> / sys / kernel / mm / transparent_hugepage / defrag
fi

tunggu 1 && servie mongod restart

atau mungkin seseorang berhasil menambahkan baris di atas ke skrip init di Ubuntu 14.04?

Edik Mkoyan
sumber
0

Karena kami menggunakan mesin dengan Ansible, saya tidak suka memodifikasi file rc.

Saya mencoba menggunakan sysfsutils/ sysfs.conftetapi mengalami masalah waktu ketika memulai layanan dengan cepat (atau mesin lambat). Sepertinya kadang-kadang mongod dimulai sebelum sysfsutils. Terkadang berhasil, kadang tidak.

Karena mongod adalah proses pemula saya menemukan bahwa solusi terbersih adalah menambahkan file /etc/mongo_vm_settings.confdengan konten berikut:

# 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

Ini akan menjalankan skrip tepat sebelum mongod akan dimulai. Mulai ulang mongod ( sudo service mongod restart) dan selesai.

Ya ampun
sumber
Perhatikan bahwa solusi ini menggunakan sistem init "pemula", sedangkan Ubuntu 16,04 didasarkan pada sistem init systemd.
Mark Stosberg
0

Setelah membaca sedikit di log peringatan saya telah menambahkan dua baris ini di /etc/sysfs.confy voilá

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

Nyalakan ulang mesin setelah menerapkan perubahan ini.

Ulv3r
sumber
Itu masih membutuhkan sysfsutilspaket (lihat jawaban saya).
David Foerster
tentunya itu diperlukan
Ulv3r