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

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

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

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 faço para modificar /sys/kernel/mm/transparent_hugepage/enabledpermanentemente?

Responder1

Você pode

  1. instale o sysfsutilspacote:

    sudo apt install sysfsutils
    
  2. e anexe uma linha com essa configuração para /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 aquela configuração, ou seja, se você não tiver uma ideia aproximada da versão do kernel em execução na máquina afetada.

Responder2

A documentação do MongoDB tem algumas sugestões.http://docs.mongodb.org/manual/reference/transparent-huge-pages/

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

As duas linhas a seguir farão 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-mkconfigirá substituir as entradas /etc/default/grubcom as de /etc/default/grub.d/*. Se por acaso você estiver executando na AWS, precisará editar o arquivo /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 usando os métodos "preferencial" e "alternativo", pois não são mutuamente exclusivos e eliminam o aviso sobre a desfragmentação.

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

Responder3

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 da inicialização do MongoDB.

Crie um arquivo chamado /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 de tempo de inicialização do MongoDB

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ãoadequado para Ubuntu 14.04, que usa a solução Upstart init em vez de systemd.

Responder4

Como estamos implantando máquinas com 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). Parecia que às vezes o mongod era 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 antes do mongod ser iniciado. Reinicie o mongod ( sudo service mongod restart) e pronto.

informação relacionada