No se puede cambiar vm.max_map_count para elasticsearch

14

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:

  1. 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

  2. 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]

  3. 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?

Valentina
fuente
3
¿Qué tipo de máquina es? ¿Virtual? Si es así, ¿qué tipo de virtualización se utiliza? Tenga en cuenta que algunas virtualizaciones, por ejemplo, los contenedores OpenVZ imponen limitaciones en su contenedor, y no le permiten "ajustar" el kernel y otras cosas de bajo nivel.
Miroslav Koškár
@MiroslavKoskar No lo sé, desafortunadamente. ¿Cómo puedo averiguarlo?
Valentina
@MiroslavKoskar Olvidé mencionar que la máquina es virtual, por supuesto
Valentina
1
¿Cómo averiguarlo? Bueno, ¿dónde está alojado? Debería ser bastante obvio porque generalmente es parte de su contrato con su proveedor de alojamiento. Si aún tiene dudas, comuníquese con el soporte de su proveedor de alojamiento, en mi humilde opinión, es el mejor lugar para comenzar (ya que generalmente es parte del trato y es algo por lo que probablemente esté pagando).
Miroslav Koškár
@MiroslavKoskar bien, el proveedor respondió sin mencionar la tecnología que no pueden ayudarme con este problema (eso es bastante razonable). Gracias por tu ayuda
Valentina

Respuestas:

13

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:

    $ su root

Ingrese la contraseña de root.

Ahora que es root, verifiquemos el valor actual de: / proc / sys / vm / max_map_count

    $ cat /proc/sys/vm/max_map_count  
    65536

Vamos a cambiarlo:

    echo 262144 > /proc/sys/vm/max_map_count

Vamos a verificar:

    cat /proc/sys/vm/max_map_count
    262144

¡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

    vi /etc/rc.local 

ponga todos los parámetros dentro del archivo rc.local, por ejemplo:

    echo 220000000 > /proc/sys/vm/dirty_background_bytes
    echo 320000000 > /proc/sys/vm/dirty_bytes
    echo 0 > /proc/sys/vm/dirty_background_ratio
    echo 0 > /proc/sys/vm/dirty_ratio
    echo 500 > /proc/sys/vm/dirty_writeback_centisecs
    echo 4500 > /proc/sys/vm/dirty_expire_centisecs
    echo 1 > /proc/sys/net/ipv4/tcp_rfc1337
    echo 10 > /proc/sys/vm/swappiness
    echo never > /sys/kernel/mm/transparent_hugepage/enabled
    echo never > /sys/kernel/mm/transparent_hugepage/defrag
    echo 120 > /proc/sys/net/ipv4/tcp_keepalive_time
    echo 0 > /proc/sys/vm/zone_reclaim_mode
    echo deadline > /sys/block/sda/queue/scheduler
    echo 8 > /sys/class/block/sda/queue/read_ahead_kb
    echo 1048575 > /proc/sys/vm/max_map_count

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

 vm.max_map_count=1048575
 vm.zone_reclaim_mode=0
 vm.dirty_background_bytes=220000000
 vm.dirty_background_ratio=0
 vm.dirty_bytes=320000000
 vm.dirty_ratio=0
 vm.swappiness=10

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:

  sudo sysctl -w vm.max_map_count=262144

tratar:

  echo 262144 | sudo tee /proc/sys/vm/max_map_count

Funciona en ubuntu.

Verificar:

   user@naos:~$ cat /proc/sys/vm/max_map_count
   262144

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

usuario62739
fuente
3
Ya hicieron esto, y falló.
Michael Hampton
1
Hola Michael, sí, tienes razón. Al principio entendí que el problema estaba relacionado con el sistema operativo CentOS y los permisos de usuario de Unix, así que seguí esa línea en mi respuesta. Pero la información más reciente pone el foco del problema en el "host" OpenVZ, que limita algunas configuraciones. Mi conocimiento está en Centos y VmWare, pero no en OpenVZ.
user62739
4

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_countsysctl 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:

joshuajonah comentó el 20 de octubre de 2015
Esto es una locura. Supongo que me voy a cambiar a un KVM VPS.

Michael Hampton
fuente