AEM内部重新索引过程会收集存储库数据并将其存储在Oak索引中,以支持对内容的性能查询。 在特殊情况下,该过程可能会变得缓慢甚至停滞。 本页作为疑难解答指南,可帮助确定索引速度是否慢、查找原因并解决问题。
区分需要花费不适当的时间的重新索引和需要很长时间的重新索引是很重要的,因为这是对大量内容进行索引。 例如,索引内容所需的时间会随内容量而扩展,因此大型生产存储库重新索引的时间要比小型开发存储库花费的时间长。
请参阅查询和索引的最佳实践 ,以了解有关何时以及如何重新索引内容的其他信息。
初始检测慢速索引需要检查IndexStats
JMX MBean。 在受影响的AEM实例上,执行以下操作:
打开Web控制台并单击JMX选项卡,或转到https://<host>:<port>/system/console/jmx(例如,http://localhost:4502/system/console/jmx)。
导航到IndexStats
Mbeans。
打开“ async
”和“ fulltext-async
”的IndexStats
MBean。
对于这两个MBean,检查Done时间戳和LastIndexTime时间戳是否距当前时间不足45分钟。
对于MBean,如果时间值(Done或LastIndexedTime)从当前时间起超过45分钟,则索引作业会失败或用时过长。 这会导致异步索引失效。
强制关闭会导致AEM在重新启动后将异步索引挂起长达30分钟,并且通常需要另外15分钟才能完成首次重新索引传递,总共约45分钟(与Initial Detection时间范围45分钟绑定)。 如果您怀疑在强制关闭后暂停了索引,则:
首先,确定AEM实例是否以强制方式关闭(AEM进程被强制终止,或发生电源故障),然后重新启动。
如果发生强制关闭,则在重新启动时,AEM会自动暂停重新索引,最长为30分钟。
大约需要等待45分钟,AEM才能恢复正常的异步索引操作。
对于AEM 6.1,请确保安装了AEM 6.1 CFP 11。
在特殊情况下,用于管理异步索引的线程池可能会变得过载。 为了隔离索引过程,可以配置一个线程池,以防止其他AEM工作干扰Oak及时索引内容的能力。 为此,您应:
为Apache Sling调度程序定义一个用于异步索引的新的独立线程池:
验证新的Apache Sling Scheduler线程池是否已注册并显示在Apache Sling Scheduler状态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存储库统计信息MBean,并确定是否有任何ObservationQueueMaxLength
值大于10,000。
per second
部分中),以便确认ObservationQueueMaxLength
的秒量度为0。Consolidated Cache
统计MBean中,增加的DocChildren
高速缓存的missRate
中可以看到此关联。为避免超出可接受的观察队列限制,建议执行以下操作:
DiffCache
的大小。在以下两种情况下,可以将重新索引视为“完全停滞”:
重新索引非常缓慢,直到日志文件中没有关于已遍历的节点数的显着进度报告为止。
如果索引线程的日志文件(例如OutOfMemoryException
)中出现重复的异常,则重新索引会陷入无休止循环。 日志中重复出现相同的异常,表示Oak尝试重复对同一内容进行索引,但在同一问题上失败。
要识别并修复卡住的重新索引过程,请执行以下操作:
为了确定索引卡住的原因,必须收集以下信息:
收集5分钟线程转储,每2秒收集一个线程转储。
从异步IndexStats
MBean收集数据:
导航至AEM OSGi Web控制台>主>JMX > IndexStat >异步
使用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索引,可以:
将type属性设置为disabled
/oak:index/someNewIndex@type=disabled
或完全删除索引定义
完成后,将更改提交到存储库。
最后,在中止的索引通道上恢复异步索引。
abortAndPause()
命令的IndexStats
MBean中,调用resume()
命令。最好在安静时段(例如,不是在大内容摄取期间)重新编入索引,最好在已知并控制AEM加载的维护时段重新编入索引。 另外,请确保在其他维护活动期间不进行重新索引。