当前位置: 首页 > 知识库问答 >
问题:

elasticsearch集群运行中的Perm Gen空间问题

壤驷英叡
2023-03-14

我们正在运行带有6个节点的elasticsearch-1.5.1集群,最近几天我在集群中面临java.lang.OutOfMemoryError PermGen空间问题,这会影响到节点,同样也会掉下来。我正在重新启动特定节点以使其处于活动状态。

我们试图通过给集群重负载来解决这个问题,但不幸的是,它无法复制。但我们在生产过程中会一次又一次地遇到同样的问题。

这里介绍了一些yml文件配置

index.recovery.initial_shards: 1
index.query.bool.max_clause_count: 8192
index.mapping.attachment.indexed_chars: 500000
index.merge.scheduler.max_thread_count: 1
cluster.routing.allocation.node_concurrent_recoveries: 15
indices.recovery.max_bytes_per_sec: 50mb
indices.recovery.concurrent_streams: 5

内存配置

ES_HEAP_SIZE=10g
ES_JAVA_OPTS="-server -Des.max-open-files=true"
MAX_OPEN_FILES=65535
MAX_MAP_COUNT=262144

使用以下配置更新问题

我怀疑与此问题相关的merge.policy.max_merged_segment。我们有22个索引在我的集群。索引的merge.policy.max_merged_segment如下所示

  • 7个索引有20GB
  • 3个索引有10GB
  • 12个索引有5GB

使用进程信息更新

esuser XXXXX03年10月28日?1-02:20:40/usr/Java/default/bin/Java-xms10g-xmx10g-djava.awt.headless=true-xx:+useparnewgc-xx:+useconcmarksweepgc-xx:cmsinitiatingoccupancyfraction=75-xx:+usecmsinitiatingoccupancyonly-xx:+heapdumponoutofmemoryerror-xx:+disableexplicitgc-dfile.encoding=utf-8-server-des.max-open-files=true

下面是我在搜索时从elasticsearch集群获得的堆栈跟踪。但是事件在索引时间的同时,我也得到了同样的问题。根据我的观察,一些搜索/索引操作增加了PermGen,如果即将到来的操作试图使用PermGen空间,问题就来了。

[2015-10-03 06:45:05,262][WARN ][transport.netty          ] [es_f2_01] Message not fully read (response) for [19353573] handler org.elasticsearch.search.action.SearchServiceTransportAction$6@21a25e37, error [true], resetting
[2015-10-03 06:45:05,262][DEBUG][action.search.type       ] [es_f2_01] [product_index][4], node[GoUqK7csTpezN5_xoNWbeg], [R], s[INITIALIZING]: Failed to execute [org.elasticsearch.action.search.SearchRequest@5c2fe4c4] lastShard [true]
org.elasticsearch.transport.RemoteTransportException: Failed to deserialize exception response from stream
Caused by: org.elasticsearch.transport.TransportSerializationException: Failed to deserialize exception response from stream
    at org.elasticsearch.transport.netty.MessageChannelHandler.handlerResponseError(MessageChannelHandler.java:176)
    at org.elasticsearch.transport.netty.MessageChannelHandler.messageReceived(MessageChannelHandler.java:128)
    at org.elasticsearch.common.netty.channel.SimpleChannelUpstreamHandler.handleUpstream(SimpleChannelUpstreamHandler.java:70)
    at org.elasticsearch.common.netty.channel.DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline.java:564)
    at org.elasticsearch.common.netty.channel.DefaultChannelPipeline$DefaultChannelHandlerContext.sendUpstream(DefaultChannelPipeline.java:791)
    at org.elasticsearch.common.netty.channel.Channels.fireMessageReceived(Channels.java:296)
    at org.elasticsearch.common.netty.handler.codec.frame.FrameDecoder.unfoldAndFireMessageReceived(FrameDecoder.java:462)
    at org.elasticsearch.common.netty.handler.codec.frame.FrameDecoder.callDecode(FrameDecoder.java:443)
    at org.elasticsearch.common.netty.handler.codec.frame.FrameDecoder.messageReceived(FrameDecoder.java:303)
    at org.elasticsearch.common.netty.channel.SimpleChannelUpstreamHandler.handleUpstream(SimpleChannelUpstreamHandler.java:70)
    at org.elasticsearch.common.netty.channel.DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline.java:564)
    at org.elasticsearch.common.netty.channel.DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline.java:559)
    at org.elasticsearch.common.netty.channel.Channels.fireMessageReceived(Channels.java:268)
    at org.elasticsearch.common.netty.channel.Channels.fireMessageReceived(Channels.java:255)
    at org.elasticsearch.common.netty.channel.socket.nio.NioWorker.read(NioWorker.java:88)
    at org.elasticsearch.common.netty.channel.socket.nio.AbstractNioWorker.process(AbstractNioWorker.java:108)
    at org.elasticsearch.common.netty.channel.socket.nio.AbstractNioSelector.run(AbstractNioSelector.java:337)
    at org.elasticsearch.common.netty.channel.socket.nio.AbstractNioWorker.run(AbstractNioWorker.java:89)
    at org.elasticsearch.common.netty.channel.socket.nio.NioWorker.run(NioWorker.java:178)
    at org.elasticsearch.common.netty.util.ThreadRenamingRunnable.run(ThreadRenamingRunnable.java:108)
    at org.elasticsearch.common.netty.util.internal.DeadLockProofWorker$1.run(DeadLockProofWorker.java:42)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
    at java.lang.Thread.run(Thread.java:722)
