我们用的是cassandra3.7官方的docker镜像,在生产环境发现有一个小时一次停顿的现象。我猜测是java gc的原因,于是看了cassandra的gc日志,果然发现有每小时长达300ms-2s的停顿。
经过研究发现是netty的原因,netty用了direct memory,因为是通过mmap分配,不属于新生代和老年代,需要手工gc(full gc),java默认一个小时调用一次,所以出现了很大的延迟。
通过加上并行gc的参数,解决了这个问题:
-XX:+ExplicitGCInvokesConcurrent
-XX:+ExplicitGCInvokesConcurrentAndUnloadsClasses
ps:调长新生代生存期或者调大新生代的比例似乎不是很有用,因为cassandra的临时对象很多,临时对象没有及时回收,反而造成更大的gc压力。