我正在内存有限的服务器上运行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是什么?我也可以限制吗?
答案 0 :(得分:3)
Cassandra具有堆上部分(由-Xmx控制)和堆外部分。大多数堆外数据结构通常随数据大小扩展-诸如分区索引,布隆过滤器和压缩块数据之类的数据存储在直接内存区域中,并随着磁盘使用情况而增加。
您可以对它们进行一些调整,但是它们不那么明显,并且需要权衡取舍。例如,将bloom_filter_fp_chance
从0.01
提升到0.1
将使用更少的内存,但是您可能会在读取路径上读取额外的sstable。