了解elasticsearch jvm堆的使用情况

2024-03-15

Folks,

我正在尝试减少 Elasticsearch 部署(单节点集群)中的内存使用量。

我可以看到正在使用 3GB JVM 堆空间。 为了优化,我首先需要了解瓶颈。 我对 JVM 使用如何分配的了解有限。

字段数据看起来消耗 1.5GB,过滤器缓存和查询缓存合计消耗不到 0.5GB,最多可达 2GB。

有人可以帮我了解elasticsearch 消耗了 1GB 的剩余空间吗?


我无法告诉你确切的设置,但为了知道你的堆中发生了什么,你可以将 jvisualvm 工具(与 jdk 捆绑在一起)与 marvel 或大桌面插件 http://bigdesk.org/(我的偏好)和_cat APIs https://www.elastic.co/guide/en/elasticsearch/reference/current/cat.html来分析发生了什么。

正如您所注意到的,堆托管三个主要缓存,即:

  • the 字段数据缓存 https://www.elastic.co/guide/en/elasticsearch/reference/2.2/modules-fielddata.html:默认情况下无界,但可以通过以下方式控制indices.fielddata.cache.size(在你的例子中,它似乎占堆的 50% 左右,可能是由于现场数据断路器 https://www.elastic.co/guide/en/elasticsearch/reference/2.2/circuit-breaker.html#fielddata-circuit-breaker)
  • the 节点查询/过滤缓存 https://www.elastic.co/guide/en/elasticsearch/reference/2.2/query-cache.html:堆的 10%
  • the 分片请求缓存 https://www.elastic.co/guide/en/elasticsearch/reference/2.2/shard-request-cache.html:堆的 1%,但默认禁用

有很好的思维导图可用here http://igor.kupczynski.info/2015/04/06/fielddata.html(感谢 Igor Kupczyński)总结了缓存的作用。这就留下了大约 30% 的堆(在你的例子中为 1GB)用于 ES 需要创建的所有其他对象实例,以便正常运行(稍后会详细介绍)。

这是我在本地环境中进行的操作。首先,我重新启动了我的节点(使用Xmx1g)并等待绿色状态。然后我启动了 jvisualvm 并将其挂接到我的 elasticsearch 进程上。我从“采样器”选项卡中获取了堆转储,以便稍后可以将其与另一个转储进行比较。我的堆最初看起来像这样(到目前为止仅分配了最大堆的 1/3):

我还检查了我的字段数据和过滤器缓存是否为空:

为了确定一下,我也跑了/_cat/fielddata正如您所看到的,自节点刚刚启动以来,字段数据还没有使用堆。

$ curl 'localhost:9200/_cat/fielddata?bytes=b&v'
id                     host       ip            node    total 
TMVa3S2oTUWOElsBrgFhuw iMac.local 192.168.1.100 Tumbler     0 

这是最初的情况。现在,我们需要稍微预热一下,所以我启动了后端和前端应用程序,给本地 ES 节点施加一些压力。

一段时间后,我的堆看起来像这样,所以它的大小或多或少增加了 300 MB(139MB -> 452MB,不多,但我在一个小数据集上运行了这个实验)

我的缓存也增长了一点,达到了几兆字节:

$ curl 'localhost:9200/_cat/fielddata?bytes=b&v'
id                     host       ip            node      total 
TMVa3S2oTUWOElsBrgFhuw iMac.local 192.168.1.100 Tumbler 9066424

此时,我进行了另一个堆转储以深入了解堆的演变过程,我计算了保留尺寸 https://stackoverflow.com/questions/12600744/what-does-retained-size-mean-in-jvisualvms-memory-inspector的对象,我将其与启动节点后拍摄的第一个转储进行了比较。比较如下:

在保留大小增加的对象中,他通常怀疑当然是地图以及任何与缓存相关的实体。但我们还可以找到以下类:

  • NIOFSDirectory https://lucene.apache.org/core/5_3_0/core/org/apache/lucene/store/NIOFSDirectory.html用于读取文件系统上的 Lucene 段文件
  • 许多字符数组或字节数组形式的内部字符串
  • 文档值相关类
  • Bit sets
  • etc

正如您所看到的,堆托管三个主要缓存,但它也是 Elasticsearch 进程需要的所有其他 Java 对象的驻留位置,这些对象不一定与缓存相关。

因此,如果您想控制堆的使用,显然您无法控制 ES 正常运行所需的内部对象,但您绝对可以影响缓存的大小。如果您点击第一个项目符号列表中的链接,您将准确了解可以调整哪些设置。

此外,调整缓存可能不是唯一的选择,也许您需要重写一些查询以更加内存友好,或者更改分析器或映射中的某些字段类型等。在没有更多信息的情况下,很难判断您的情况,但这应该会给你一些线索。

继续以与我在这里相同的方式启动 jvisualvm 并了解当您的应用程序(搜索+索引)访问 ES 时您的堆如何增长,您应该快速了解其中发生的情况。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

了解elasticsearch jvm堆的使用情况 的相关文章

