【问题标题】:Cassandra runs OOM when writingCassandra在写的时候运行OOM
【发布时间】:2017-11-08 01:02:19
【问题描述】:

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

我对 Cassandra 知之甚少,但没有任何相关指标看起来可疑,而且我在堆转储中看不到任何明显的东西(只是大量写入数据占用空间的字节数组)。

以下是可能相关的指标。请注意,堆使用量不断增加,很快该进程将由于 OOM 而死:

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

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

【问题讨论】:

  • 你能发布你的 yaml 配置吗?这似乎与堆外内存过度使用有关。
  • 已添加。这几乎是默认设置,但路径和地址已更改。
  • 您使用了哪个 cassandra 导出器和 grafana 仪表板来获取指标?
  • 抱歉,我不记得这些指标是如何获取的。我自己创建了仪表板。

标签: memory cassandra jvm out-of-memory


【解决方案1】:

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

通过将memtable_allocation_typeheap_buffers 更改为offheap_buffersoffheap_objects 之一,您可以将内存表移出堆外,每个都有自己的原因。然后将memtable_offheap_space_in_mb 调整为适合您系统的合理值。

此外,将内存表移出堆可释放堆中可用于键/行缓存的空间,从而提高读取性能。

看看这些文章:

【讨论】:

  • 我将设置更改为 offheap_objects 并将 memtable_offheap_space_in_mb 设置为 2GB,现在看起来很好。堆内存使用量没有增加,堆外内存 (rss) 稳定。还有一件事——你知道为什么在使用“heap_buffers”时它似乎会泄漏内存吗?所有内存区域的大小都是恒定的,但堆使用量正在增加。在 cassandra 3.x 中可能是一些问题吗?还是不正确的指标?无论如何 - 你的建议有帮助 - 谢谢!
  • @mabn GC 应该保证从长远来看任何进程都不会泄漏。 Cassandra 可能会在堆中添加越来越多的对象,直到 JVM 用完为止。将内存表移出堆后,您的堆使用量是多少?
  • 指标显示堆使用量从超过旧的 gen 限制(大约 6GB)下降到 1.2GB,memtables 的大小保持不变(高达 700MB)。这就是为什么我有点困惑,它不加起来。
猜你喜欢
  • 1970-01-01
  • 2013-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-16
  • 2013-06-18
  • 2018-10-14
  • 2015-04-14
相关资源
最近更新 更多