我正在我的服务器上运行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使用的内存是433MB吗?在我将java堆限制为180mb之后,这看起来可能吗?如果堆被限制为180MB,那么其他433-180=253mb是什么?我也可以限制吗?
1条答案
按热度按时间fzsnzjdm1#
cassandra有一个堆上部分(由-xmx控制)和一个堆外部分。大多数堆外数据结构通常会随着数据大小而扩展,例如分区索引、bloom过滤器和压缩块数据都存储在直接内存区域中,并随着磁盘使用量的增加而增加。
您可以对它们进行一些调整,但它们不太明显,而且有性能折衷。例如,提高
bloom_filter_fp_chance
从0.01
至0.1
将使用更少的内存,但您可以在读取路径上读取额外的sstables。