【问题标题】:Lucene experts: how best to run diagnostics against an IndexWriter to resolve performance issues?Lucene 专家:如何最好地对 IndexWriter 运行诊断以解决性能问题?
【发布时间】:2011-11-05 22:47:11
【问题描述】:

我有一个索引,目前占用大约 1gb 的空间,有大约 250 万个文档。索引存储在固态驱动器上以提高速度。我一次添加 2500 个文档,并在添加每个批次后提交。该索引是一个“实时”索引,需要在白天和晚上保持最新,因此最小化写入速度非常重要。我使用的合并因子为 10,并且从不调用 Optimize(),而是允许索引根据合并因子根据需要优化自身。

我需要在添加每个批次后提交文档,因为我会记录这一事实,以便在应用程序崩溃或重新启动时,它可以从中断处继续。如果我不提交,存储的状态将与索引中的内容不一致。我假设如果作者在没有提交的情况下被销毁,我的添加、删除和更新都会丢失。

无论如何,我注意到在任意时间段之后,可能是两分钟或两小时以及之前提交的一些可变数量,索引器似乎停止在 IndexWriter.AddDocument(doc) 方法上,我可以' t 为我的生活弄清楚它为什么会停止或如何解决它。该块可以保留两个小时以上,对于在数百万个文档中占用不到 2GB 的索引并且有一个 SSD 驱动器可以使用来说,这似乎很奇怪。

什么可能导致 AddDocument 阻塞?是否有任何 Lucene 诊断实用程序可以帮助我?我还能寻找什么来追踪问题?

【问题讨论】:

  • 我假设您正在使用 ConcurrentMergeScheduler?
  • ConcurrentMergeScheduler 是默认的合并调度程序,根据文档。
  • 这是真的,只是想把显而易见的事情排除在外。
  • 我不确定 Lucene.NET 是否支持 IndexWriter.SetInfoStream() 但如果您将此输出重定向到您可以检查的内容,它可能会为您提供线索。
  • 是的,它确实支持。我还将继承 ConcurrentMergeScheduler,并覆盖 Domerge 和 HandleMergeException 方法,并在调用这些方法时写入日志。合并肯定会对您的磁盘 IO 造成压力。

标签: lucene lucene.net


【解决方案1】:

您可以使用 IndexWriter.SetInfoStream() 将诊断输出重定向到可能会提示您出现问题的流。

【讨论】:

    猜你喜欢
    • 2010-12-16
    • 2012-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多