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/enabled
permanentemente?
Responder1
Você pode
instale o
sysfsutils
pacote:sudo apt install sysfsutils
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/grub
e anexar transparent_hugepage=never
para GRUB_CMDLINE_LINUX_DEFAULT
depois executar update-grub
para 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-mkconfig
irá substituir as entradas /etc/default/grub
com 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.local
e 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.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ê 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.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 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.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 do mongod ser iniciado. Reinicie o mongod ( sudo service mongod restart
) e pronto.