如何解决Cassandra java 进程使用比其分配的最大堆大小Xmx更多的内存
我们有我们的 cassandra 集群,它在一组 unix 主机 (18) 中运行 Apache Cassandra 3.11.4。这些主机中的每一个都有 96G 的 RAM,我们已将堆大小配置为 -xms=64G -Xmx=64G 但主机上的 top 命令(top -M)显示实际内存利用率平均约为 85G,即远高于分配的堆( 64G)。
内存使用的趋势是,在cassandra daemon启动时,top -M显示进程已经占用了~75G,比分配的堆大小多(75G-64G)=9G,并且这个内存利用率随着时间的推移而增加在短短 3-4 小时内达到最大 85G 并一直保持在该阶段,而堆利用率(~40-50%)正常,GS 活动正常,minor GC 照常启动。
已确认每个主机上所有键空间使用的堆外内存总量低于 2G。
我们无法追踪除了分配的堆之外还有什么在消耗 RAM。
解决方法
除了堆内存之外,Cassandra 还使用堆外内存,例如用于保存压缩元数据、布隆过滤器和其他一些东西。来自文档(1,2):
压缩元数据存储在堆外,并随着磁盘上的数据进行扩展。这通常需要磁盘上每 TB 数据有 1-3GB 的堆外 RAM,但具体使用情况因 chunk_length_in_kb 和压缩率而异。
布隆过滤器存储在 RAM 中,但存储在堆外,因此操作员在选择最大堆大小时不应考虑布隆过滤器。
例如,您可以监视堆和堆外内存使用情况 using the JMX。 (我见过一些设置,其中仅布隆过滤器就占用了约 40Gb 的 RAM,但它在很大程度上取决于唯一分区键的数量)
通常不建议使用太大的堆,因为它们可以使用长暂停等。当然这取决于工作负载,但您可以尝试 31Gb 或更低(或仅使用默认设置)。另外,您需要为 Linux 文件缓冲区留出内存,以便它可以缓存经常使用的文件。这就是默认情况下 Cassandra 只为堆分配系统内存的 1/4 的原因。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。