Cassandra 在写入时运行 OOM

Cassandra runs OOM when writing

我想知道为什么 Cassandra 在只写工作负载上 运行 内存不足。 它是一个单节点,版本 3.10,具有默认配置(除了添加的石墨报告器)。该机器有 30GB RAM,因此 Cassandra 以 8GB 堆启动。

我对 Cassandra 了解不多,但是 none 的相关指标似乎很可疑,而且我在堆转储中没有看到任何明显的东西(只是很多字节数组和写入数据 space).

以下是可能相关的指标。请注意,堆使用量不断增加,很快进程就会因 OOM 而死亡:

(几秒的 GC 时间峰值无关紧要,我确实强制执行了几次 GC)

cassandra.yaml: https://gist.github.com/mabn/3b02fe94c819a9dddf3152bcecc00f24

为了使用超过 8GB,您应该移动堆外内存表。这是重要的一步,因为这将允许您使用更多内存,但将 JVM 保持在 8GB 上限,因此您不会遇到通常在压力下大堆触发的长时间 GC-stop-of-the-world 暂停。

您可以通过将 memtable_allocation_typeheap_buffers 更改为 offheap_buffersoffheap_objects 之一来将 memtables 移出堆,每个都有其背后的原因。然后将 memtable_offheap_space_in_mb 调整为适合您系统的合理值。

此外,将 memtables 移出堆释放堆中的 space,您可以将其用于 key/row 缓存,从而提高读取性能。

看看这些文章: