Cassandra的内存占用分析

Cassandra的内存占用分析

最近,由于我们使用的Cassandra经常因为内存不足而挂掉,由于分析了一阵子Cassandra的内存占用的机制,总结如下:

默认配置Cassandra的内存占用并非是Java的Heap(-Xmx参数控制)加上常规的Linux进程所需的少量内存即可,而是还需加上Direct Memory。

假设我们在Cassandra设置MAX_HEAP_SIZE=4096M,但通过ps看到该Java内存占用达到6-7G。而根据我的理解, 除了Heap内存之外,Java进程还需要其它一些内存占用,包括Linux本地进程和Java自身的内存占用(如每个线程的栈,静态代码区等等)。但这些内存占用应该是较少量才合理,而不应该达到2-3G。于是在网上搜索了一翻,才发现Java自从Nio开始,可以直接存取Linux进程的本地内存,称为Direct Memory。而Cassandra就是利用了这种技术(Cassandra中称为Off-Heap),导致之前我用传统方式对Java内存机制的理解总是与实际不符。

该部分内存可通过以下配置进行限制以及查看
-XX:MaxDirectMemorySize=1024M -XX:NativeMemoryTracking=summary

需要查看Direct Memory时调用:
jcmd [PID] VM.native_memory

Cassandra中查看内存占用的方法

使用nodetool info可以查看Cassandra中堆内存占用情况。但是有些奇怪的是Cassandra中没有提供查看Direct Memory的方法(或许是我没有找到)。

谁是Cassandra内存占用的大头?

之前认为Cassandra作为持久化的数据库组件,不应该占用过多的内存。而我们现网通过反复调整,发现目前稳定的需要6-7G,这个值是相当可观的,于是有理由分析清楚Cassandra内存占用的机制。一般数据库都有Cache机制,Cassandra也是类似的,Cassandra中是key_cache,row_cache,counter_cache,但这些都不是内存的大头,大头是memtable。原来Cassandra写性能很高的原因也是因为memtable。

为何在Cassandra中创建几百个没有数据的空表就导致了内存不足?

为了搞清楚memtable的内存需求机制,我用MAX_HEAP_SIZE=400M参数下创建了几百个表,但没有数据,当表数据达到500个时,Cassandra挂掉了,提示内存不足。查看Cassandra配置项的文档, 发现memtable_heap_space_in_mb这个配置项可配置总计的memtable内存大小,默认是1/4 Heap。但是不理解的是我创建的表是空的,还没有数据,为何内存不足,而且我也没有看到单独每一个memtable的配置。搜索了一翻,在以下链接找到了答案,也就是Cassandra会为每一个memtable分配1M的初始空间!链接:http://stackoverflow.com/questions/11151498/what-is-the-impact-of-increase-in-no-of-column-families-of-cassandra-on-heap-uti

另外,如果想查看每一个表的memtable情况,可使用nodetool cfstats命令

注:Cassandra中Table就等同于Colume Family(简称cf)

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值