使用docker-compose部署ELK时推荐的RAM比例是多少?

22

我有一台配备8GB RAM的生产服务器,想要在服务器上使用Docker Compose托管Elastic、Logstash和Kibana。

请问每个容器所需的Java内存大小应该是多少?如何进行配置?

我的docker-compose文件如下:

---
version: '3'
services

  kibana:
    build:
      context: kibana/
    container_name: kibana
    volumes:
      - ./kibana/config/:/usr/share/kibana/config:ro
    networks: ['elk']
    depends_on:
      - elasticsearch
    restart: always

  elasticsearch:
    build:
      context: elasticsearch/
    container_name: elasticsearch
    networks: ['elk']
    volumes:
      - ./elastic-data:/usr/share/elasticsearch/data
      - ./elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml:ro
    restart: always
    ulimits:
      memlock:
        soft: -1
        hard: -1
      nofile:
        soft: 65536
        hard: 65536
    environment:
      - cluster.name=es-docker
      - node.name=node1
      - bootstrap.memory_lock=true

  logstash:
      build:
        context: logstash/
      container_name: logstash
      volumes:
        - ./logstash/pipeline/logstash.conf:/usr/share/logstash/pipeline/logstash.conf:ro
      networks: ['elk']
      ports:
        - "5044:5044"
      depends_on:
        - elasticsearch
      restart: always

networks: {elk: {}}

现在在弹性文档上搜索,我看到一些设置,例如 - "ES_JAVA_OPTS=-Xms512m -Xmx512m"

所以我想知道... 对于上面的docker-compose文件,我应该允许哪些java堆大小/内存限制,并如何更新compose文件以包含它。

我的想法是: 4GB用于elastic 2GB用于logstash 1GB用于Kibana

保留1GB供主机使用


1
如果在Logstash内有很多摄取过程,那么2GB可能不够用。1GB用于Kibana和主机大约是合适的。这样留下4GB供ES容器使用(其中2GB必须分配给堆,以便Lucene获得剩余的2GB)。这可能足够...或者不够...最终,这实际上取决于您的用例以及您想要在堆栈中执行什么操作。但调整大小应该反过来,首先衡量每个组件所需的数量,以支持您的用例,然后提供符合要求的主机。 - Val
你能解释一下我上面的评论哪里不清楚吗?如果有什么不清楚的地方,也许我可以添加更多细节,但主要问题在于没有足够的信息来评估你的尺寸是否合适。 - Val
你的评论认同我所使用的大小,并且非常有帮助。然而,它没有扩展如何在Docker Compose中实现。我需要设置什么环境选项,例如ES_JAVA_OPTS=-Xms512m -Xmx512m。此外,这只是对问题的评论,而不是答案。 - Robbo_UK
我的评论并不是想成为一个答案。我的目标是寻求更多关于您在推荐的Java堆大小方面提出的问题的信息。现在,假设这些大小是正确的,你需要知道的是如何在docker-compose中指定它们,对吧? - Val
1个回答

30

继续我们在上面评论中的讨论,并假设尺寸是正确的,现在你需要按照讨论的方式对每个Docker容器进行大小调整。请注意,由于您没有使用Swarm,因此您实际上不需要使用v3格式,v2就足够了,因此我已经修改了下面的版本行。我还在elasticsearch容器的环境部分中添加了mem_limit和堆大小。

version: '2.3'
services

  kibana:
    build:
      context: kibana/
    container_name: kibana
    volumes:
      - ./kibana/config/:/usr/share/kibana/config:ro
    networks: ['elk']
    depends_on:
      - elasticsearch
    restart: always
    mem_limit: 1g

  elasticsearch:
    build:
      context: elasticsearch/
    container_name: elasticsearch
    networks: ['elk']
    volumes:
      - ./elastic-data:/usr/share/elasticsearch/data
      - ./elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml:ro
    restart: always
    ulimits:
      memlock:
        soft: -1
        hard: -1
      nofile:
        soft: 65536
        hard: 65536
    environment:
      - cluster.name=es-docker
      - node.name=node1
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms2g -Xmx2g"
    mem_limit: 4g

  logstash:
      build:
        context: logstash/
      container_name: logstash
      volumes:
        - ./logstash/pipeline/logstash.conf:/usr/share/logstash/pipeline/logstash.conf:ro
      networks: ['elk']
      ports:
        - "5044:5044"
      depends_on:
        - elasticsearch
      restart: always
      mem_limit: 2g
      environment:
        - "LS_JAVA_OPTS=-Xmx1g -Xms1g"

networks: {elk: {}}

为什么mem_limit的值是java_ops的两倍?它们不应该相同吗? - Robbo_UK
3
mem_limit是给容器分配的内存大小,ES_JAVA_OPTS设置是给JVM分配的堆内存大小。你应该只把可用内存的一半分配给堆内存。 - Val
我刚刚看到了这个链接,它解释了为什么需要使用一半的内存大小。我想将其添加到这个答案中,以便下一个用户可以参考。 https://www.elastic.co/guide/en/elasticsearch/guide/current/heap-sizing.html 感谢您的帮助,Val! - Robbo_UK
有人知道在使用容器mem_limit时,“elasticsearch堆应该是机器内存的一半”的规则是否仍然适用吗?操作系统文件缓存与容器确实是分开管理的,由docker服务器的操作系统进行管理,对吗?似乎mem_limit可以是Java堆加上一些额外的Java代码,或者mem_limit真的需要是Java堆的两倍吗? - jamshid
服务.kibana的配置选项不受支持:'mem_limit'。 - fatemeh sadeghi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接