【发布时间】:2014-05-06 21:34:04
【问题描述】:
我们运行了一个 3 节点 DSE SOLR 集群,并且最近添加了一个新内核。经过大约一周的正常运行,所有 SOLR 节点现在都处于 OOMing 状态。填满 JVM 堆(设置为 8GB)和系统内存。然后也不断地将内存表刷新到磁盘。
集群是 DSE 3.2.5,RF=3
这是来自新核心的 solrconfig:
【问题讨论】:
标签: solr cassandra datastax-enterprise
我们运行了一个 3 节点 DSE SOLR 集群,并且最近添加了一个新内核。经过大约一周的正常运行,所有 SOLR 节点现在都处于 OOMing 状态。填满 JVM 堆(设置为 8GB)和系统内存。然后也不断地将内存表刷新到磁盘。
集群是 DSE 3.2.5,RF=3
这是来自新核心的 solrconfig:
【问题讨论】:
标签: solr cassandra datastax-enterprise
相对于操作系统可用于缓存文件系统页面的系统内存量,您的 Solr 索引有多大。基本上,您的 Solr 索引需要适合 OS 文件系统缓存(DSE 启动后可用但尚未处理任何大量数据的系统内存量。)
另外,每个节点上填充了多少个 Solr 文档(Cassandra 行)和多少个字段(Cassandra 列)?没有硬性限制,但 40 到 1 亿是一个很好的上限 - 每个节点。
而且,如果您重新启动 DSE,但在您开始向服务器加载负载之前,有多少系统内存和多少 JVM 堆可用?
【讨论】:
对于 RF=N,其中 N 是集群中的节点总数或至少是搜索数据中心,所有数据将存储在所有节点上,这对于较小的数据集可以,但对于较大的数据集则不行数据集。
对于 RF=n,这意味着每个节点将有 X/N*n 行或文档,其中 X 是数据中心中所有列族的行或文档的总数。 X/N*n 是你应该尽量保持在 1 亿以下的数字。这不是硬性限制——一些数据集和硬件可能能够处理更多,而一些数据集和硬件甚至可能无法容纳那么多。您必须找到最适合您自己的应用的数字,但 4000 万到 1 亿的范围是一个好的开始。
简而言之,最安全的估计是将 Solr 节点的 X/N*n 保持在 4000 万以下。对于某些数据集和更强大的硬件来说,100 可能就足够了。
【讨论】:
就调优而言,使用大量堆的一个常见来源是大量使用 Solr 构面和过滤器查询。
一种技术是将“DocValues”字段用于构面,因为 DocValues 可以存储在堆外。
过滤查询可以标记为 cache=false 以节省堆内存。
此外,各种 Solr 缓存的大小可以减小甚至设置为零。在 solrconfig.xml 中。
【讨论】: