Cassandra的jvm内存设置多大合适

cassandra是java写的程序,java写的程序难以避免会遇到GC的问题,第一个问题就是jvm的内存设置多大合适,这往往是让人很纠结的事情。

以下来自官方建议:
首选是GC类型如何选择

推荐G1 GC有以下原因:

1、内存可以从14GB到64GB,G1在大内存上比CMS表现好,因为G1首选会扫描那些堆内区域包含垃圾对象比较多,并同时进行堆压缩,而CMS在执行GC的时候需要停止应用。
2、系统的负载是个变量,也就是说系统每个时间都在执行不同的线程操作。
3、CMS在java9以后就会被废弃
4、G1是很容易配置的
5、G1是一种自我优化的GC
6、你只要设置MAX_HEAP_SIZE就行了。

当然G1 GC这种分析会导致一定时延。

CMS通过在以下情形下被推荐使用:

1、你有足够的时间和专业知识来手动优化调试垃圾手机。
注意当数据库内存里保持了更多的系统元数据的时候,增加更大的内存给jvm,会因为GC而导致性能下降。
2、堆大小不超过14GB.
3、系统负载是固定的,也就是说集群一致在执行相同的工作。
4、环境需要更低的时延。

备注:不建议在java7下使用G1,因为G1在java7下有个bug关于类卸载的问题,在java7里PermGen会被一直填满,直到发生一个full GC。

其次是内存大小如何设置

你可能试图把java的内存设置为接近系统的RAM大小,显然这是不可能的,因为这会干扰操作系统的页面缓存的操作。操作系统把频繁访问的数据保存到内存里,也就是操作系统的页面缓存,这个是很有用的。适当调整操作系统的页面缓存通常比使用cassandra的row cache还好。

cassandra会基于以下公式,自动计算最堆内存(MAX_HEAP_SIZE):

max(min(1/2RAM, 1024M), min(1/4RAM, 32G))

对于生产环境,我们提供以下指导原则:

1、堆内存一般在操作系统内存的四分之一和二分之一之间
2、不要把所有的内存都给jvm,因为内存还要用于堆外缓存以及操作系统缓存。建议在优化GC的时候始终开启GC日志。
3、针对每个配置项的变化进行调整和测试
4、启用GC的并行处理,特别是使用cassandra企业版的索引检索。
5、GCInspector类的日志会对超过200ms的GC,打印日志。如果这样的GC频繁发生,或者需要很长的时间才能完成GC,那么表示当前压力已经超过GC能力范围,除了优化GC选项以外,其它的措施还包括扩容节点,降低缓存大小等。
6、如果是使用的G1 GC。Datastax官方建议最大内存MAX_HEAP_SIZE越大越好,可以到64GB.

MAX_HEAP_SIZE的大小设置根据使用的GC类型而定:
1、对于超过8C256G内存的机器, 使用G1 GC建议MAX_HEAP_SIZE在14G到64GB之间
2、对于超过8C256G内存的机器, 使用CMS GC建议MAX_HEAP_SIZE不要超过14GB
3、其它较老的机器,配置典型值8G

对于CMS,你可能还要优化HEAP_NEWSIZE(新生代的堆大小)

Cassandra的计算原则是

min(100M* cpu核心数, 1/4 MAX_HEAP_SIZE)

总之:HEAP_NEWSIZE越大停顿时间越长,HEAP_NEWSIZE越小可能更频繁,这个过程更加昂贵。

博主建议

不要再纠结,用jdk8,G1 GC,内存在1/4ram和1/2ran之间,越大越好,不要超过64G。

留言

提示:你的email不会被公布,欢迎留言^_^

*

验证码 *