非堆CMS上的DSE垃圾收集Perm Gen需要很长时间

时间:2014-02-13 19:23:14

标签: solr garbage-collection jvm permgen datastax-enterprise

我在Datastax-enterprise的Cassandra / Solr软件包中经历了长时间的GC暂停(> 10秒)。经过几天的监测后,我发现它只发生在CMS Perm Gen的GC发生时,如图所示。当PermGen GC发生时,长GC发生在图表的每个拐点处。每当Perm Gen GC启动时,会有一个长时间停顿导致客户端会话超时!

https://www.dropbox.com/s/qgdcurprvc1sees/permgen_gc.png

堆GC是正常的并且没有暂停,只在非堆Perm Gen GC中长时间停顿,这总是在服务器处于非高峰时间时发生。

![在此处输入图片说明] [1]

DSE使用的JVM选项:

-ea -javaagent:/usr/local/dse/resources/cassandra/lib/jamm-0.2.5.jar 
-XX:+UseThreadPriorities -XX:ThreadPriorityPolicy=42
-Xms16384M -Xmx16384M -Xmn5461M -XX:+HeapDumpOnOutOfMemoryError 
-Xss180k -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled 
-XX:SurvivorRatio=8 -XX:MaxTenuringThreshold=1
-XX:CMSInitiatingOccupancyFraction=75 -XX:+UseCMSInitiatingOccupancyOnly 
-Djava.net.preferIPv4Stack=true -Dcassandra.load_ring_state=false 
-Dcassandra-foreground=yes -Dsearch-service=true
-Dtomcat.logs=/var/log/dse/tomcat -DName=SI2_DSE
-Ddse.solr.data.dir=/data/solrIndexRamDisk
-Djava.library.path=/usr/local/dse/resources/hadoop/native/Linux-amd64-64/lib

JVM信息

  • 虚拟机:Java HotSpot(TM)64位服务器VM版本20.12-b01
  • 供应商:Sun Microsystems Inc.
  • JIT编译器:HotSpot 64位分层编译器

堆信息

  • 当前堆大小:10,247,153千字节
  • 最大堆大小:16,218,048千字节
  • 承诺记忆:16,218,048千字节
  • 待定结束:{0}个对象

VM服务器信息

  • 操作系统:Linux 2.6.32-279.1.1.el6.x86_64
  • 架构:AMD64
  • 处理器数量:32
  • 提交的虚拟内存:39,845,596千字节
  • 总物理内存:99,018,824千字节
  • 免费物理内存:58,184,572千字节
  • 总交换空间:4,194,296千字节
  • 免费交换空间:4,194,296千字节

2 个答案:

答案 0 :(得分:1)

如果你可以直接使用Solr,你可以试试Heliosearch,它试图用堆外数据来解决GC暂停的问题。

http://heliosearch.org/off-heap-filters/

答案 1 :(得分:0)

使用-XX:+ CMSClassUnloadingEnabled,它允许CMS收集器在oldgen GC期间扫描permgen并卸载不再使用的类。 链接:http://blog.redfin.com/devblog/2012/06/cmsclassunloadingenabled-at-redfin.html#.UwWeO4XqPK0

使用100或200 MB大小来生成烫发,而不是60 MB。

试一试并分享是否能解决您的问题