Caused by: java.lang.OutOfMemoryError: PermGen space

能帮我解决这个问题吗。谢谢

共有1个答案

殷功
2023-03-14

最好的解决方案是使用“Java 8”JVM。

虽然您可以修改Java 7 JVM正在使用的堆的数量(如果您使用的是Oracle JVM,通过设置-xx:maxpermsize=...),但是如果您只是将JVM升级到版本8,那么您甚至不需要调优permgen大小。

这是因为在JVM8中,permgen大小以非分区的方式共享堆,这意味着只有在用完堆时才会用完permgen空间。

 类似资料:
  • 我的elasticsearch集群“graylog2”健康状态显示为黄色,但在Web界面中显示为绿色。 我可以在Graylog web界面中看到以下几行。 “1索引管理总共26条消息,当前写活动索引为graylog2\u 0。 Elasticsearch群集为绿色。碎片:1个活动,0个初始化,0个重新定位,0个未分配“ 谁能回答我的一些问题吗 为什么logstash索引状态为黄色,即使其中只有很少

  • 我正在用一个项目中相互协作的两个独立的Web应用程序来试验一些问题。在进行了X次部署之后,我得到了臭名昭著的“java.lang.OutofMemoryError:PermGen Space”错误。 所以我已经用VisualVM监视PermGen空间一段时间了,不断地重新部署应用程序,看看发生了什么。 这里有奇怪的行为: 首先,我已经重新部署了15倍以上的第一个应用程序。行为与预期的一样:内存图就

  • 我试图通过 但是什么也没发生。似乎它在等待什么。控制台没有回来。不得不用CTRL C杀死它。 我还试图通过 与上述行为相同。

  • 问题内容: 我已经安装了Elasticsearch 2.2.3并在2个节点的集群中进行了配置 节点1(elasticsearch.yml) 节点2(elasticsearch.yml) 如果我知道我有: 进入节点1的日志有: 改为进入节点2的日志: 哪里出错? 问题答案: 我解决了这一行: 每个配置文件的主机名都必须带有此行

  • 此API用于获取有关集群及其节点的信息,并对其进行更改。 对于调用此API,需要指定节点名称,地址或。 例如, 或者 响应 集群运行状况 此API用于通过追加关键字来获取集群运行状况的状态。 例如, 响应 集群状态 此API用于通过附加’‘关键字URL来获取有关集群的状态信息。状态信息包含:版本,主节点,其他节点,路由表,元数据和块。 例如, 响应 群集统计信息 此API有助于使用’‘关键字检索有

  • 我正在从运行在docker容器中的elasticsearch客户端连接到elasticsearch集群(即非停靠)。我可以通过在客户端中设置为: 其中192.168.17.131:9300是elasticsearch群集连接到节点客户端的主机ip:端口。 我无法公开主机中的任何其他端口,因为9300端口是在elasticsearch配置yml中设置为tcp传输端口的端口。 问题是,我无法启动多个d