尽管有-Xmx堆选项,为什么Cassandra会占用这么多内存?

时间:2019-05-24 16:36:28

标签: java cassandra heap-memory

我正在内存有限的服务器上运行Cassandra(一个Java进程)。我编辑了Cassandra的配置(config/jvm.options),以将这些参数传递给Java虚拟机,以限制堆大小。

-Xms180M -Xmx180M

我可以在ps ax | grep java的输出中看到它们,该输出显示:

[...] /usr/lib/jvm/java-8-openjdk-amd64/bin/java [...] 
   -Xms180M -Xmx180M [...] org.apache.cassandra.service.CassandraDaemon

但是它似乎占用了超过180MB的空间,并且另一个服务器进程不断消失。我猜测内核由于内存有限而正在杀死其他进程。

这是top中的一块屏幕:

KiB Mem :  1009128 total,    87072 free,   643488 used,   278568 buff/cach
KiB Swap:        0 total,        0 free,        0 used.   222228 avail Mem 

  PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND                                                                                 
20410 cassand+  20   0 2048132 433828   8456 S  0.3 43.0  41:25.22 java          

RES 433828是否意味着Cassandra使用了433 MB的RAM?在我将Java堆限制为180 MB之后,这似乎可行吗?如果堆限制为180 MB,那么剩下的433-180 = 253MB是什么?我也可以限制吗?

1 个答案:

答案 0 :(得分:3)

Cassandra具有堆上部分(由-Xmx控制)和堆外部分。大多数堆外数据结构通常随数据大小扩展-诸如分区索引,布隆过滤器和压缩块数据之类的数据存储在直接内存区域中,并随着磁盘使用情况而增加。

您可以对它们进行一些调整,但是它们不那么明显,并且需要权衡取舍。例如,将bloom_filter_fp_chance0.01提升到0.1将使用更少的内存,但是您可能会在读取路径上读取额外的sstable。