Come posso modificare "/ sys / kernel / mm / transparent_hugepage / enabled"


50

Uso mongodb 3.0 e trovo un avviso:

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

Provo a usare l'eco, ma non è permanente, dopo il riavvio verrà ripristinato.

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

Come posso modificare in modo /sys/kernel/mm/transparent_hugepage/enabledpermanente?


1
Di seguito potrebbero esserci buone risposte, ma IMO dovresti dare un'occhiata alla documentazione ufficiale di MongoDB: docs.mongodb.org/master/tutorial/transparent-huge-pages
hgoebl

Risposte:


70

Puoi

  1. installa il sysfsutilspacchetto:

    sudo apt install sysfsutils
    
  2. e aggiungi una riga con quell'impostazione a /etc/sysfs.conf:

    kernel/mm/transparent_hugepage/enabled = never
    

Questa è la soluzione più pulita, perché mantiene tutta la configurazione di sysfs in un posto invece di fare affidamento su script di avvio personalizzati. Le altre risposte, con gli script e le espressioni condizionali, sono adatte se non si conosce attraverso quale percorso il kernel esporrà tale impostazione, ovvero se non si ha nemmeno un'idea approssimativa della versione del kernel in esecuzione sul computer interessato.


4
Questo non ha fatto nulla per me su Ubuntu 14.04 su un'istanza di AWS EC2. Non so molto su sysfs.conf ma sembra essere una configurazione supportata da Ubuntu, tuttavia il file non esisteva sul nostro sistema in precedenza, e l'aggiunta e il riavvio non hanno modificato affatto gli avvisi di output di mongo. Di seguito ho anche provato i consigli di clayzermk1, ma è ancora apparso l'avviso "deframmentazione". Lo script init ufficiale di mongo docs ha rimosso entrambi gli avvisi.
Neek,

Qual è l'output di cat /sys/kernel/mm/transparent_hugepage/enabled? Esiste affatto? sysfs.confviene normalmente valutato all'avvio da /etc/init.d/sysutils. È abilitato? Cosa succede quando invochi /etc/init.d/sysutils start?
David Foerster,

3
Inoltre non ho sysfs.conffile e /etc/init.d/sysutils. ubuntu 16.04
HEX,

1
@unhammer: No, i due hanno ambiti diversi. sysctlè per le impostazioni che potresti ottenere anche con i parametri del kernel; sysfs.confè per le voci in /sys.
David Foerster,

1
@navossoc: Potresti aprire una nuova domanda se hai una domanda nuova o successiva? La sezione dei commenti non è adatta o pensata per nuove domande o discussioni estese. Ti prego di inviarmi un commento con una notifica per attirare la mia attenzione su di esso. Grazie.
David Foerster,

25

I documenti MongoDB hanno alcuni suggerimenti. http://docs.mongodb.org/manual/reference/transparent-huge-pages/

Il modo "preferito" è di modificare /etc/default/grube aggiungere transparent_hugepage=neverper GRUB_CMDLINE_LINUX_DEFAULTpoi eseguire update-grubper ricostruire la configurazione di GRUB.

Il seguente due-liner farà proprio questo. Assicurati di verificare l'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

