尽管有 -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_chance
从 0.01
提高到 0.1
将使用更少的内存,但您可能会在读取路径上读取额外的 sstables。
我的服务器上的 运行 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_chance
从 0.01
提高到 0.1
将使用更少的内存,但您可能会在读取路径上读取额外的 sstables。