java - 为什么 elastic-search 容器的内存使用量一直在增加而很少使用?

标签 java docker elasticsearch kubernetes fluentd

我已经使用 eks kubernetes 集群在 aws 中部署了 Elastic-search 容器。即使只有 3 个索引并且没有大量使用,容器的内存使用量也会不断增加。我正在使用 FluentD 将集群容器日志转储到 Elasticsearch 中。除此之外,没有使用 Elasticsearch 。我尝试使用 -Xms512m -Xmx512m 应用最小/最大堆大小。它应用成功,但内存使用量在 24 小时内几乎翻了一番。我不确定我还需要配置哪些其他选项。我尝试将 docker 图像从 elasticsearch:6.5.4 更改为 elasticsearch:6.5.1。但问题依然存在。我还尝试了 -XX:MaxHeapFreeRatio=50 java 选项。

检查来自 kibana 的屏幕截图。 enter image description here

编辑:以下是 Elastic-search 启动时的日志:

[2019-03-18T13:24:03,119][WARN ][o.e.b.JNANatives         ] [es-79c977d57-v77gw] Unable to lock JVM Memory: error=12, reason=Cannot allocate memory
[2019-03-18T13:24:03,120][WARN ][o.e.b.JNANatives         ] [es-79c977d57-v77gw] This can result in part of the JVM being swapped out.
[2019-03-18T13:24:03,120][WARN ][o.e.b.JNANatives         ] [es-79c977d57-v77gw] Increase RLIMIT_MEMLOCK, soft limit: 16777216, hard limit: 16777216
[2019-03-18T13:24:03,120][WARN ][o.e.b.JNANatives         ] [es-79c977d57-v77gw] These can be adjusted by modifying /etc/security/limits.conf, for example: 
    # allow user 'elasticsearch' mlockall
    elasticsearch soft memlock unlimited
    elasticsearch hard memlock unlimited
[2019-03-18T13:24:03,120][WARN ][o.e.b.JNANatives         ] [es-79c977d57-v77gw] If you are logged in interactively, you will have to re-login for the new limits to take effect.
[2019-03-18T13:24:03,397][INFO ][o.e.e.NodeEnvironment    ] [es-79c977d57-v77gw] using [1] data paths, mounts [[/usr/share/elasticsearch/data (/dev/xvda1)]], net usable_space [38.6gb], net total_space [96.8gb], types [ext4]
[2019-03-18T13:24:03,397][INFO ][o.e.e.NodeEnvironment    ] [es-79c977d57-v77gw] heap size [503.6mb], compressed ordinary object pointers [true]
[2019-03-18T13:24:03,469][INFO ][o.e.n.Node               ] [es-79c977d57-v77gw] node name [es-79c977d57-v77gw], node ID [qrCUCaHoQfa3SXuTpLjUUA]
[2019-03-18T13:24:03,469][INFO ][o.e.n.Node               ] [es-79c977d57-v77gw] version[6.5.1], pid[1], build[default/tar/8c58350/2018-11-16T02:22:42.182257Z], OS[Linux/4.15.0-1032-aws/amd64], JVM[Oracle Corporation/OpenJDK 64-Bit Server VM/11.0.1/11.0.1+13]
[2019-03-18T13:24:03,469][INFO ][o.e.n.Node               ] [es-79c977d57-v77gw] JVM arguments [-Xms1g, -Xmx1g, -XX:+UseConcMarkSweepGC, -XX:CMSInitiatingOccupancyFraction=75, -XX:+UseCMSInitiatingOccupancyOnly, -XX:+AlwaysPreTouch, -Xss1m, -Djava.awt.headless=true, -Dfile.encoding=UTF-8, -Djna.nosys=true, -XX:-OmitStackTraceInFastThrow, -Dio.netty.noUnsafe=true, -Dio.netty.noKeySetOptimization=true, -Dio.netty.recycler.maxCapacityPerThread=0, -Dlog4j.shutdownHookEnabled=false, -Dlog4j2.disable.jmx=true, -Djava.io.tmpdir=/tmp/elasticsearch.oEmM9oSp, -XX:+HeapDumpOnOutOfMemoryError, -XX:HeapDumpPath=data, -XX:ErrorFile=logs/hs_err_pid%p.log, -Xlog:gc*,gc+age=trace,safepoint:file=logs/gc.log:utctime,pid,tags:filecount=32,filesize=64m, -Djava.locale.providers=COMPAT, -XX:UseAVX=2, -Des.cgroups.hierarchy.override=/, -Xms512m, -Xmx512m, -Des.path.home=/usr/share/elasticsearch, -Des.path.conf=/usr/share/elasticsearch/config, -Des.distribution.flavor=default, -Des.distribution.type=tar]
[2019-03-18T13:24:05,082][INFO ][o.e.p.PluginsService     ] [es-79c977d57-v77gw] loaded module [aggs-matrix-stats]
[2019-03-18T13:24:05,082][INFO ][o.e.p.PluginsService     ] [es-79c977d57-v77gw] loaded module [analysis-common]
[2019-03-18T13:24:05,082][INFO ][o.e.p.PluginsService     ] [es-79c977d57-v77gw] loaded module [ingest-common] ....

最佳答案

Kubernetes 中的 Pod 内存使用量不等同于 JVM 内存使用量——要获得该统计数据,您必须直接从 JVM 中提取指标。 Pod 内存使用情况,取决于您查询的指标,除了应用程序内存之外,还可以包括页面缓存和交换空间,因此从您提供的图表中看不出什么在此处实际消耗内存。根据问题所在,Elasticsearch 具有高级功能,例如 memory locking ,这将锁定您在 RAM 中的进程地址空间。但是,防止 Kubernetes pod 耗尽非 JVM 内存的可靠方法是简单地限制 pod 可以消耗的内存量。在您的 Kubernetes pod 规范中,将 resources.limits.memory 设置为您想要的内存上限,您的内存消耗不会超出该限制。当然,如果这是您的 JVM 配置问题,ES pod 将在达到限制时失败并出现 OOM 错误。只需确保您为系统资源分配了额外的空间,我的意思是,您的 pod 内存限制应该略大于您的最大 JVM 堆大小。

另一方面,您可能会惊讶于 Kubernetes 实际上在幕后进行了多少日志记录。定期考虑closing Elasticsearch indexes不会定期搜索以释放内存。

关于java - 为什么 elastic-search 容器的内存使用量一直在增加而很少使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55155385/

相关文章:

elasticsearch - 如何使用ElasticSearch中的脚本将多个标签添加到现有列表

elasticsearch - Vagrant 和 Elasticsearch 的端口问题

elasticsearch - Elasticsearch中的不相等查询

java - 给定一组点,找到三角形的最大数量

java - 组织.hibernate.MappingException : No Dialect mapping for JDBC type: 1111

docker - 出现EOF错误时如何获得2个容器进行链接

docker - 带有组合文件的Docker群,将架构设置为arm64

java - 通过扫描仪使用目录中的多个文件 (Java)

Java 和 dom (org.dom4j)

postgresql - 数据目录由 PostgreSQL 版本 13 初始化,与此版本 14.0 不兼容