AEM內部重新索引程式會收集存放庫資料,並將其儲存在Oak索引中,以支援內容的效能查詢。 在特殊情況下,該過程可能會變得緩慢甚至停滯。 本頁作為故障排除指南,幫助確定索引是否緩慢、查找原因並解決問題。
必須區分需要不恰當的長時間的重新索引和需要很長時間的重新索引,因為它正在索引大量的內容。 例如,索引內容所花的時間會隨著內容量而調整,因此大型生產存放庫重新索引所需的時間會比小型開發存放庫長。
有關重新索引內容的時間和方式的詳細資訊,請參閱查詢和索引的最佳做法。
初始檢測慢索引需要檢查IndexStats
JMX MBean。 在受影響的AEM例項上,執行下列動作:
開啟Web控制台,然後按一下JMX頁簽,或轉到https://<host>:<port>/system/console/jmx(例如http://localhost:4502/system/console/jmx)。
導覽至IndexStats
Mbean。
開啟「 async
」和「 fulltext-async
」的IndexStats
MBean。
對於這兩個MBean,檢查Done時間戳記和LastIndexTime時間戳記是否少於當前時間的45分鐘。
對於MBean,如果時間值(Done或LastIndexedTime)從當前時間開始大於45分鐘,則索引作業失敗或花費太長時間。 這會導致非同步索引過時。
強制關閉會導致AEM在重新啟動後最多暫停非同步索引30分鐘,且通常需要另外15分鐘才能完成第一次重新索引通過,總共約45分鐘(與45分鐘的初始偵測時間範圍相連)。 如果您懷疑在強制關閉後索引暫停:
首先,判斷AEM執行個體是否以強制方式關閉(AEM程式已強制終止,或發生電源故障),然後重新啟動。
如果發生強制關閉,重新啟動時,AEM會自動暫停重新索引最多30分鐘。
等待約45分鐘,讓AEM繼續正常的非同步索引操作。
針對AEM 6.1,請確定已安裝AEM 6.1 CFP 11。
在特殊情況下,用於管理非同步索引的線程池可能會變得過載。 為了隔離索引程式,可設定執行緒池,以防止其他AEM工作干擾Oak及時索引內容的能力。 若要這麼做,您應:
為Apache Sling排程器定義新的隔離執行緒池,以用於非同步索引:
確認已註冊新的Apache Sling排程器執行緒池,並在Apache Sling排程器狀態Web主控台中顯示。
導覽至AEM OSGi Web主控台> Status>Sling排程器,或前往https://<host>:<port>/system/console/status-sling排程器(例如http://localhost:4502/system/console/status-slingscheduler)
驗證是否存在以下池項:
如果在短時間內對儲存庫進行了太多更改和提交,則索引可能會因為完整觀察隊列而延遲。 首先,確定觀測隊列是否滿:
轉到Web控制台,然後按一下JMX頁簽,或轉到https://<host>:<port>/system/console/jmx(例如http://localhost:4502/system/console/jmx)
開啟Oak Repository Statistics MBean ,並判斷是否有任何ObservationQueueMaxLength
值大於10,000。
per second
部分中),以驗證ObservationQueueMaxLength
的秒量度為0。Consolidated Cache
統計MBean中DocChildren
快取的增加missRate
中可看到此關聯。為避免超過可接受的觀察隊列限制,建議執行以下操作:
DiffCache
的大小。在兩種情況下,重新索引可以被視為「完全卡住」:
重新索引的速度非常慢,以至於在日誌檔案中,對於所遍歷的節點數沒有報告顯著進展。
如果索引線程的日誌檔案(例如OutOfMemoryException
)中出現重複的異常,則重新索引卡在無窮循環中。 記錄中重複相同例外狀況,表示Oak嘗試重複索引相同項目,但在相同問題上失敗。
要識別並修復停滯的重新索引過程,請執行以下操作:
為了確定索引停滯的原因,必須收集以下資訊:
收集5分鐘的線程轉儲,每2秒收集一個線程轉儲。
從非同步IndexStats
MBean收集資料:
導覽至「AEM OSGi Web Console>Main>JMX>IndexStat>async」
使用oak-run.jar的主控台模式來收集* /:async
*節點下存在內容的詳細資訊。
使用CheckpointManager
MBean收集儲存庫查核點清單:
AEM OSGi Web Console>Main>JMX>CheckpointManager>listChapperits()
收集步驟1中概述的所有資訊後,請重新啟動AEM。
可通過async, async-reindex
和f ulltext-async
索引通道(IndexStats
Mbean)安全地中止(在完成前停止)重新索引。 如需詳細資訊,請參閱How to Abort Reindexing上的Apache Oak檔案。 此外,請考量:
PropertyIndexAsyncReindexMBean
啟動重新索引時,才能中止Oak屬性索引的重新索引。要安全地中止重新索引,請執行以下步驟:
識別控制需要停止的重新索引通道的IndexStats MBean。
通過轉到AEM OSGi Web Console>Main>JMX或https://<host>:<port>/system/console/jmx(例如http://localhost:4502/system/console/jmx),導航到相應的IndexStats MBean
根據要停止的重新索引通道(async
、async-reindex
或fulltext-async
)開啟IndexStats MBean
async
、async-reindex
或fulltext-async
。在相應的IndexStats
MBean上調用abortAndPause()
命令。
正確標示Oak索引定義,以防止在索引通道恢復時繼續重新索引。
重新索引existing索引時,請將reindex屬性設為false
/oak:index/someExistingIndex@reindex=false
或者,對於new索引,可以:
將type屬性設定為已禁用
/oak:index/someNewIndex@type=disabled
或完全刪除索引定義
完成後將更改提交到儲存庫。
最後,在中止的索引通道上繼續非同步索引。
abortAndPause()
命令的IndexStats
MBean中,調用resume()
命令。最好在安靜時段(例如,不是在大型內容擷取期間)重新索引,最好在已知並控制AEM負載的維護時段重新索引。 另外,確保在其他維護活動期間不進行重新索引。