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控制台>状态>Sling调度程序,或转到https://<host>:<port>/system/console/status-slingscheduler(例如,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>listCheckpoints()
在收集步骤1中概述的所有信息后,重新启动AEM。
通过async, async-reindex
和f ulltext-async
索引通道(IndexStats
Mbean)可以安全中止(在完成前停止)重新索引。 有关详细信息,另请参阅如何中止重新索引上的Apache Oak文档。 此外,请考虑以下事项:
PropertyIndexAsyncReindexMBean
启动重新索引后,才能中止Oak属性索引的重新索引。要安全地中止重新索引,请执行以下步骤:
确定控制需要停止的重新索引通道的IndexStats MBean。
通过JMX控制台导航到相应的IndexStats MBean,方法是转到AEM OSGi Web Console>Main>JMX或https://<host>:<port>/system/console/jmx(例如,http://localhost:4502/system/console/jmx)
根据要停止的重新索引通道(async
、async-reindex
或fulltext-async
)打开IndexStats MBean
async
、async-reindex
或fulltext-async
。在相应的IndexStats
MBean上调用abortAndPause()
命令。
正确标记Oak索引定义,以防止在索引通道恢复时恢复重新索引。
重新索引现有索引时,将reindex属性设置为false
/oak:index/someExistingIndex@reindex=false
或者,对于new索引,可以选择:
将类型属性设置为禁用
/oak:index/someNewIndex@type=disabled
或完全删除索引定义
完成后,将更改提交到存储库。
最后,在中止的索引通道上恢复异步索引。
abortAndPause()
命令的IndexStats
MBean中,调用resume()
命令。最好在安静的时段(例如,不是在大的内容摄取期间)重新索引,最好在已知和控制AEM负载的维护窗口期间重新索引。 另外,确保在其他维护活动中不进行重新索引。