JVM 設定

最佳化 JVM 可能是充分利用您的 Solr 安裝的關鍵因素。

設定您的 JVM 是一個複雜的主題,完整的討論超出本文檔的範圍。幸運的是,大多數現代 JVM 在使用預設設定時,都能很好地利用可用資源。以下各節包含一些在預設設定對您的情況不理想時可能有所幫助的提示。

如需有關改善 Solr 效能的更多一般資訊,請參閱 Solr Wiki 中的Solr 效能因素

選擇記憶體堆積設定

最重要的 JVM 設定控制分配給 JVM 的堆積:-Xms,它設定 JVM 記憶體堆積的初始大小;以及 -Xmx,它設定堆積的最大大小。將這兩個選項設定為相同的值是一種常見的做法。

堆積大小至關重要,但不幸的是,沒有「一體適用」的解決方案,您必須使用您的資料和應用程式進行測試。確定正確大小的最佳方法是分析位於您記錄目錄中的垃圾收集 (GC) 記錄。有各種工具可協助分析這些記錄,特別是顯示 GC 完成後使用的記憶體量(GCViewerGCEasy 是兩個)。您也可以在 Solr 執行時附加 jconsole(隨大多數 Java 執行階段分發)以檢查記憶體消耗。這將顯示所需的絕對最小記憶體量;增加 25-50% 的「餘裕」是一個合理的起點。

有幾個重點需要記住

  • 以過少的「餘裕」分配給堆積執行 Solr,可能會導致持續的 GC 消耗過多資源。因此有上述 25-50% 的建議。

  • Solr 廣泛使用 MMapDirectory,它使用 為 JVM 保留的 RAM 來儲存大多數 Lucene 索引。因此,應盡可能為作業系統保留更多記憶體以用於此目的。

  • 在維持良好效能的同時,分配的堆積應盡可能小。8-16Gb 非常常見,有時會使用更大的堆積。當堆積成長到較大的大小時,務必在投入生產環境之前進行廣泛測試。

  • 當使用支援 G1GC 的 JVM 時(Java 9 和更新版本),目前首選 G1GC 垃圾收集器。

  • 現代硬體可以配置數百 GB 的實體 RAM 和許多 CPU。在這些情況下,通常最好執行多個 JVM,每個 JVM 的堆積中分配有限的記憶體量。實現此目的的一種方法是以 Docker 容器 執行 Solr。

  • 最好定期重新分析 GC 記錄和/或使用指標報告進行監控,以查看記憶體使用量是否因應用程式、文件數量等變更而變更。

  • Solr 將使用一個選項執行,該選項會導致 JVM 在 OutOfMemoryError 例外狀況時當機。當系統資源耗盡時,這會強制停止 Solr,而不是在不確定的狀態下繼續。您還可以透過 solr.in.sh 中的值要求在 OOME 時進行堆積傾印。

  • 所有目前的 (Java 11) 垃圾收集器都可能觸發「停止世界」收集,這會暫停 JVM 直到完成。如果透過監控發現這些垃圾收集很頻繁且超過應用程式可容忍的範圍,則應考慮進行額外的調整。「停止世界」的暫停時間超過 5 秒的情況很少能接受,理想情況下應低於 1 秒。

請查閱您的 JVM 供應商的文件以了解您特定案例的詳細資訊,上述建議僅作為起點。

使用伺服器 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 設定,這些設定可以在管理 UI 的主要儀表板上看到。

然而,Java 屬性畫面可以輕鬆存取執行 Solr 的 JVM 的所有屬性,包括類別路徑、檔案編碼、JVM 記憶體設定、作業系統等。

在管理 UI 中,它位於左側選單的「Java 屬性」。

image
圖 1. Java 屬性畫面