JVM 设置

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

配置 JVM 是一个复杂的主题,完整的讨论超出了本文档的范围。幸运的是,大多数现代 JVM 在使用默认设置时都非常擅长充分利用可用资源。以下部分包含一些在默认设置不适合您的情况下可能有用的提示。

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

选择内存堆设置

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

堆大小至关重要,不幸的是没有“一刀切”的解决方案,您必须使用您的数据和应用程序进行测试。确定正确大小的最佳方法是分析位于您的 logs 目录中的垃圾收集 (GC) 日志。有各种工具可以帮助分析这些日志,特别是显示 GC 完成后使用的内存量(GCViewerGCEasy 是其中两个)。您还可以附加 jconsole(与大多数 Java 运行时一起分发)以检查 Solr 运行时内存消耗。这将显示所需的绝对最小内存量;添加 25-50% 的“余量”是一个合理的起点。

有几点需要记住

  • 使用为堆分配的太少“余量”运行 Solr 会导致持续的 GC 消耗过多的资源。因此,上面的 25-50% 建议。

  • Solr 广泛使用 MMapDirectory,它使用 为 JVM 保留的 RAM 来存储大部分 Lucene 索引。因此,应尽可能多地为操作系统保留内存以用于此目的。

  • 在保持良好性能的同时,分配的堆应尽可能小。8-16Gb 很常见,有时会使用更大的堆。当堆增长到更大的大小时,必须在投入生产之前进行广泛的测试。

  • 当使用支持 G1GC 垃圾回收器的 JVM(Java 9 及更高版本)时,目前首选 G1GC 垃圾回收器。

  • 现代硬件可以配置数百 GB 的物理 RAM 和许多 CPU。在这些情况下,通常最好运行多个 JVM,每个 JVM 分配有限的堆内存。实现此目的的一种方法是将 Solr 作为 Docker 容器运行。

  • 定期重新分析 GC 日志和/或使用 指标报告进行监控,以查看内存使用情况是否因应用程序、文档数量等变化而发生变化,这是一个很好的做法。

  • Solr 将使用一个选项运行,该选项会导致 JVM 在发生 OutOfMemoryError 异常时崩溃。当系统资源耗尽时,这将强制停止 Solr,而不是在不确定的状态下继续运行。您还可以通过 solr.in.sh 中的值请求在发生 OOME 时生成堆转储。

  • 当前所有(Java 11)垃圾回收器都可能出现 “stop the world” 集合,这将暂停 JVM 直到完成。如果通过监控发现这些垃圾回收过于频繁,且超出您的应用程序可容忍的范围,则应考虑进行额外的调整。“stop the world” 暂停超过 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 Properties(Java 属性)。

image
图 1. Java 属性屏幕