Wie ändere ich "/ sys / kernel / mm / transparent_hugepage / enabled"?


50

Ich benutze 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 permanent. Nach dem Neustart wird es zurückgesetzt.

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

Wie ändere ich /sys/kernel/mm/transparent_hugepage/enableddauerhaft?


1
Es mag gute Antworten geben, aber IMO solltest du dir die offizielle Dokumentation von MongoDB ansehen
hgoebl

Antworten:


70

Du kannst

  1. Installiere das sysfsutilsPaket:

    sudo apt install sysfsutils
    
  2. und hängen 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 bleibt, anstatt sich auf benutzerdefinierte Startskripten zu verlassen. Die anderen Antworten mit den Skripten und bedingten Ausdrücken eignen sich, wenn Sie nicht wissen, über welchen Pfad der Kernel diese Einstellung verfügbar macht, dh wenn Sie nicht einmal eine ungefähre Vorstellung davon haben, welche Kernelversion auf dem betroffenen Computer ausgeführt wird.


4
Dies hat unter Ubuntu 14.04 auf einer AWS EC2-Instanz nichts für mich getan. Ich weiß nicht viel über sysfs.conf, aber es scheint eine von Ubuntu unterstützte Konfiguration zu sein, aber die Datei war zuvor nicht auf unserem System vorhanden, und das Hinzufügen und Neustarten haben die mongo-Ausgabewarnungen überhaupt nicht geändert. Ich habe auch versucht, den Rat von clayzermk1 unten zu befolgen. Die Warnung "Defragmentieren" erschien immer noch. Das offizielle mongo docs init-Skript hat beide Warnungen entfernt.
Neek

Was ist die Ausgabe von cat /sys/kernel/mm/transparent_hugepage/enabled? Gibt es das überhaupt? sysfs.confwird normalerweise beim Booten von ausgewertet /etc/init.d/sysutils. Ist es aktiviert? Was passiert beim Aufruf /etc/init.d/sysutils start?
David Foerster

3
Ich habe auch keine sysfs.confDatei und /etc/init.d/sysutils. Ubuntu 16.04
HEX

1
@unhammer: Nein, die beiden haben unterschiedliche Bereiche. sysctlist für Einstellungen, die Sie auch mit Kernel-Parametern vornehmen können; sysfs.confist für Einträge in /sys.
David Foerster

1
@navossoc: Könnten Sie bitte eine neue Frage eröffnen , wenn Sie eine neue Frage oder eine Folgefrage haben? Der Kommentarbereich ist nicht geeignet oder für neue Fragen oder erweiterte Diskussionen gedacht. Gerne können Sie mir einen Kommentar mit einer Benachrichtigung senden, um mich darauf aufmerksam zu machen. Vielen Dank.
David Foerster

25

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

Die "bevorzugte" Möglichkeit besteht darin, die GRUB-Konfiguration zu bearbeiten /etc/default/grubund an sie anzuhängen transparent_hugepage=neverund sie GRUB_CMDLINE_LINUX_DEFAULTdann auszuführen update-grub, um sie neu zu erstellen.

Der folgende Doppelliner wird genau das tun. Ü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-mkconfigIch werde Einträge /etc/default/grubmit denen von verprügeln /etc/default/grub.d/*. Wenn Sie zufällig mit AWS arbeiten, müssen Sie stattdessen Änderungen vornehmen /etc/default/grub.d/50-cloudimg-settings.cfg.

Die "alternative" Methode besteht darin, /etc/rc.localFolgendes 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 am Ende sowohl die "bevorzugte" als auch die "alternative" Methode angewendet, da sie sich nicht gegenseitig ausschließen und die Warnung vor einer Defragmentierung beseitigt wird.

* Arbeitete für mich auf Ubuntu 14.04, MongoDB 3.0.2 und AWS.


Ich habe dies auf meinem MongoDB-Anwendungsserver mit einem Klick auf DigitalOcean versucht und es hat nicht funktioniert. Immer noch die gleiche Warnmeldung.
Scaryguy

Vielen Dank für den Teil über EC2 und50-cloudimg-settings.cfg
Martin Konecny

16

Hier ist eine Lösung, die auf Ubuntu 16.04 unter AWS EC2 getestet wurde. Ubuntu 16.04 verwendet das systemd init-System und diese Konfigurationsdatei drückt aus, dass diese Einstellungen geändert werden sollten, bevor MongoDB startet.

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 Startzeitabhängigkeit von MongoDB

systemctl enable mongodb-hugepage-fix

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

systemctl start mongodb-hugepage-fix
systemctl restart mongod

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


1
Das systemd-Update ist perfekt für moderne MongoDB-Installationen, danke.
Four43

7

Fügen Sie die folgenden Zeilen in /etc/rc.local ein.

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

Dies wird ausgeführt, wenn Sie den Server neu starten.


1
Gibt es dazu eine Konfigurationsdatei? rc.localist keine gute Idee, da rc.local am Ende des Systemstarts ausgeführt wird. Der Mongodb-Dienst verwendet daher weiterhin die Standardeinstellung.
Feng Yu

2
Bearbeiten Sie die Datei / etc / default / grub und ändern Sie die Zeile "GRUB_CMDLINE_LINUX_DEFAULT =" transparent_hugepage = never ". Führen Sie den Befehl update-grub aus und starten Sie den Server neu
PKumar

2
Danke, es funktioniert. Aber gibt es eine ähnliche Möglichkeit zum Ändern /sys/kernel/mm/transparent_hugepage/defrag? Beim Neustart sagt mir die Mongo-Shell außerdem: "** WARNUNG: / sys / kernel / mm / transparent_hugepage / defrag ist 'immer'."
Feng Yu


0

GRUB ändert sich nach dem Upgrade, und rc.local wird erst nach dem Start von mongo ausgeführt. Daher sollten wir am Ende von rc.local möglicherweise den Dienst mongo restart hinzufügen

if test -f / sys / kernel / mm / transparent_hugepage / enabled; dann
  echo never> / sys / kernel / mm / transparent_hugepage / enabled
fi

if test -f / sys / kernel / mm / transparent_hugepage / defrag; dann
   echo never> / sys / kernel / mm / transparent_hugepage / defrag
fi

warte 1 && servie mongod neustart

oder hat jemand die obigen Zeilen erfolgreich zu init script in Ubuntu 14.04 hinzugefügt?


0

Da wir Computer mit Ansible bereitstellen, mag ich es nicht, RC-Dateien zu ändern.

Ich habe versucht, sysfsutils/ zu verwenden, sysfs.confaber beim Starten der Dienste auf schnellen (oder langsamen) Computern sind Zeitprobleme aufgetreten. Es sah so aus, als ob manchmal Mongod vor sysfsutils gestartet wurde. Manchmal hat es funktioniert, manchmal nicht.

Da Mongod ein Emporkömmling ist, stellte ich fest, dass die sauberste Lösung darin bestand, 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, kurz bevor Mongod gestartet wird. Mongod ( sudo service mongod restart) neu starten und fertig.


Beachten Sie, dass diese Lösung das Init-System "Upstart" verwendet, während Ubuntu 16.04 auf dem Init-System systemd basiert.
Mark Stosberg

0

Nachdem ich ein wenig im /etc/sysfs.confWarnprotokoll gelesen habe, habe ich diese beiden Zeilen in y voilá hinzugefügt

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

Starten Sie den Computer neu, nachdem Sie diese Änderungen vorgenommen haben.


Das erfordert noch das sysfsutilsPaket (siehe meine Antwort).
David Foerster

sicherlich wird es gebraucht
Ulv3r
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.