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

Why is Cassandra taking this much memory, despite -Xmx heap option?

我的服务器上的 运行 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 是什么?我也可以限制吗?

Cassandra 有一个 on-heap 部分(由 -Xmx 控制)和一个 off-heap 部分。大多数 off-heap 数据结构通常随数据大小而扩展 - 诸如分区索引、布隆过滤器和压缩块数据之类的东西存储在直接内存区域中,并随着磁盘使用量的增加而增加。

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