JVM 设置

优化 JVM 是充分利用 Solr 安装的关键因素。

配置 JVM 是一个复杂的话题,本文档无法全面讨论。幸运的是,大多数现代 JVM 在使用默认设置时都能很好地利用可用资源。以下部分包含一些提示,当默认设置不适合你的情况时,这些提示可能会有所帮助。

有关提高 Solr 性能的更一般信息,请参阅 Solr Wiki 中的 Solr 性能因素

选择内存堆设置

最重要的 JVM 配置设置控制分配给 JVM 的堆:-Xms(设置 JVM 内存堆的初始大小)和 -Xmx(设置堆的最大大小)。将这两个选项设置为相同的值是一种常见做法。

堆大小至关重要,不幸的是没有“一刀切”的解决方案,你必须使用你的数据和应用程序进行测试。确定正确大小的最佳方法是分析位于日志目录中的垃圾回收 (GC) 日志。有各种工具可以帮助分析这些日志,特别是显示 GC 完成后使用的内存量(GCViewerGCEasy 就是两个)。此外,你还可以附加 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 供应商的文档,以上建议旨在作为起点。

使用 Server HotSpot VM

如果您使用的是 Sun 的 JVM,请在启动 Solr 时添加 -server 命令行选项。这告诉 JVM 它应该针对长时间运行的服务器进程进行优化。如果系统上的 Java 运行时是 JRE,而不是完整的 JDK 发行版(包括 javac 和其他开发工具),那么它可能不支持 -server JVM 选项。通过运行 java -help 来测试这一点,并在显示的用法消息中查找 -server 作为可用选项。

检查 JVM 设置

系统请求处理程序

查看服务器正在使用的 JVM 设置以及其他有用信息的一个好方法是使用admin请求处理程序,/solr/admin/info/system。此请求处理程序将显示大量服务器统计信息和设置。

Java 属性屏幕

许多系统环境变量包括 Java 设置,这些设置可以在 Admin UI 的主仪表板中看到。

但是,Java 属性屏幕提供了对运行 Solr 的 JVM 的所有属性的轻松访问,包括类路径、文件编码、JVM 内存设置、操作系统等。

在 Admin UI 中,它位于左侧菜单Java 属性中。

image
图 1. Java 属性屏幕