【问题标题】:Facing memory issues with elastic search while indexing索引时面临弹性搜索的内存问题
【发布时间】:2018-01-04 20:29:32
【问题描述】:

我有 3 个 16GB 的节点(aws elasticsearch 服务)用于弹性搜索服务。我已将我的 ES 配置为具有 3 个分片和 2 个副本。这 3 个节点负责数据的索引和数据的查询和获取。

所有 3 个的堆分配为 7GB。

数据分为 2 个索引,即 index1 和 index2。 Index1 没有太多数据,文档大小很小。 Index2 是较重的索引,但其中的最大文档大小也是 1MB。

但是,在为 index2 索引某些文档时,很多时候 ES 实例之一会抛出 OutOfMemoryException。我检查了分片内存,index2 中总共有 3.5 GB 的文档数据。

我无法找出导致此问题的原因并寻求调试问题的帮助。

文档的结构类似于:

    {  
        "name":"ABC",
        "class":10,
        "school":"XYZ",
        "subjects":[  
               {  
                  "A":{  
                  "name":"subject a",
                  "marks":80,
                  "passed":true
                  }
               },
               {  
                 "B":{  
                   "name":"subject B",
                   "marks":76,
                   "passed":true
               }
            }
        ]
      }

“subjects”键中的数组最长可达 3000。

使用的 ES 版本是 5.1.0。

在下面找到堆栈跟踪:

[2017-07-28T15:44:13,912][WARN ][o.e.m.j.JvmGcMonitorService] [obLzpwI] [gc][849973] overhead, spent [26s] collecting in the last [26.1s]
[2017-07-28T15:44:13,895][WARN ][o.e.t.n.Netty4Transport  ] [obLzpwI] exception caught on transport layer [[!!!io.netty.channel.socket.nio.NioSocketChannel@650b7925=>java.lang.OutOfMemoryError:Compressed class space!!!]], closing connection
org.elasticsearch.ElasticsearchException: java.lang.OutOfMemoryError: Compressed class space
    at org.elasticsearch.transport.netty4.Netty4Transport.exceptionCaught(Netty4Transport.java:326) [transport-netty4-5.1.2.jar:5.1.2]
    at org.elasticsearch.transport.netty4.Netty4MessageChannelHandler.exceptionCaught(Netty4MessageChannelHandler.java:84) [transport-netty4-5.1.2.jar:5.1.2]
    at io.netty.channel.AbstractChannelHandlerContext.invokeExceptionCaught(AbstractChannelHandlerContext.java:296) [netty-transport-4.1.6.Final.jar:4.1.6.Final]
    at io.netty.channel.AbstractChannelHandlerContext.notifyHandlerException(AbstractChannelHandlerContext.java:861) [netty-transport-4.1.6.Final.jar:4.1.6.Final]
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:375) [netty-transport-4.1.6.Final.jar:4.1.6.Final]
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:359) [netty-transport-4.1.6.Final.jar:4.1.6.Final]
    at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:351) [netty-transport-4.1.6.Final.jar:4.1.6.Final]
    at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:293) [netty-codec-4.1.6.Final.jar:4.1.6.Final]
    at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:280) [netty-codec-4.1.6.Final.jar:4.1.6.Final]
    at io.netty.handler.codec.ByteToMessageDecoder.callDecode(ByteToMessageDecoder.java:396) [netty-codec-4.1.6.Final.jar:4.1.6.Final]
    at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:248) [netty-codec-4.1.6.Final.jar:4.1.6.Final]
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:373) [netty-transport-4.1.6.Final.jar:4.1.6.Final]
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:359) [netty-transport-4.1.6.Final.jar:4.1.6.Final]
    at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:351) [netty-transport-4.1.6.Final.jar:4.1.6.Final]
    at io.netty.channel.ChannelInboundHandlerAdapter.channelRead(ChannelInboundHandlerAdapter.java:86) [netty-transport-4.1.6.Final.jar:4.1.6.Final]
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:373) [netty-transport-4.1.6.Final.jar:4.1.6.Final]
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:359) [netty-transport-4.1.6.Final.jar:4.1.6.Final]
    at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:351) [netty-transport-4.1.6.Final.jar:4.1.6.Final]
    at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1334) [netty-transport-4.1.6.Final.jar:4.1.6.Final]
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:373) [netty-transport-4.1.6.Final.jar:4.1.6.Final]
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:359) [netty-transport-4.1.6.Final.jar:4.1.6.Final]
    at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:926) [netty-transport-4.1.6.Final.jar:4.1.6.Final]
    at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:129) [netty-transport-4.1.6.Final.jar:4.1.6.Final]
    at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:651) [netty-transport-4.1.6.Final.jar:4.1.6.Final]
    at io.netty.channel.nio.NioEventLoop.processSelectedKeysPlain(NioEventLoop.java:536) [netty-transport-4.1.6.Final.jar:4.1.6.Final]
    at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:490) [netty-transport-4.1.6.Final.jar:4.1.6.Final]
    at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:450) [netty-transport-4.1.6.Final.jar:4.1.6.Final]
    at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:873) [netty-common-4.1.6.Final.jar:4.1.6.Final]
    at java.lang.Thread.run(Thread.java:748) [?:1.8.0_131]
Caused by: java.lang.OutOfMemoryError: Compressed class space

【问题讨论】:

  • 你运行的是哪个 ES 版本?你能在日志中给我们完整的堆栈跟踪吗?文档是如何索引的(如果你可以显示一个小的 sn-p)?您的集群的设置是什么?你的指数?
  • @asettouf 使用堆栈跟踪和示例文档更新了问题。您在索引设置中到底在寻找什么?主要是 "settings" : { "index" : { "mapping" : { "total_fields" : { "limit" : "200000000" } }, "refresh_interval" : "1s", "number_of_shards" : "3", " max_result_window" : "200000", } } 除此之外,还有自定义的分析器和标记器。

标签: elasticsearch indexing lucene


【解决方案1】:

您正在用完压缩的类空间,而不是堆内存。这可以使用-XX: CompressedClassSpaceSize=1g 进行配置(作为示例值)。

您可以在 oracle 的文档here(倒数第二个)上阅读更多相关信息。

不过,这很可能只是治标不治本。

github issue 中描述的一些旧版本的弹性存在已知问题。这个特定问题是由为每个请求编译一个唯一的脚本引起的。如果这听起来与您的问题相关,则可能值得使用触发异常的实际 API 调用来更新您的答案。

【讨论】:

  • 非常感谢。它确实奏效了。我可能已经能够发现问题。我们的系统中有很多动态脚本可能导致了这个问题。还有一件事,我如何确定 CompressedClassSpaceSize 的最佳值?
  • @Aayushi 虽然增加 CompressedClassSpaceSize 将在短期内起作用,但最好解决根本问题(消耗内存的动态脚本)。在这种情况下,我真的只会考虑改变这个价值来为你争取一些时间。话虽如此,我不知道有什么比反复试验更好的方法来获得正确的价值。
猜你喜欢
  • 2020-12-20
  • 2014-01-06
  • 2016-10-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多