随机推荐

  • robots.txt htaccess 阻止谷歌

    在我的 htaccess 文件中 我有
  • 当我尝试通过 js split 解析时,第一个元素是空字符串

    我尝试解析ini文件 第一个字符串是空字符串 但其他字符串还可以 结构 sensor1 param1 value sensor2 param1 value param2 value 我的代码是 success function data v
  • 如果我使用支持库 26,为什么选项菜单项会被挤压? [关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 选项菜单项的大小与支持库 25 的大小相同 但当我使用 26 0 0 时 它们都会被挤压 菜单项 XML menu me
  • 用我自己的值初始化pytorch卷积层

    我想知道是否有办法用我自己的值初始化 pytorch 卷积过滤器 例如 我有一个元组 0 8423 0 3778 3 1070 2 6518 我想用这些值初始化 2X2 过滤器 我该怎么做 我查找了一些答案 但他们大多使用火炬正态分布和其他
  • Puppeteer 等待所有图像加载然后截图

    我在用傀儡师 https github com GoogleChrome puppeteer尝试在所有图像加载后截取网站的屏幕截图 但无法使其正常工作 这是到目前为止我正在使用的代码https www digg com https www
  • 使用position_dodge绘制geom_segment

    我有一个数据集 其中包含个人随时间的工作地点信息 更具体地说 我有关于个人在特定工作场所工作的时间间隔的信息 library tidyverse library lubridate individual A a id lt c rep A
  • 为什么我的 venv 使用的 pip 版本与我安装的不同

    我正在设置虚拟环境 我收到有关过时 pip 19 2 的警告 因此我在全球范围内更新了我的 macos 系统上的 pip sudo H python3 m pip install upgrade pip 它似乎有效 但是当我制作新的 ven
  • 如何使用 CSS/Javascript 根据窗口高度使 div 在两个 div 之间自动调整其高度?

    我有一个 div 位于正文顶部 另一个 div 位于正文底部 现在我想在这两个 div 之间放置一个 div 并使其高度占据这两个 div 之间的最大可用空间 这两个 div 之间的垂直空间不是固定的 这意味着当用户减小 增加窗口的高度时
  • Android Studio 观察表达式持久性

    每次调试后 Android Studio 都会删除我的所有监视表达式 我怎样才能强制它保留我的手表并将它们保存在项目中 据我所知 没有办法保存手表 但是 您可以使用 自动变量模式 左下角调试器选项卡 gt gt 设置按钮 这将清理调试器变量
  • 在 keyDown 事件中获取修饰符Flags,而无需同时按下非修饰键!

    我在 NSDocument 应用程序中对 NSWindow 进行了子类化 以便接收 keyDown 事件 我在我的子类中使用了以下代码 void keyDown NSEvent theEvent NSLog keyDown if theEv
  • 如何在 ILNumerics 中配置刻度标签位置?

    I draw some lines with ILLinePlot 然后我旋转立方体 目的是更改从顶部开始的 Y 刻度标签的位置 Rotation Matrix4 Rotation new Vector3 1 0 0 ILMath pif
  • 显示构建日期

    我目前有一个应用程序在其标题窗口中显示内部版本号 这很好 但对大多数用户来说没有任何意义 他们想知道他们是否拥有最新版本 他们倾向于将其称为 上周四的 而不是版本 1 0 8 4321 计划是将构建日期放在那里 例如 应用程序构建于 21
  • 当我从另一个方法调用方法时,React-native Bridge 为零

    但我注意到 每当我从另一个方法调用它时 我的桥变量都是零 我相信这是因为只有在从 javascript 调用桥接方法时才会设置桥接 我已经尝试了从创建委托到创建 SingleTon 类的所有方法 以上都不起作用 我不明白为什么它只能在我从
  • Streamfield 中的 Wagtail SnippetChooserBlock

    我在从片段中获取值时遇到一些问题 我已使用片段选择器块将其包含到流场中 生物片段 register snippet class BioSnippet models Model name models CharField max length
  • 无法引用函数,因为它是已删除的函数

    你好 我正在从一本书上学习 C 正在做下面的练习题 编写一个接受并返回 istream 的函数 该函数应该读取流 直到到达文件末尾 该函数应将其读取的内容打印到标准输出 在返回流之前重置流使其有效 include stdafx h incl
  • OBD2 - ELM327蓝牙模拟器[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在开发 Android 应用程序 用于通过蓝牙连接到汽车单元的 ELM327 有没有模拟器可以通过
  • 使用 Gradle 添加到 WAR 包中的错误文件

    我正在使用 Gradle 1 5 并且我正在尝试适应战争插件 http www gradle org docs current userguide war plugin html到 Eclipse 动态项目 当 WAR 被 eclipse
  • 禁用该复选框时不应进行更新

    我有两页 一页是管理员 另一页是教师 管理员将科目分配给教师 教师只想选择所需的时间 我的问题是我不想对禁用的复选框执行更新查询 我已经尝试了下面的代码 但它也在更新禁用复选框 using SqlConnection con2 new Sq
  • 当 A-lx 是奇异且无解时的特征向量

    R 如何找到以下矩阵的特征向量 特征值是 2 2 所以特征向量需要求解solve matrix c 0 1 0 0 2 2 这是无解的奇异矩阵 gt eigen matrix c 2 1 0 2 2 2 values 1 2 2 vecto
  • 了解elasticsearch jvm堆的使用情况

    Folks 我正在尝试减少 Elasticsearch 部署 单节点集群 中的内存使用量 我可以看到正在使用 3GB JVM 堆空间 为了优化 我首先需要了解瓶颈 我对 JVM 使用如何分配的了解有限 字段数据看起来消耗 1 5GB 过滤器