【问题标题】:SOLR - huge number of open searchersSOLR - 大量开放搜索者
【发布时间】:2013-12-11 09:37:18
【问题描述】:

我的 solr 设置包括一个主机、一个中继器和两个从机。从站每 10 秒轮询一次各自的主节点。搜索仅由从节点处理,而更新仅对主节点进行。这些部署在 Linux 机器上的 Jboss 应用服务器上。 sorl版本是4.0。

我们面临的问题是从盒在几天内耗尽了硬盘空间,我们目前正在通过每周重新启动从节点一次来解决这个问题。硬盘空间不足的原因是 Jboss 持有对数百个已删除索引文件的引用。

删除的文件引用仍然存在,因为我看到 SolrCore 有许多打开的搜索器。根据 solrconfig.xml,任何时候都应该有最多 2 个打开的搜索器。

另一件事我已经能够确定 SolrCore 仅在查询已运行并且复制周期更改已注册的核心搜索器时才保留打开的搜索器,而最后一个查询尚未完成。 SolrCore 将查询开始时的搜索器永久保存在内存中。

仅当查询使用我们编写的 SearchPlugin 时才会出现此问题。在搜索插件中,我们将关闭 SolrRequestSolrCore 对象。但它似乎仍然没有关闭关联的搜索器。

SolrCore portfolioIndexCore = container.getCore(portfolioCoreName);
SolrIndexSearcher portfolioIndexSearcher = portfolioIndexCore.getSearcher().get();

搜索完成后:

finally {

      if (null != portfolioSolrReq) portfolioSolrReq.close();

      if (null != portfolioIndexCore) {
        portfolioIndexCore.close();
      }
    }

我尝试将上面的 finally 块更改为:

finally {

      if (null != portfolioSolrReq) portfolioSolrReq.close();

      if (null != portfolioIndexCore) {
        RefCounted<SolrIndexSearcher> searcher = portfolioIndexCore.getNewestSearcher(false);
        if (searcher.get() != portfolioIndexSearcher) {
          log.warn("Current Searcher for the Core " + portfolioIndexCore
              + " has changed. Old Searcher=[" + portfolioIndexSearcher + "], new Searcher=["
              + searcher.get() + "]");
          portfolioIndexSearcher.close();
          portfolioIndexSearcher = null;
        }
        searcher.decref();
        portfolioIndexCore.close();
      }
    }

但这似乎也无济于事。

对上述问题的任何指示都会非常有帮助。

【问题讨论】:

    标签: solr lucene solr4


    【解决方案1】:

    解决方案被证明是相当简单的。我需要做的只是调用我打开的 SolrIndexSearcher 上的 decref() 调用 portfolioIndexCore.getSearcher().get();

    所以 finally 块现在看起来像:

    finally {
    
          if (null != portfolioSolrReq) portfolioSolrReq.close();
    
          if (null != portfolioIndexCore) {
            RefCounted<SolrIndexSearcher> searcher = portfolioIndexCore.getNewestSearcher(false);
            if (searcher.get() != portfolioIndexSearcher) {
              log.warn("Current Searcher for the Core " + portfolioIndexCore
                  + " has changed. Old Searcher=[" + portfolioIndexSearcher + "], new Searcher=["
                  + searcher.get() + "]");
              portfolioIndexSearcher.close();
              portfolioIndexSearcher = null;
            }else{
              portfolioIndexSearcher.decref()
              }
            searcher.decref();
            portfolioIndexCore.close();
          }
        }
    

    现在 SolrCore 似乎没有在内存中保存旧的 SolrIndexSearchers。

    课程: 如果您通过调用 solrCore.getSearcher().get() 获取 solrIndexSearcher,则必须始终调用 solrIndexSearcher.decref()

    然而,这应该是获得 IndexSearcher 引用的最后一个选项。首选方式应该是solrRequest.getSearcher().get()

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-13
      • 2015-02-22
      • 1970-01-01
      • 2015-12-10
      • 1970-01-01
      • 1970-01-01
      • 2011-12-10
      相关资源
      最近更新 更多