java - 为什么弹性搜索容器内存使用量不断增加而很少使用?
问题描述
我已经使用 eks kubernetes 集群在 aws 中部署了 Elastic-search 容器。即使只有 3 个索引并且没有大量使用,容器的内存使用量也在不断增加。我正在使用 FluentD 将集群容器日志转储到弹性搜索中。除此之外,没有使用弹性搜索。我尝试使用-Xms512m -Xmx512m
. 它成功应用,但内存使用量在 24 小时内几乎翻了一番。我不确定我必须配置哪些其他选项。我尝试将 docker 图像从 更改elasticsearch:6.5.4
为elasticsearch:6.5.1
. 但问题依然存在。我也试过-XX:MaxHeapFreeRatio=50
java选项。
编辑:以下是来自 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 具有内存锁定等高级功能,它将您的进程地址空间锁定在 RAM 中。然而,防止 Kubernetes pod 占用非 JVM 内存的可靠方法是简单地设置一个 pod 可以消耗多少内存的限制。在您的 Kubernetes pod 规范集中resources.limits.memory
到您想要的内存上限,并且您的内存消耗不会超出该限制。当然,如果这是您的 JVM 配置的问题,ES pod 在达到限制时将失败并出现 OOM 错误。只要确保为系统资源分配了额外的空间,我的意思是,你的 pod 内存限制应该比你的最大 JVM 堆大小大一些。
另一方面,您可能会惊讶于 Kubernetes 实际上在幕后做了多少日志记录。考虑定期关闭不定期搜索的 Elasticsearch 索引以释放内存。
推荐阅读
- javascript - 运行 nodejs 应用程序时端口已在使用中
- google-app-maker - 下拉列表仅显示单个“页面”数据
- python - 打印满足以下等式的素数
- javascript - 根据所选选项显示 SQL 查询
- corda - 如何在 Corda 保险库中查询包含特定日期范围内的 Date 属性的状态?
- python - 带有 PySide2 和 Pyinstaller 的应用程序在 linux 中生成 192MB 文件,但在 windows 中生成 70mb
- c# - 在生产中出现错误,而不是在开发或 QA 中 - 无法加载文件或程序集'DocumentFormat.OpenXml,版本 = 2.7.2.0
- apache-spark - 运行 spark-shell 会导致“连接被拒绝”
- c# - 反斜杠在 WebGet 中未被识别为参数
- github - 如何在 Visual Studio 中使用“make”解决此问题