Pré-história
Eu tenho elasticsearch e SugarCRM7 rodando no CentOS 6.5. Todos os dias enfrento o mesmo problema: erro java outOfMemory. Isso acontece devido ao pequeno valor vm.max_map_count, 65530 somente quando 262144 é recomendado.
Problema
O problema é que vm.max_map_count parece imutável:
Alterando sob raiz
sudo sysctl -w vm.max_map_count=262144
retorna
erro: permissão negada na chave 'vm.max_map_count'
Enquanto
ps aux | grep java
Retorna apenas o processo grep
Alterando na inicialização do elasticsearch
sudo service elasticsearch start
Também retorna erro
erro: permissão negada na chave 'vm.max_map_count'
Iniciando elasticsearch: [OK]
Mudanças manuais via arquivo (truque sujo-sujo):
sudo vi /proc/sys/vm/max_map_count
Também não funciona:
"/ proc / sys / vm / max_map_count" [somente leitura] 1L, 6C
- INSERT - W10: Aviso: Alterando um arquivo somente leitura
E45: a opção 'somente leitura' está definida (adicione! Para substituir)
"/ proc / sys / vm / max_map_count" E212: Não é possível abrir o arquivo para gravação
Enquanto
ls -la /proc/sys/vm/ | grep max_map_count
Devoluções
-rw-r - r-- 1 raiz raiz 0 abr 10 09:36 max_map_count
(Mas acho que isso pode ser normal para o linux falando sobre o diretório / proc)
Então, como posso alterar o valor dessa variável? Reiniciar a pesquisa elástica todas as noites não é uma boa ideia ... Ou, pelo menos, alguém sabe por que esse erro ocorre?
fonte
Respostas:
você está quase lá. Não importa se é uma máquina virtual ou física, essas configurações são sempre variáveis.
Eu vou mostrar 3 métodos.
Algumas pré-informações:
1) É melhor executar como root, se possível.
2) / proc no unix não é um sistema de arquivos real, é um sistema de arquivos do kernel na memória, mas parece um sistema de arquivos em disco normal. Você pode chamá-lo de 'sistema de arquivos falso' ou 'sistema de arquivos especial'; não é possível editar esses arquivos falsos com o vi ou qualquer outro editor, porque eles não são arquivos, apenas se parecem com arquivos. Eu fiquei com o mesmo problema anos atrás.
Mas é simples alterar seus valores, basta exigir outro tipo de 'mecânica' para editá-los.
Vou explicar: Primeiro, precisa ser root: (o sudo funciona em algumas distros, mas não em outras distros como você tentou, esse primeiro método é universal e funciona em qualquer Linux, macOS ou qualquer sistema baseado em Unix Espero que você tenha acesso à senha root.
Prossiga no prompt:
Digite a senha root.
Agora você é root, vamos verificar o valor atual de: / proc / sys / vm / max_map_count
Vamos mudar isso:
Vamos verificar:
Está feito! E já está aplicado e funcional. Alterando os valores de qualquer pseudo-arquivo em / proc, as configurações ficam ativas instantaneamente. Mas eles não persistem após uma reinicialização. Você pode brincar com valores e medir as alterações de desempenho no elasticsearh ou em qualquer outro aplicativo ou métrica do sistema. Vá alterando seu sistema, escrevendo os valores em algum papel, mantenha os melhores valores. Em qualquer erro, reinicie e todos voltarão aos valores originais e inicie novamente até que todos os valores desejados sejam ideais. Há muitos parâmetros ajustáveis de disco e memória em / proc. E eles fazem uma enorme diferença e ganho de desempenho se você os ajustar bem (e tiver tempo para isso). Voce está no caminho certo.
Quando satisfeitos, vamos torná-los permanentes:
Primeiro método:
usando /etc/rc.local
coloque todos os parâmetros dentro do arquivo rc.local, exemplo:
saia do vi editor salvando o arquivo.
Esses parâmetros serão definidos a cada reinicialização, APÓS o início de todos os serviços init, imediatamente antes do prompt de login aparecer.
(o arquivo /etc/rc.local é executado após todos os serviços linux de inicialização, pode não funcionar se o elasticsearch iniciar antes dele como um serviço, mas esse método pode ser útil em outra configuração, se você precisar no futuro, ou você pode usar assim colocando-os dentro do script init do elasticsearch, porque o script init é executado como root; portanto, é a mesma sintaxe acima para usar dentro dos scripts init)
Você também pode copiá-los agora e colá-los para alterações instantâneas. Os parâmetros acima são válidos, ajustados e em execução no meu servidor apache cassandra. Se desejar, tente-os como um ponto de partida para ajustar o seu.
Segundo método para torná-los permanentes:
Os parâmetros agora serão definidos ANTES de qualquer serviço de inicialização no linux.
Edite /etc/sysctl.conf , coloque parâmetros dentro
continue com os outros, salve o /etc/sysctl.conf , reinicie o servidor para aplicar as alterações ou execute: sysctl -p para aplicar as alterações sem a reinicialização. Eles serão permanentes nas reinicializações.
Dois métodos acima são os mais comuns. Há outro, e pode funcionar para você, é usando sudo , quase como se estivesse fazendo:
ao invés de:
experimentar:
Funciona no ubuntu.
Verificar:
Espero ter ajudado de alguma forma, pelo menos, dando as três opções diferentes para lidar com o problema, já que há quase um ano sua pergunta;)
Atenciosamente, Rafael Prado
fonte
Eu acho que sua "máquina virtual" é na verdade um contêiner OpenVZ (que você pode verificar isso executando
virt-what
).Nesse caso, você não pode alterar o
vm.max_map_count
sysctl ou muitos outros. Os valores são fixos.Esse é um problema conhecido da elasticsearch ( edição # 4978 ). Não é apenas a Elasticsearch. Sabe-se que os aplicativos Java apresentam um desempenho ruim em vários provedores OpenVZ, principalmente porque os hosts geralmente são mal ajustados e não há nada que você possa fazer sobre isso. Um comentarista sobre esse assunto ecoou exatamente qual seria minha recomendação:
fonte
Você pode seguir as instruções oficiais:
Para tornar a alteração permanente, atualize a configuração vm.max_map_count em /etc/sysctl.conf
Consulte https://www.elastic.co/guide/en/elasticsearch/reference/current/vm-max-map-count.html
fonte