Wie ändere ich „/sys/kernel/mm/transparent_hugepage/enabled“

Wie ändere ich „/sys/kernel/mm/transparent_hugepage/enabled“

Ich verwende MongoDB 3.0 und finde eine Warnung:

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

Ich versuche, Echo zu verwenden, aber es ist nicht dauerhaft, nach dem Neustart wird es zurückgesetzt.

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

Wie nehme ich /sys/kernel/mm/transparent_hugepage/enableddauerhafte Änderungen vor?

Antwort1

Du kannst

  1. Installieren Sie das sysfsutilsPaket:

    sudo apt install sysfsutils
    
  2. und fügen Sie eine Zeile mit dieser Einstellung an /etc/sysfs.conf:

    kernel/mm/transparent_hugepage/enabled = never
    

Dies ist die sauberste Lösung, da die gesamte Sysfs-Konfiguration an einem Ort gespeichert wird, anstatt sich auf benutzerdefinierte Startskripte zu verlassen. Die anderen Antworten mit den Skripten und bedingten Ausdrücken sind geeignet, wenn Sie nicht wissen, über welchen Pfad der Kernel diese Einstellung verfügbar macht, d. h. wenn Sie nicht einmal eine ungefähre Vorstellung von der Kernelversion haben, die auf dem betroffenen Computer ausgeführt wird.

Antwort2

Die MongoDB-Dokumente enthalten einige Vorschläge.http://docs.mongodb.org/manual/reference/transparent-huge-pages/

Die „bevorzugte“ Methode besteht darin, die GRUB-Konfiguration zu bearbeiten /etc/default/grub, anzuhängen und transparent_hugepage=neverdann neu GRUB_CMDLINE_LINUX_DEFAULTzu update-gruberstellen.

Genau das macht der folgende Zweizeiler. Überprüfen Sie unbedingt die Ausgabe!

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

Beachten Sie, dass dies update-grubein Wrapper für ist grub-mkconfig. grub-mkconfigüberschreibt Einträge in /etc/default/grubmit denen aus /etc/default/grub.d/*. Wenn Sie zufällig AWS verwenden, müssen Sie stattdessen bearbeiten /etc/default/grub.d/50-cloudimg-settings.cfg.

Die „alternative“ Methode besteht darin, /etc/rc.localvorher Folgendes zu bearbeiten und hinzuzufügen 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

Persönlich habe ich letztendlich sowohl die „bevorzugte“ als auch die „alternative“ Methode ausprobiert, da sie sich nicht gegenseitig ausschließen und die Warnung bezüglich der Defragmentierung vermieden wird.

* Hat bei mir unter Ubuntu 14.04, MongoDB 3.0.2 und AWS funktioniert.

Antwort3

Hier ist eine Lösung, die getestet wurde und auf Ubuntu 16.04 auf AWS EC2 funktioniert. Ubuntu 16.04 verwendet das systemd-Init-System und diese Konfigurationsdatei gibt an, dass diese Einstellungen geändert werden sollten, bevor MongoDB hochfährt.

Erstellen Sie eine Datei mit dem Namen /etc/systemd/system/mongodb-hugepage-fix.serviceund fügen Sie den folgenden Inhalt hinzu:

[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

So laden Sie die Datei in systemd:

systemctl daemon-reload

So aktivieren Sie die Datei als Boot-Time-Abhängigkeit von MongoDB

systemctl enable mongodb-hugepage-fix

Wenn Sie die Änderungen sofort aktivieren möchten (vor dem nächsten Booten)

systemctl start mongodb-hugepage-fix
systemctl restart mongod

Diese Lösung istnichtgeeignet für Ubuntu 14.04, das die Upstart-Init-Lösung anstelle von systemd verwendet.

Antwort4

Da wir Maschinen mit Ansible bereitstellen, möchte ich RC-Dateien nicht ändern.

Ich habe versucht sysfsutils, / zu verwenden sysfs.conf, aber beim Starten der Dienste auf schnellen (oder langsamen) Maschinen traten Zeitprobleme auf. Es sah so aus, als ob mongod manchmal vor sysfsutils gestartet wurde. Manchmal funktionierte es, manchmal nicht.

Da Mongod ein Emporkömmlingsprozess ist, habe ich festgestellt, dass die sauberste Lösung darin besteht, die Datei /etc/mongo_vm_settings.confmit dem folgenden Inhalt hinzuzufügen:

# 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

Dadurch wird das Skript ausgeführt, unmittelbar bevor mongod gestartet wird. Starten Sie mongod ( sudo service mongod restart) neu und fertig.

verwandte Informationen