it-swarm.com.de

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

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/enabled dauerhaft?

50
Feng Yu

Du kannst

  1. installieren Sie das Paket sysfsutils:

    Sudo apt install sysfsutils
    
  2. und füge eine Zeile mit dieser Einstellung an /etc/sysfs.conf an:

    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 sind geeignet, wenn Sie nicht wissen, über welchen Pfad der Kernel diese Einstellung verfügbar macht, d. H. e. wenn Sie nicht einmal eine ungefähre Vorstellung davon haben, welche Kernelversion auf dem betroffenen Computer ausgeführt wird.

69
David Foerster

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

Die "bevorzugte" Möglichkeit besteht darin, /etc/default/grub zu bearbeiten und transparent_hugepage=never an GRUB_CMDLINE_LINUX_DEFAULT anzuhängen und dann update-grub auszuführen, um die GRUB - Konfiguration 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 update-grub ein Wrapper für grub-mkconfig ist. grub-mkconfig löscht Einträge in /etc/default/grub mit denen aus /etc/default/grub.d/*. Wenn Sie zufällig mit AWS arbeiten, müssen Sie stattdessen /etc/default/grub.d/50-cloudimg-settings.cfg bearbeiten.

Die "alternative" Methode besteht darin, /etc/rc.local zu bearbeiten und Folgendes vor exit 0 hinzuzufügen:

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 sowohl die "bevorzugte" als auch die "alternative" Methode angewendet, da sie sich nicht gegenseitig ausschließen und die Warnung vor einer Defragmentierung beseitigt ist.

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

24
clayzermk1

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.service und 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 geeignet für Ubuntu 14.04, das die Upstart-Init-Lösung anstelle von systemd verwendet.

16
Mark Stosberg

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.

7
PKumar

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 nie> /sys/kernel/mm/transparent_hugepage/enabled[.____.‹fi[.____.‹[.____.‹if test -f/sys/kernel/mm/transparent_hugepage/defrag; dann 
 echo nie> /sys/kernel/mm/transparent_hugepage/defrag[.____.‹fi[.____.[.____.‹wait 1 && servie mongod restart 

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

0
Edik Mkoyan

Nachdem ich ein wenig im Warnprotokoll gelesen habe, habe ich diese beiden Zeilen in /etc/sysfs.conf 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.

0
Ulv3r

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

Ich habe versucht, sysfsutils/sysfs.conf zu verwenden, aber 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.conf mit folgendem 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. Starten Sie Mongod (Sudo service mongod restart) neu und fertig.

0
Whyhankee