Prehistoria
Tengo Elasticsearch y SugarCRM7 ejecutándose en CentOS 6.5. Todos los días me enfrento al mismo problema: error de Java outOfMemory. Eso sucede debido al pequeño valor de vm.max_map_count, 65530 solo cuando se recomienda 262144.
Problema
El problema es que vm.max_map_count parece inmutable:
Cambiando bajo raíz
sudo sysctl -w vm.max_map_count=262144
devoluciones
error: permiso denegado en la clave 'vm.max_map_count'
Mientras
ps aux | grep java
Devuelve solo el proceso grep
Cambio en el inicio de Elasticsearch
sudo service elasticsearch start
También devuelve error
error: permiso denegado en la clave 'vm.max_map_count'
Inicio de Elasticsearch: [OK]
Cambios manuales a través del archivo (hack sucio-sucio):
sudo vi /proc/sys/vm/max_map_count
Tampoco funciona:
"/ proc / sys / vm / max_map_count" [solo lectura] 1L, 6C
- INSERTAR - W10: Advertencia: Cambiar un archivo de solo lectura
E45: la opción 'solo lectura' está establecida (¡agregar! Para anular)
"/ proc / sys / vm / max_map_count" E212: no se puede abrir el archivo para escribir
Mientras
ls -la /proc/sys/vm/ | grep max_map_count
Devoluciones
-rw-r - r-- 1 raíz raíz 0 10 de abril 09:36 max_map_count
(Pero supongo que esto puede ser normal para Linux hablando del directorio / proc)
Entonces, ¿cómo puedo cambiar el valor de esta variable? Reiniciar Elasticsearch todas las noches no es una buena idea ... ¿O al menos alguien sabe por qué ocurre este error?
fuente
Respuestas:
ya casi está allí, no importa si es una máquina virtual o una máquina física, esa configuración siempre se puede cambiar.
Te mostraré 3 métodos.
Alguna información previa:
1) Es mejor ejecutar como root, si es posible.
2) / proc en Unix no es un sistema de archivos real, es un sistema de archivos kernel en memoria, pero parece ser como un sistema de archivos de disco normal. Puede llamarlo 'sistema de archivos falso' o 'sistema de archivos especial', no puede editar esos archivos falsos con vi o cualquier otro editor, porque no son archivos, solo se ven como archivos. Me quedé con el mismo problema hace años.
Pero es simple cambiar sus valores, solo requiere otro tipo de 'mecánica' para editarlos.
Explicaré: Primero, debe ser root: (sudo funciona en algunas distribuciones, pero no en otras distribuciones como las que probaste, este primer método es universal y funciona en cualquier Linux, macOS o cualquier basado en Unix Espero que tengas acceso a la contraseña de root.
Proceder a la solicitud:
Ingrese la contraseña de root.
Ahora que es root, verifiquemos el valor actual de: / proc / sys / vm / max_map_count
Vamos a cambiarlo:
Vamos a verificar:
¡Se hace! Y ya está aplicado y es funcional. Al cambiar los valores de cualquier pseudoarchivo en / proc, la configuración se activa instantáneamente. Pero no persisten después de un reinicio. Puede jugar con valores y medir cambios de rendimiento en elasticsearh o cualquier otra aplicación o métrica del sistema. Vaya afinando su sistema, escribiendo los valores en algún papel, mantenga los mejores valores. En cualquier error, reinicie y todos volverán a sus valores originales, y comenzarán de nuevo hasta que todos los valores deseados sean óptimos. Hay muchos parámetros ajustables de disco y memoria en / proc. Y hacen una gran diferencia y ganancia de rendimiento si los sintonizas bien (y tienes tiempo para ello). Estás en la dirección correcta.
Cuando esté satisfecho, hagámoslos permanentes:
Primer método:
usando /etc/rc.local
ponga todos los parámetros dentro del archivo rc.local, por ejemplo:
salga del editor vi guardando el archivo.
Esos parámetros se establecerán en cada reinicio, DESPUÉS de que todos los servicios de inicio hayan comenzado, justo antes de que aparezca el mensaje de inicio de sesión.
(El archivo /etc/rc.local se ejecuta después de todos los servicios de inicio de Linux, puede no funcionar si Elasticsearch se inicia antes como un servicio, pero este método puede ser útil en otra configuración si lo necesita en el futuro, o puede usarlo así poniéndolos dentro de su secuencia de comandos de inicio de Elasticsearch, porque la secuencia de comandos de inicio se ejecuta como raíz, por lo que es la misma sintaxis anterior para usar dentro de las secuencias de comandos de inicio)
También puede copiarlos ahora y pegarlos para realizar cambios instantáneos. Los parámetros anteriores son válidos, ajustados y se ejecutan en mi servidor Apache Cassandra. Si lo desea, pruébelos como punto de partida para ajustar el suyo.
Segundo método para hacerlos permanentes:
Los parámetros ahora se establecerán ANTES de cualquier servicio de inicio en Linux.
Edite /etc/sysctl.conf , coloque los parámetros dentro
continúe con los demás, guarde /etc/sysctl.conf , reinicie su servidor para aplicar los cambios o ejecute: sysctl -p para aplicar los cambios sin reiniciar. Serán permanentes durante los reinicios.
Dos métodos anteriores son los más comunes. Hay otro, y puede funcionar para usted, es mediante el uso de sudo , casi como lo estaba haciendo:
en lugar de:
tratar:
Funciona en ubuntu.
Verificar:
Espero haber ayudado de alguna manera, al menos dando las 3 opciones diferentes para tratar el problema, ya que hace casi un año su pregunta;)
Saludos, Rafael Prado
fuente
Creo que su "máquina virtual" es en realidad un contenedor OpenVZ (que puede verificar esto ejecutando
virt-what
).En este caso, no puede cambiar
vm.max_map_count
sysctl o muchos otros. Los valores son fijos.Este es un problema bien conocido con elasticsearch ( problema # 4978 ). No es solo Elasticsearch. Se sabe que las aplicaciones Java funcionan mal en varios proveedores de OpenVZ, principalmente porque los hosts a menudo están mal ajustados y no hay nada que puedas hacer al respecto. Un comentarista sobre ese tema se hizo eco de cuál sería exactamente mi recomendación:
fuente
Puede seguir las instrucciones oficiales:
Para realizar un cambio permanente, actualice la configuración de vm.max_map_count en /etc/sysctl.conf
Ver https://www.elastic.co/guide/en/elasticsearch/reference/current/vm-max-map-count.html
fuente