Hi everyone,
I try since few weeks to optimize my Kibana/ELK because it's really slow, and I really don't know what can I do more now :(.
When I update the Discover view, from one date to another by example, it takes more than 10 seconds to display, and I have only 33k documents in my index for now.
In the "Kibana/Inspect part", it indicates a query time of 330ms for a request data > 6000ms.
However when I have no documents, it's fast.
My conf is : (I precise we need to use docker, so we can't remove this part).
- 
a cluster of 3 nodes for Elastic, each one of them is in a docker container on a remote host : XXX...137, XXX...140 and XXX... 143
2 of them with JVM 8G, the third with JVM 4G (I don't have more RAM on this server right now).
The data are stored directly on the host (no cloud or NFS mount). Only the certificates are saved in a NFS mounted server. - 
same for Kibana : in a docker container on a dedicated host XXX...136
 
My cluster is green. ES & Kibana are in version 7.11.0.
At the end, my index would have less than 1M documents so I have 1 primary shard & 1 replica.
Here is GET /_cat/nodes?v
ip             heap.percent ram.percent cpu load_1m load_5m load_15m node.role  master name
XXX..143           69          90   4    0.12    0.16     0.11 cdhilmrstw *      prod_es_node_03
XXX..137           32          47   2    0.14    0.14     0.24 cdhilmrstw -      prod_es_node_01
XXX..140           48          48   6    0.08    0.15     0.27 cdhilmrstw -      prod_es_node_02
Here is my docker-compose for each node :
version: "3.7"
services:
  es01:
    image: docker.elastic.co/elasticsearch/elasticsearch:${DOCKER_ES_VERSION}
    container_name: es01
    restart: unless-stopped
    environment:
      - cluster.name=${ENV}_docker-cluster
      - node.name=${ENV}_es_node_01
      - node.master=true
      - node.data=true
      - cluster.initial_master_nodes=${ENV}_es_node_01,${ENV}_es_node_02,${ENV}_es_node_03
      - discovery.seed_hosts=XXX..137,XXX..140,XXX..143
      - network.host=XXX..137
      - bootstrap.memory_lock=true
      - ES_JAVA_OPTS=-Xms8g -Xmx8g
      - ELASTIC_PASSWORD=${DOCKER_ES_PASSWORD}
      - xpack.security.enabled=true
      - xpack.security.http.ssl.enabled=false # Communication avec client http
      - xpack.security.http.ssl.verification_mode=certificate
      - xpack.security.http.ssl.key=${DOCKER_ES_CERTS_PATH}/es01/es01.key
      - xpack.security.http.ssl.certificate_authorities=${DOCKER_ES_CERTS_PATH}/ca/ca.crt
      - xpack.security.http.ssl.certificate=${DOCKER_ES_CERTS_PATH}/es01/es01.crt
        - xpack.security.transport.ssl.enabled=true # Communication entre nodes
        - xpack.security.transport.ssl.verification_mode=certificate
        - xpack.security.transport.ssl.certificate_authorities=${DOCKER_ES_CERTS_PATH}/ca/ca.crt
        - xpack.security.transport.ssl.certificate=${DOCKER_ES_CERTS_PATH}/es01/es01.crt
        - xpack.security.transport.ssl.key=${DOCKER_ES_CERTS_PATH}/es01/es01.key
        - path.logs=/usr/share/elasticsearch/my_logs
        - path.data=/usr/share/elasticsearch/data
        #- logger.org.elasticsearch.cluster.coordination.ClusterBootstrapService=TRACE
        #- logger.org.elasticsearch.discovery=TRACE
    network_mode: host
    volumes:
      - esData_01:/usr/share/elasticsearch/data
      - certs:${DOCKER_ES_CERTS_PATH}
    ulimits:
      memlock:
        soft: -1
        hard: -1
    logging:
      driver: "json-file"
      options:
        max-size: "100m"
        max-file: "3"
volumes:
  certs:
    driver: local
    driver_opts:
      type: 'none'
      o: 'bind'
      device: "${LOCAL_DATA_CERTS_PATH}"
  esData_01:
    driver: local
    driver_opts:
      type: 'none'
      o: 'bind'
      device: "${LOCAL_DATA_ES_PATH_ES01}"
Here is docker stats for node es01 :
CONTAINER ID        NAME                CPU %               MEM USAGE / LIMIT     MEM %               NET I/O             BLOCK I/O           PIDS
a45a2d904678        es01                5.24%               9.2GiB / 23.55GiB     39.07%              0B / 0B             0B / 32.5MB         126
Same for Kibana :
CONTAINER ID        NAME                CPU %               MEM USAGE / LIMIT   MEM %               NET I/O             BLOCK I/O           PIDS
e22190f819ea        kibana              0.03%               284.8MiB / 7.8GiB   3.57%               40MB / 26MB         0B / 0B             12
I don't get why I always have a low MEM USAGE for Kibana, but I read there is no way to increase the JVM for Kibana.
I also use the Opster tool to see if I could see something but nothing in particular.
So please if you have an idea, that would be so so great ! Because I'm completely stuck now and this state is not acceptable for my team for production environment.
Thanks for your help,






