Como modifico "/ sys / kernel / mm / transparent_hugepage / enabled"

50

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 eco, mas não é permanente; após a reinicialização, ele será redefinido.

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

Como faço para modificar /sys/kernel/mm/transparent_hugepage/enabledpermanentemente?

Feng Yu
fonte
11
Pode haver boas respostas abaixo, mas IMO você deve ter um olhar para a documentação oficial do MongoDB: docs.mongodb.org/master/tutorial/transparent-huge-pages
hgoebl

Respostas:

70

Você pode

  1. instale o sysfsutilspacote:

    sudo apt install sysfsutils
    
  2. e acrescente 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 do sysfs em um só lugar, em vez de depender de 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, ou seja, se você não tiver uma idéia aproximada da versão do kernel em execução na máquina afetada.

David Foerster
fonte
4
Isso não fez nada para mim no Ubuntu 14.04 em uma instância do AWS EC2. Eu não sei muito sobre o sysfs.conf, mas parece ser uma configuração suportada pelo Ubuntu, mas o arquivo não existia no nosso sistema anteriormente, e adicioná-lo e reinicializar não alterou os avisos de saída do mongo. Também tentei o conselho de clayzermk1 abaixo, o aviso 'desfragmentar' ainda apareceu. O script oficial do mongo docs init removeu os dois avisos.
Neek
Qual é o resultado de cat /sys/kernel/mm/transparent_hugepage/enabled? Existe mesmo? sysfs.confé normalmente avaliado na inicialização por /etc/init.d/sysutils. Está habilitado? O que acontece quando você invoca /etc/init.d/sysutils start?
David Foerster
3
Eu também não tenho sysfs.confarquivo e /etc/init.d/sysutils. Ubuntu 16.04
HEX
11
@unhammer: Não, os dois têm escopos diferentes. sysctlé para configurações que você também pode obter com os parâmetros do kernel; sysfs.confé para entradas em /sys.
David Foerster
11
@navossoc: Você poderia abrir uma nova pergunta se tiver uma pergunta nova ou de acompanhamento? A seção de comentários não é adequada ou destinada a novas perguntas ou discussões prolongadas. Você pode enviar um comentário com uma notificação para chamar minha atenção. Obrigado.
David Foerster
25

Os documentos do MongoDB têm algumas sugestões. http://docs.mongodb.org/manual/reference/transparent-huge-pages/

A maneira "preferida" é editar /etc/default/grube acrescentar transparent_hugepage=nevere GRUB_CMDLINE_LINUX_DEFAULTdepois executar update-grubpara reconstruir a configuração do GRUB.

A seguinte linha dupla 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 invólucro para grub-mkconfig. grub-mkconfigtrará entradas /etc/default/grubcom as de /etc/default/grub.d/*. Se, por acaso, você estiver executando na AWS, precisará editar /etc/default/grub.d/50-cloudimg-settings.cfg.

O método "alternativo" é editar /etc/rc.locale adicionar o seguinte antes 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", pois eles não são mutuamente exclusivos e elimina o aviso sobre desfragmentação.

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

clayzermk1
fonte
Eu tentei isso no meu servidor de aplicativos MongoDB com um clique no DigitalOcean e não funcionou. Ainda recebendo a mesma mensagem de aviso.
scaryguy
Obrigado pela parte sobre EC2 e50-cloudimg-settings.cfg
Martin Konecny
16

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

Crie um arquivo nomeado /etc/systemd/system/mongodb-hugepage-fix.servicee 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 do MongoDB no momento da inicialização

systemctl enable mongodb-hugepage-fix

Se você deseja 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 do systemd.

Mark Stosberg
fonte
11
A correção systemd é perfeita para instalações modernas do MongoDB, obrigado.
four43
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.

PKumar
fonte
11
Existe um arquivo de configuração sobre isso? rc.localnão é uma boa ideia, porque o rc.local será executado no final da inicialização do sistema. Portanto, o serviço mongodb ainda utilizará a configuração padrão.
Feng Yu
2
mudanças editar o / etc / default / grub de arquivo e fazer a linha "GRUB_CMDLINE_LINUX_DEFAULT =" transparent_hugepage = never" e execute o comando update-grub, em seguida, reiniciar o servidor
PKumar
2
Obrigado, funciona. Mas, existe uma maneira semelhante de modificar /sys/kernel/mm/transparent_hugepage/defrag? Quando eu reinicio, o mongo shell também me diz "** AVISO: / sys / kernel / mm / transparent_hugepage / defrag é 'sempre'".
Feng Yu
@FengYu tentar esta página docs.mongodb.org/manual/tutorial/transparent-huge-pages
PKumar
0

O GRUB mudará após a atualização e o rc.local será executado somente após o mongo ser iniciado, portanto, talvez devamos adicionar o serviço mongo restart no final do rc.local como este

se teste -f / sys / kernel / mm / transparent_hugepage / enabled; então
  eco nunca> / sys / kernel / mm / transparent_hugepage / enabled
fi

se teste -f / sys / kernel / mm / transparent_hugepage / defrag; então
   echo never> / sys / kernel / mm / transparent_hugepage / defrag
fi

aguarde 1 && servie mongod restart

ou talvez alguém tenha adicionado com sucesso as linhas acima para iniciar o script no Ubuntu 14.04?

Edik Mkoyan
fonte
0

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

Tentei usar sysfsutils/ sysfs.confmas tive problemas de tempo ao iniciar os serviços em máquinas rápidas (ou lentas). Às vezes, parecia que o mongod foi iniciado antes do sysfsutils. Às vezes funcionou, às vezes não.

Como o mongod é um processo inicial, descobri que a solução mais limpa era adicionar o arquivo /etc/mongo_vm_settings.confcom 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 imediatamente antes do mongod ser iniciado. Reinicie o mongod ( sudo service mongod restart) e pronto.

Whyhankee
fonte
Observe que esta solução usa o sistema init "Upstart", enquanto o Ubuntu 16.04 é baseado no sistema systemd init.
Mark Stosberg
0

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

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

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

Ulv3r
fonte
Isso ainda requer o sysfsutilspacote (veja minha resposta).
David Foerster
certamente ela é necessária
Ulv3r