JVM 设置
优化 JVM 是充分利用 Solr 安装的关键因素。
配置 JVM 是一个复杂的话题,本文档无法全面讨论。幸运的是,大多数现代 JVM 在使用默认设置时都能很好地利用可用资源。以下部分包含一些提示,当默认设置不适合你的情况时,这些提示可能会有所帮助。
有关提高 Solr 性能的更一般信息,请参阅 Solr Wiki 中的 Solr 性能因素。
选择内存堆设置
最重要的 JVM 配置设置控制分配给 JVM 的堆:-Xms
(设置 JVM 内存堆的初始大小)和 -Xmx
(设置堆的最大大小)。将这两个选项设置为相同的值是一种常见做法。
堆大小至关重要,不幸的是没有“一刀切”的解决方案,你必须使用你的数据和应用程序进行测试。确定正确大小的最佳方法是分析位于日志目录中的垃圾回收 (GC) 日志。有各种工具可以帮助分析这些日志,特别是显示 GC 完成后使用的内存量(GCViewer 和 GCEasy 就是两个)。此外,你还可以附加 jconsole(大多数 Java 运行时中都有)来检查 Solr 正在运行时的内存消耗。这将显示所需的绝对最少内存量;添加 25-50% 的“预留空间”是一个合理的起点。
有几点需要记住
-
为堆分配的“预留空间”太少,会导致持续的 GC 消耗过多的资源。因此,建议预留 25-50%。
-
Solr 广泛使用 MMapDirectory,它使用 不 为 JVM 保留的 RAM 来存储大部分 Lucene 索引。因此,应该尽可能多地为操作系统留出内存以用于此目的。
-
堆分配应尽可能小,同时保持良好的性能。8-16Gb 非常常见,有时会使用更大的堆。当堆增长到更大的规模时,在投入生产之前必须进行广泛的测试。
-
当使用支持它的 JVM(Java 9 及更高版本)时,目前首选 G1GC 垃圾收集器。
-
现代硬件可以配置为具有数百 GB 的物理 RAM 和许多 CPU。在这些情况下,通常最好运行多个 JVM,每个 JVM 都分配给其堆的内存量有限。实现此目的的一种方法是将 Solr 作为 Docker 容器 运行。
-
定期重新分析 GC 日志和/或使用 指标报告 进行监控以查看由于应用程序、文档数量等的变化,内存使用情况是否发生变化,这是一个好习惯。
-
Solr 将使用一个选项运行,该选项会导致 JVM 在 OutOfMemoryError 异常时崩溃。当系统资源耗尽时,这将强制停止 Solr,而不是继续处于不确定的状态。您还可以通过
solr.in.sh
中的值请求 OOME 上的堆转储 -
所有当前(Java 11)垃圾收集器都可以进行“停止世界”收集,这会挂起 JVM 直到完成。如果通过监控,这些垃圾收集频繁且超过您的应用程序可以承受的程度,则应考虑进行额外的调整。“停止世界”暂停超过 5 秒的情况很少被接受,而希望它们少于 1 秒。
在特定情况下,请查阅您的 JVM 供应商的文档,以上建议旨在作为起点。