Si noti che update-grubè un wrapper per grub-mkconfig. grub-mkconfigbloccherà le voci /etc/default/grubcon quelle di /etc/default/grub.d/*. Se per caso stai eseguendo AWS, dovrai invece modificarlo /etc/default/grub.d/50-cloudimg-settings.cfg.

Il metodo "alternativo" è di modificare /etc/rc.locale aggiungere prima quanto segue 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

Personalmente, ho finito per fare entrambi i metodi "preferito" e "alternativo" poiché non si escludono a vicenda ed elimina l'avvertimento sulla deframmentazione.

* Ha funzionato per me su Ubuntu 14.04, MongoDB 3.0.2 e AWS.


L'ho provato sul mio server delle applicazioni MongoDB con un clic su DigitalOcean e non ha funzionato. Ricevi ancora lo stesso messaggio di avviso.
spaventoso

Grazie per la parte relativa a EC2 e50-cloudimg-settings.cfg
Martin Konecny,

16

Ecco una soluzione che è stata testata per funzionare su Ubuntu 16.04 su AWS EC2. Ubuntu 16.04 utilizza il sistema systemd init e questo file di configurazione indica che queste impostazioni devono essere modificate prima dell'avvio di MongoDB.

Creare un file denominato /etc/systemd/system/mongodb-hugepage-fix.servicee aggiungere il seguente contenuto:

[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

Per caricare il file in systemd:

systemctl daemon-reload

Per attivare il file come dipendenza all'avvio di MongoDB

systemctl enable mongodb-hugepage-fix

Se si desidera attivare immediatamente le modifiche (prima dell'avvio successivo)

systemctl start mongodb-hugepage-fix
systemctl restart mongod

Questa soluzione non è adatta per Ubuntu 14.04, che utilizza la soluzione di avvio Upstart invece di systemd.


1
La correzione di systemd è perfetta per le moderne installazioni MongoDB, grazie.
quattro43,

7

Aggiungi le seguenti righe sotto in /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

Questo verrà eseguito al riavvio del server.


1
C'è un file di configurazione su questo? rc.localnon è una buona idea, perché rc.local verrà eseguito alla fine dell'avvio del sistema. Quindi il servizio mongodb utilizzerà comunque l'impostazione predefinita.
Feng Yu,

2
modifica il file / etc / default / grub e apporta modifiche alla riga "GRUB_CMDLINE_LINUX_DEFAULT =" transparent_hugepage = never "ed esegui il comando update-grub quindi riavvia il server
PKumar

2
Grazie, funziona Ma esiste un modo simile per modificare /sys/kernel/mm/transparent_hugepage/defrag? Quando riavvio, mongo shell mi dice anche "** ATTENZIONE: / sys / kernel / mm / transparent_hugepage / defrag è 'sempre'."
Feng Yu,


0

GRUB cambierà dopo l'aggiornamento e rc.local verrà eseguito solo dopo l'avvio di mongo, quindi forse dovremmo aggiungere il servizio mongo restart alla fine di rc.local in questo modo

se test -f / sys / kernel / mm / transparent_hugepage / abilitato; poi
  echo mai> / sys / kernel / mm / transparent_hugepage / abilitato
fi

se test -f / sys / kernel / mm / transparent_hugepage / defrag; poi
   echo mai> / sys / kernel / mm / transparent_hugepage / defrag
fi

attendere 1 && servie mongod restart

o forse qualcuno ha aggiunto con successo le righe sopra per lo script init in Ubuntu 14.04?


0

Dal momento che stiamo implementando macchine con Ansible non mi piace modificare i file rc.

Ho provato a utilizzare sysfsutils/ sysfs.confma ho riscontrato problemi di temporizzazione all'avvio dei servizi su macchine veloci (o lente). A volte sembrava che il mongod fosse iniziato prima dei sysfsutils. A volte ha funzionato, a volte no.

Poiché mongod è un processo di avvio, ho scoperto che la soluzione più pulita era quella di aggiungere il file /etc/mongo_vm_settings.confcon il seguente contenuto:

# 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

Questo eseguirà lo script appena prima che mongod venga avviato. Riavvia mongod ( sudo service mongod restart) e terminato .


Si noti che questa soluzione utilizza il sistema init "Upstart", mentre Ubuntu 16.04 si basa sul sistema init systemd.
Mark Stosberg,

0

Dopo aver letto un po 'nel registro degli avvisi ho aggiunto queste due righe in /etc/sysfs.confy voilá

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

Riavviare la macchina dopo aver applicato queste modifiche.


Ciò richiede ancora il sysfsutilspacchetto (vedi la mia risposta).
David Foerster,

sicuramente è necessario
Ulv3r
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.