JVM设置
优化 JVM 可能是从 Solr 安装中获得最大的一个关键因素。
配置您的JVM可能是一个复杂的话题,完整的讨论超出了本文档的范围。幸运的是,大多数现代JVM都非常善于利用默认设置来充分利用可用资源。以下介绍的部分包含一些提示,当默认值对您的情况不是最佳时,这些提示可能会有所帮助。
有关提高Solr性能的更多常规信息,请参阅:https://wiki.apache.org/solr/SolrPerformanceFactors。
选择内存堆设置
最重要的JVM配置设置是那些确定允许分配的内存量的设置。有两个主要的命令行选项可以为JVM设置内存限制。这些是-Xms设置JVM内存堆的初始大小,以及-Xmx设置允许堆增长的最大大小。
如果您的Solr应用程序需要的堆空间比使用 Xms 选项指定的多,则堆将自动增长。不指定初始大小并根据需要让堆增长是非常合理的。唯一的缺点是启动时间稍慢,因为应用程序需要更长的时间来初始化。如果将初始堆大小设置为高于默认值,则可能会避免一系列堆扩展,这通常会导致在应用程序向上旋转时在堆内来回执行对象。
用-Xmx设置的最大堆大小更重要,如果内存堆增长到这个大小,对象创建可能开始失败,并抛出 OutOfMemoryException。将此限制设置得太低可能会在应用程序中造成虚假错误,但将其设置得太高也可能是有害的。
当堆达到最大大小时,并不总是会导致错误。在发生错误之前,JVM将首先尝试回收已经存在于堆中的任何可用空间。只有当所有垃圾收集尝试失败时,您的应用程序才会看到异常。只要最大值足够大,您的应用程序将无误运行,但如果强制垃圾回收频繁进行,运行速度可能会更慢。
堆越大,执行垃圾收集的时间就越长。这可能意味着轻微的随机停顿,或者在极端的情况下,“freeze the world”暂停一分钟或更长时间。实际上,即使有更多的物理内存可用,对于超过2GB的堆大小,这也会成为严重的问题。在健壮的硬件上,运行多个JVM可能会得到更好的结果,而不仅仅是具有大内存堆的结果。一些专门的JVM实现可能具有自定义的垃圾收集算法,这些算法在大堆中效果更好。请参考您的 JVM 供应商的文档。
设置最大堆大小时,请注意不要让JVM占用所有可用的物理内存。如果JVM进程空间增长过大,操作系统将开始交换它,这将严重影响性能。另外,操作系统使用未分配给用于文件系统缓存和其他目的的进程的内存空间。这对于I/O密集型应用程序尤其重要,例如 Lucene / Solr。索引越大,操作系统的文件系统缓存就越受益。它可能需要一些实验来确定JVM的堆空间与OS使用的内存空间之间的最佳权衡。
在具有多个CPU/内核的系统上,调整堆的布局或垃圾收集器的行为也是有益的。调整堆中的生成池的相对大小会影响GC扫描的发生频率以及它们是否同时运行。配置垃圾收集器应该如何工作的各种设置可以极大地降低运行时的整体性能影响。Sun的网站上有关于这个主题的很多很好的信息。一个好的开始就在这里:Oracle的Java HotSpot垃圾收集。
使用服务器热点VM
如果您使用Sun的JVM,则请在启动Solr时添加-server命令行选项。这告诉JVM,它应该为长时间运行的服务器进程进行优化。如果系统上的Java运行时是JRE,而不是完整的JDK发行版(包括javac其他开发工具),则可能不支持-server JVM选项。通过在显示的使用率消息中运行 java -help 并查找-server作为可用选项来测试这一点。
检查JVM设置
查看服务器正在使用的JVM设置以及其他有用信息的一个好方法是使用:管理 RequestHandler、solr/admin/system。这个请求处理程序将显示丰富的服务器统计信息和设置。
您还可以使用与 Java 管理扩展 (JMX) 兼容的任何工具。有关更多信息,请参见使用 JMX 和 Solr 的部分。