elasticsearch,out-of-memory,permgen,Java,elasticsearch,Out Of Memory,Permgen" /> elasticsearch,out-of-memory,permgen,Java,elasticsearch,Out Of Memory,Permgen" />

Java 在运行elasticsearch群集时获取Perm Gen空间问题

Java 在运行elasticsearch群集时获取Perm Gen空间问题,java,elasticsearch,out-of-memory,permgen,Java,elasticsearch,Out Of Memory,Permgen,我们使用6个节点运行elasticsearch-1.5.1集群,最近几天我在集群中遇到java.lang.OutOfMemoryError PermGen space问题,这会影响节点,同样会导致问题。我正在重新启动特定节点以启动 我们试图通过给集群提供重负载来解决这个问题,但不幸的是,它无法复制。但有些人认为我们是如何在生产中一次又一次地遇到同样的问题的 这里是一些yml文件配置 index.recovery.initial_shards: 1 index.query.bool.max_cla

我们使用6个节点运行
elasticsearch-1.5.1
集群,最近几天我在集群中遇到java.lang.OutOfMemoryError PermGen space问题,这会影响节点,同样会导致问题。我正在重新启动特定节点以启动

我们试图通过给集群提供重负载来解决这个问题,但不幸的是,它无法复制。但有些人认为我们是如何在生产中一次又一次地遇到同样的问题的

这里是一些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
内存配置

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

使用以下配置更新问题

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\u merged\u段中存在问题。我的集群中有22个索引。下面给出了索引的
merge.policy.max\u merged\u段

  • 7个索引有20gb
  • 3个索引有10gb
  • 12个指数有5gb
使用流程信息更新

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
esuser xxxxx 1 2003年10月28日?1-02:20:40 /usr/java/default/bin/java-Xms10g-Xmx10g-Djava.awt.headless=true -XX:+UseParNewGC-XX:+UseComicMarkSweepGC-XX:cmsInitiatingOccupencyFraction=75-XX:+UseCmInitingOccupencyYony-XX:+HeapDumpOnAutofmemoryError-XX:+DisableExplicitGC-Dfile.encoding=UTF-8-server-Des.max open files=true-delaticsearch-Des.pidfile=/var/es/elasticsearch.pid-Des.path.home=/usr/es/elasticsearch-cp:/usr/es/elasticsearch/lib/elasticsearch-1.5.1.jar:/usr/es/elasticsearch/lib/:/usr/es/elasticsearch/lib/sigar/ -Des.default.path.home=/usr/es/elasticsearch-Des.default.path.logs=/es/es\u logs-Des.default.path.data=/es/es\u data-Des.default.path.work=/es/es/es\u work-Des.default.path.conf=/etc/elasticsearch org.elasticsearch.bootstrap.elasticsearch


下面是我在搜索时从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

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

最好的解决方案是使用“Java8”JVM

虽然您可以修改Java 7 JVM正在使用的堆的数量(如果您使用的是Oracle JVM,则通过设置-XX:MaxPermSize=…来实现),但如果您只是将JVM升级到版本8,则甚至不需要调整permgen大小


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

这对于Elasticsearch来说是不寻常的。这是什么版本?在生产和测试环境中是否有相同的设置?ES的内存设置是什么?运行
ps-ef | grep elasticsearch
并提供结果。@Andrestfan添加了过程grep详细信息,我已经在问题中共享了es版本、es的内存设置与生产环境相比,我没有测试环境的确切配置。这是异常的完整堆栈跟踪吗?还有根异常吗?是的,这是我在日志中的完整堆栈。。。没有理由。。。实际的异常是PermGenNot only config。考虑一下您运行的查询、如何访问集群(客户端访问)等。感谢您提供的信息。在生产环境中升级到JAVA8将解决PermGen问题,但我现在无法升级,我可以显式设置PermGenSize。甚至我都想知道根本原因并提供解决方案。根本原因是您使用的是HotSpot JVM,它通过将大量使用的代码编译成机器代码来优化代码,以实现更快的操作。这是期望的行为,而不是bug。问题是,经过一段时间后,它可能会找到太多要优化的代码,以致于无法存储优化的机器代码。在较旧的JVM版本中,此代码只能存储在JVM中预先分配的内存区域中。在较新的JVM版本中,它存储在堆上。。。Edwin,我同意你的观点,这纯粹是JVM内存使用问题。问题是PermGen通常会将类文件加载到mem中,我希望我的config/app/settings/process中的某个mem泄漏点可能会再次在mem中加载类,但无法从mem中卸载类。我仍在努力找出mem泄漏位置。面临问题中提到的类似问题。建议的一个修复方法是添加-XX:+CMSClassUnloadingEnabled字段以及-XX:+UseConMarkSweepGC。但添加CMSclassUnloadingEnabled会降低性能是一个值得关注的问题。有没有办法不降低性能,而是添加CMSclassUnloadingEnabled条目。@Arivazhaganjegana 2015年,再过几天2016年。您不应该试图通过调整参数来解决permgen空间问题,而应该通过升级到Java 1.8来解决。Java1.9的“特性冻结”已经完成,很快您将落后于两个版本。升级是的,这可能是痛苦的,但是尽早感受痛苦意味着你有更多的时间做出最好的决定。晚些时候去感受痛苦意味着你会发现所有你将要发现的东西,但你没有时间去做任何事情。