使用 docker-compose 为 ELK 推荐的 RAM 比率
Posted
技术标签:
【中文标题】使用 docker-compose 为 ELK 推荐的 RAM 比率【英文标题】:Recommended RAM ratios for ELK with docker-compose 【发布时间】:2019-01-03 14:19:15 【问题描述】:我有一个 8GB RAM 的生产服务器。我希望在服务器上托管弹性、logstash 和 kibana。使用 docker compose。
每个容器的推荐 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 用于弹性 2GB 用于 logstash Kibana 1GB
为主机保留 1GB
【问题讨论】:
如果您在 Logstash 中进行大量摄取,2GB 可能不够。 Kibana 和主机声音大约为 1GB。剩下的 4GB 用于 ES 容器(其中 2GB 必须影响到堆,以便 Lucene 获得剩余的 2GB)。这可能就足够了……或者不够……最后,这实际上取决于您的用例以及您想对堆栈做什么。不过,大小调整应该采用另一种方式,首先衡量每个组件需要多少才能支持您的用例,然后配置符合要求的主机。 你能解释一下我上面的评论中有什么不清楚的地方吗?如果有不清楚的地方,也许我可以添加更多细节,但这里的主要问题是没有足够的上下文信息来评估您的尺寸是否合适。 您的评论与我使用的尺寸一致,这真的很有帮助。然而,它并没有扩展我在 Docker 组合中的操作方式。我需要设置哪些环境选项.. .. 例如ES_JAVA_OPTS=-Xms512m -Xmx512m
。也是评论而不是问题的答案
我的评论无意成为答案。我的目标是寻求有关您对推荐的 Java 堆大小的问题的更多信息。现在,假设大小是正确的,你需要知道的是如何在 docker-compose 中指定它们,对吧?
【参考方案1】:
继续我们在上面 cmets 中的讨论,假设大小是正确的,您现在需要做的是按照所讨论的那样调整每个 Docker 容器的大小。请注意,由于您没有使用 Swarm,因此您实际上不需要使用 v3 格式,v2 就足够了,因此我修改了下面的 version
行。我还为每个容器添加了mem_limit
,并在elasticsearch
容器的environment
部分添加了堆大小。
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 的双重设置值?他们应该不一样吗?mem_limit
是分配给容器的内存量,ES_JAVA_OPTS
设置是分配给 JVM 的堆内存量。你应该只给堆可用内存的一半。
刚刚遇到这也解释了为什么需要一半大小。我想我会把它添加到下一个用户的这个答案中。 elastic.co/guide/en/elasticsearch/guide/current/… 感谢您的帮助 Val!
有谁知道“elasticsearch 堆应该是机器内存的一半”规则在使用容器 mem_limit 时是否仍然适用?操作系统文件缓存真的和容器是分开的,它是由 docker 服务器的操作系统来管理的,对吧?似乎 mem_limit 可以是 java 堆加上一些额外的 java 代码,还是 mem_limit 真的需要是 java 堆的两倍?以上是关于使用 docker-compose 为 ELK 推荐的 RAM 比率的主要内容,如果未能解决你的问题,请参考以下文章
分布式ELK+KAFKA日志采集 docker-compose
基于docker-compose的 ELK5.5.1+logback 日志系统搭建