Mejorar rendimiento visualización Kibana


(David Soler Balado) #1

Hola,

Estamos usando el stack 5.6.6 Kibana+ElasticSearch+Filebeat (no podemos subir la versión porque las máquinas son de 32 bits) para representar trazas de log con Kibana.

El rendimiento ha sido el adecuado hasta que hemos cargado un gran número de trazas, en concreto 41.000.000 de líneas para unos 15 días de datos, y pretendemos cargar varios meses o años. El problema lo tenemos con la visualización de datos de un mes o incluso de un día, llegando a un TimeOut en Kibana y no se representan los datos, y cuando lo hace, lo hace muy lentamente...

¿Qué soluciones podemos adoptar para mejorar el tiempo de carga de la visualización? Si añadimos a las trazas un campo ID_TRAZA que identificara unicamente cada traza... ¿se podría crear un ÍNDICE sobre este campo para agilizar la búsqueda?

ElasticSearch y Kibana no tienen cambios relevantes en la configuración, prácticamente por defecto.

El ajuste de JVM

-Xmx1G -Xms1G

Ajustes filebeat.yml

#=========================== Filebeat prospectors =============================
filebeat.prospectors:
- input_type: log
  paths:
    - C:\sac4\elastic5.6.6\logs\*json

  ### JSON configuration
  json.message_key: message
  json.keys_under_root: true
  json.overwrite_keys: true
  #json.add_error_key: false

#-------------------------- Elasticsearch output ------------------------------
output.elasticsearch:
  # Array of hosts to connect to.
  hosts: ["localhost:9200"]
  #workers: 6
  bulk_max_size: 8192

Mensaje apareciendo constantemente en ElasticSearch

[INFO] [o.e.m.j.JvmGcMonitorService] [qFb0Q93] [gc][7229] overhead, spent [555ms] collecting in the last [1.2s]

Muchas gracias por la ayuda :slight_smile:


(Gabriel Moskovicz) #2

Hola @davidsoler95,

Gracias por incluir todas estas informaciones.

Sin tener mucho un panorama del cluster de Elasticsearch, se me da que el nodo (entiendo que solo tienes un nodo) se esta quedando sin memoria suficiente para la cantidad de datos que precisas. Para tener una referencia, te puedo decir que un nodo master-data para un uso correcto precisaría algo así como al menos 8GB de Heap (16GB de RAM en la maquina) y dedicada unicamente para Elasticsearch.

Yo comenzaría por esto, ya que seguramente sea la única razón por lo que esto no esta funcionando correctamente.

Saludos!

--Gabriel


(David Soler Balado) #3

Gracias Gabriel, tenemos un dispositivo con solo 4GB de RAM, es una de las limitaciones actuales ya que estamos en un entorno "DEMO", pero trataremos de mejorar esta situación.

Por otro lado, si no indexamos ciertos campos que nunca vamos a utilizar creo que también podemos mejorar el rendimiento, ¿cómo se indica que no se quieren indexar ciertos campo?


(Gabriel Moskovicz) #4

Hola David,

Si se pueden dejar de indexar con la siguiente opcion: https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping-index.html

Sino, tambien puedes utilizar dynamic: false para no indexar campos aparte, y crear el indice de antemano: https://www.elastic.co/guide/en/elasticsearch/reference/current/dynamic.html.

En cuanto a la memoria, si tienes 4GB entonces por lo menos intenta ponerle un 50% a 2GB.

Saludos,

--Gabriel


(David Soler Balado) #5

Hola,

De nuevo, cosas que un novato no tiene del todo claras...
Para poder NO indexar un campo necesito hacer un mapping manual, ¿cierto? Y para ello necesito usar dynamic: false ¿correcto?

He extraido de Kibana mi mapping actual (hecho de forma dinámica) y he hecho algunos cambios, queda una cosa parecida a lo que se puede ver más abajo (he recortado la parte inferior por no ser necesaria)

He añadido dynamic: false al mapping_default_ e index: false en aquellos campos que no quiero indexar. Ahora... ¿qué hago con esto? ¿Dónde debo introducirlo?

Por otro lado, ¿qué pasa con los datos que ya están cargados en Elastic Search y representados en Kibana? ¿Debo regenerar los índices?

Gracias

{
  "order": 0,
  "template": "filebeat-*",
  "settings": {
    "index": {
      "mapping": {
        "total_fields": {
          "limit": "10000"
        }
      },
      "refresh_interval": "5s"
    }
  },
  "mappings": {
    "_default_": {
    	"dynamic": false,
      "_meta": {
        "version": "5.6.6"
      },
      "date_detection": false,
      "dynamic_templates": [
        {
          "strings_as_keyword": {
            "mapping": {
              "ignore_above": 1024,
              "type": "keyword"
            },
            "match_mapping_type": "string"
          }
        }
      ],
      "properties": {
        "@timestamp": {
          "type": "date"
        },
        "EMP": {
            
            "type": "keyword",
            "ignore_above": 1024
          },
          "FNT": {
            "index": false,
            "type": "keyword",
            "ignore_above": 1024
          },
          "ID1": {
            "type": "long"
          },
          "ID2": {
            "type": "long"
          },
          "ID3": {
            "type": "long"
          },
          "INST": {
            "index": false,
            "type": "keyword",
            "ignore_above": 1024
          },
          "LIN": {
            "index": false,
            "type": "long"
          },
          "MOD": {
            "type": "keyword",
            "ignore_above": 1024
          },
          "MSG": {
            "index": false,
            "type": "keyword",
            "ignore_above": 1024
          },
          "MSG_ID": {
            "type": "keyword",
            "ignore_above": 1024

          },
          "STR1": {
            "type": "keyword",
            "ignore_above": 1024
          },
          "STR2": {
            "type": "keyword",
            "ignore_above": 1024
          },
          "STR3": {
            "type": "keyword",
            "ignore_above": 1024
          },
          "TIPO": {
            "type": "keyword",
            "ignore_above": 1024
          }, 

Gracias de nuevo!


(Gabriel Moskovicz) #6

Hola David,

Te respondo entre lineas!

Exactamente, es una de las opciones. A mi criterio es la mejor.

Esto tienes que ponerlo en un index template. Sobre-escribir el template filebeat (puedes tomar los templates existentes con GET _templates. Y alli encontrar en nombre del template que quieres reemplazar (sobreescribir).

Si, toda la información que ya fue guardada no puede ser modificada. Tienes que recrear la información.

Saludos,
--Gabriel


(David Soler Balado) #7

Muchísimas gracias, Gabriel.

Haciendo un GET _template puedo ver que el template que he modificado manualmente, el que se puede ver en mi primer mensaje con las opciones de dynamic: false entre otros. ¿Eso significa que el template ya está bien cargado?

Sin embargo, en Management > Index Pattern todos los campos son searchable y aggregatable y, sino me equivoco un campo no indexado no debería ser searchable ¿no?

Los siguientes pasos serían eliminar los datos, eliminar el índice y crearlo de nuevo, ¿cierto? ¿Debo modificar el archivo de la carpeta filebeat filebeat.template.json?

Gracias de nuevo!


(Gabriel Moskovicz) #8

Hola David,

Tienes que reindexar o recrear los indices. Y luego de esto, vas a Management -> Index Pattern y tocas en el boton "Refresh Pattern" para refrescar el mapping desde Kibana y que vea los cambios que tu hiciste.

Saludos!
--Gabriel


(system) #9

This topic was automatically closed 28 days after the last reply. New replies are no longer allowed.