ES2.1.1频繁GC,且内存溢出

环境上发现,单个节点的ES在一直不停的进行young gc,中途弹出队列已满,reject请求.
最后进行了4次old gc之后,报java heap 

young.png


old.png

请教下,这类问题怎么定位啊,怎么确定是哪些请求造成的堆内存溢出
已邀请:

helloworld1128

赞同来自: ddys

参考一下这篇:      https://elasticsearch.cn/article/361

rockybean - ElasticStack Fans,公众号:ElasticTalk,慕课网《ElasticStack 从入门到实践》讲师

赞同来自: helloworld1128

数据量是不是有增长?有没有监控 heap 和 old gc?最好拉个图出来看下是否有一定规律,如果 heap 是持续占用很高,那就该扩容了,比如加 heap 或者加节点了
 

yayg2008

赞同来自: ddys

从日志来看,应该是内存泄露了。频繁的GC但是内存并没有回收掉。
关于问题的定位及排查方法,其实和通用的JVM内存溢出排查方法差不多,只是开源代码,你只要找到泄露的点,找谷老师基本都能找到解决方案。
首先确认是单节点问题还是多节点都这样,如果多节点都这样,则很有可能是异常数据导致;
对于单节点问题,则需要dump并分析内存的占用情况, 看看谁是冤大头。具体操作方式@helloworld1128已经回复。

code4j - coder

赞同来自:

看了下日志内容,你的内存分配还是蛮大的,内存越大,一次gc耗时也会越多,old回收的时候 duration 1.9m意思是一分钟吧,应用等几秒都受不了的。年轻带回收很快,日志显示几秒钟也不科学,我觉得你应该适当给幸存区分配些空间。而且我看了你的线程数配了至少37,那你是几核的?一般来说线程数配置核数的两倍就可以了,我们是8核我最多配20。
 
简单说下任务reject的可能:首先看你的qps,可能在一段时间内qps相对较高,你的work线程被占满了,但是正巧碰上了oldgc,耗时巨长(1.9m),然后这些线程都挂起了(stw),qps持续较高的时候队列2000个,一分钟妥妥的被填满,最后reject。
 
当然我上面是一种情况的猜测,实际要结合你cpu使用率,还有当时的qps等一起分析。但是gc耗时高是主要原因

要回复问题请先登录注册