Como modifico “/ sys / kernel / mm / transparent_hugepage / enabled”

42

Eu uso o mongodb 3.0 e encontro um aviso:

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

Eu tento usar o echo, mas não é permanente, após a reinicialização ele será redefinido.

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

Como modifico /sys/kernel/mm/transparent_hugepage/enabled permanentemente?

    
por Feng Yu 16.03.2015 / 10:24

7 respostas

50

Você pode

  1. instale o pacote sysfsutils :

    sudo apt install sysfsutils
    
  2. e anexe uma linha com essa configuração a /etc/sysfs.conf :

    kernel/mm/transparent_hugepage/enabled = never
    

Esta é a solução mais limpa, porque mantém toda a configuração sysfs em um só lugar, em vez de confiar em scripts de inicialização personalizados. As outras respostas, com os scripts e expressões condicionais, são adequadas se você não souber por qual caminho o kernel irá expor essa configuração, i. e. se você não tiver nem mesmo uma ideia aproximada da versão do kernel que está sendo executada na máquina afetada.

    
por David Foerster 18.04.2015 / 04:42
22

Os documentos do MongoDB têm algumas sugestões. link

A maneira "preferida" é editar /etc/default/grub e anexar transparent_hugepage=never a GRUB_CMDLINE_LINUX_DEFAULT , em seguida, executar update-grub para reconstruir a configuração do GRUB.

O seguinte verso fará exatamente isso. Certifique-se de verificar a saída!

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

Observe que update-grub é um wrapper para grub-mkconfig . grub-mkconfig irá atrapalhar as entradas em /etc/default/grub com as de /etc/default/grub.d/* . Se por acaso você estiver executando o AWS, será necessário editar /etc/default/grub.d/50-cloudimg-settings.cfg .

O método "alternativo" é editar /etc/rc.local e adicionar o seguinte antes de 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

Pessoalmente, acabei fazendo os métodos "preferido" e "alternativo", já que eles não são mutuamente exclusivos e elimina o aviso sobre desfragmentação.

* Trabalhei para mim no Ubuntu 14.04, no MongoDB 3.0.2 e no AWS.

    
por clayzermk1 11.04.2015 / 00:08
13

Aqui está uma solução que foi testada para funcionar no Ubuntu 16.04 no AWS EC2. O Ubuntu 16.04 usa o sistema init systemd, e este arquivo de configuração expressa que essas configurações devem ser alteradas antes do arranque do MongoDB.

Crie um arquivo chamado /etc/systemd/system/mongodb-hugepage-fix.service e adicione o seguinte conteúdo:

[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

Para carregar o arquivo no systemd:

systemctl daemon-reload

Para ativar o arquivo como uma dependência de tempo de inicialização do MongoDB

systemctl enable mongodb-hugepage-fix

Se você quiser ativar as alterações imediatamente (antes da próxima inicialização)

systemctl start mongodb-hugepage-fix
systemctl restart mongod

Esta solução não é adequada para o Ubuntu 14.04, que usa a solução init Upstart em vez de systemd.

    
por Mark Stosberg 02.09.2016 / 19:07
7

Anexe as seguintes linhas abaixo em /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

Isso será executado quando você reiniciar o servidor.

    
por PKumar 16.03.2015 / 10:50
0

Como estamos implementando máquinas com Ansible, não gosto de modificar arquivos rc.

Eu tentei usar sysfsutils / sysfs.conf , mas tive problemas de tempo ao iniciar os serviços em máquinas rápidas (ou lentas). Parecia que às vezes o mongod era iniciado antes dos sysfsutils. Às vezes funcionava, às vezes não.

Como o mongod é um processo iniciante, descobri que a solução mais limpa era adicionar o arquivo /etc/mongo_vm_settings.conf com o seguinte conteúdo:

# 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

Isso executará o script antes que o mongod seja iniciado. Reinicie o mongod ( sudo service mongod restart ) e pronto.

    
por Whyhankee 27.06.2016 / 13:39
0

Depois de ler um pouco no log de aviso, adicionei essas duas linhas em /etc/sysfs.conf y voilá

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

Reinicie a máquina depois de aplicar essas alterações.

    
por Ulv3r 17.11.2017 / 19:18
-1

O GRUB será alterado após a atualização, e o rc.local só será executado depois que o mongo for iniciado, então talvez devamos adicionar o serviço mongo restart no final do rc.local assim

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

wait 1 && servie mongod restart

ou talvez alguém tenha adicionado com sucesso as linhas acima ao script de inicialização no Ubuntu 14.04?

    
por Edik Mkoyan 11.11.2015 / 12:33