1

我们正在从 Solr 1.3 升级到 Solr 1.4.1。在使用 Solr 1.3 时,我们在“org.apache.lucene.store.FSDirectory$FSIndexInput.readInternal()”上看到了多个阻塞的活动线程。

为了利用 NIO 的优势,在升级到 Solr 1.4.1 时,我们在 "org.apache.solr.request.UnInvertedField.getUnInvertedField() &

SegmentReader$CoreReaders.getTermsReader”。因此,QTimes 从几百毫秒飙升到几千毫秒。单个查询甚至高达 30-40 秒。

  • 数千个查询后会出现多个阻塞线程。
  • 我们没有对相同字段进行分面和排序。
  • 我们的构面字段是多值文本字段,但不存在大文本值。
  • 索引大小 - 大约 10 GB
  • 我们没有在 schema.xml 中指定任何分面方法。
  • 我们的字段值缓存设置是:

有人可以告诉我们为什么我们会看到这些被阻止的线程吗?

此外,如果它们与我们的字段值缓存相关,那么大小为 175 的缓存将被很少的初始查询填满,然后我们应该看到多个阻塞线程?

如果我们有 "facet.method = enum" 会有什么不同?

这是否都与 fieldValueCache 相关,还是我们需要设置一些其他配置来避免这些阻塞线程?

谢谢,

拉奇塔

缓存值示例:

facetField1_27443 :
{field=facet1_27443,memSize=4214884,tindexSize=52,time=22,phase1=15,nTerms=4,bigTerms=0,termInstances=6,uses=1}

facetField1_70 :
{field=facetField1_70,memSize=4223310,tindexSize=308,time=28,phase1=21,nTerms=636,bigTerms=0,termInstances=14404,uses=1}

facetField2:{field=facetField2,memSize=4262644,tindexSize=3156,time=273,phase1=267,nTerms=12188,bigTerms=0,termInstances=1255522,uses=7031}

“org.apache.solr.request.UnInvertedField.getUnInvertedField() - BLOCKED”的堆栈跟踪

在 org.apache.solr.request.UnInvertedField.getUnInvertedField (UnInvertedField.java:837) 在 org.apache.solr.request.SimpleFacets.getTermCounts (SimpleFacets.java:250) 在 org.apache.solr.request.SimpleFacets.getFacetFieldCounts (SimpleFacets.java:283) 在 org.apache.solr.request.SimpleFacets.getFacetCounts (SimpleFacets.java:166) 在 org.apache.solr.handler.component.FacetComponent.process (FacetComponent.java:72) 在 org. org.apache.solr.handler.RequestHandlerBase.handleRequest (RequestHandlerBase.java:131) 中的 apache.solr.handler.component.SearchHandler.handleRequestBody (SearchHandler.java:195) org.apache.solr.core.SolrCore.execute ( SolrCore.java:1316) 在 org.apache.solr.servlet.SolrDispatchFilter.execute (SolrDispatchFilter.java:338) 在 org.apache.solr.servlet.SolrDispatchFilter.doFilter (SolrDispatchFilter.java:241) 在 com.caucho。server.dispatch.FilterFilterChain.doFilter (FilterFilterChain.java:87) 在 com.caucho.server.webapp.WebAppFilterChain.doFilter (WebAppFilterChain.java:187) 在 com.caucho.server.dispatch.ServletInvocation.service (ServletInvocation.java: 266) 在 com.caucho.server.http.HttpRequest.handleRequest (HttpRequest.java:270) 在 com.caucho.server.port.TcpConnection.run (TcpConnection.java:678) 在 com.caucho.util.ThreadPool$Item .runTasks (ThreadPool.java:721) 在 com.caucho.util.ThreadPool$Item.run (ThreadPool.java:643) 在 java.lang.Thread.run (Thread.java:595)handleRequest (HttpRequest.java:270) at com.caucho.server.port.TcpConnection.run (TcpConnection.java:678) at com.caucho.util.ThreadPool$Item.runTasks (ThreadPool.java:721) at com.caucho .util.ThreadPool$Item.run (ThreadPool.java:643) 在 java.lang.Thread.run (Thread.java:595)handleRequest (HttpRequest.java:270) at com.caucho.server.port.TcpConnection.run (TcpConnection.java:678) at com.caucho.util.ThreadPool$Item.runTasks (ThreadPool.java:721) at com.caucho .util.ThreadPool$Item.run (ThreadPool.java:643) 在 java.lang.Thread.run (Thread.java:595)

org.apache.lucene.index.SegmentReader$CoreReaders.getTermsReader() - 阻塞

在 org.apache.lucene.index.SegmentReader$CoreReaders.getTermsReader (SegmentReader.java:170) 在 org.apache.lucene.index.SegmentTermDocs。(SegmentTermDocs.java:52) 在 org.apache.lucene.index.SegmentReader.termDocs (SegmentReader.java:987) 在 org.apache.lucene.index.IndexReader.termDocs (IndexReader.java:1102) 在 org.apache。 lucene.index.SegmentReader.termDocs (SegmentReader.java:981) 在 org.apache.solr.search.SolrIndexReader.termDocs (SolrIndexReader.java:320) 在 org.apache.solr.search.SolrIndexSearcher.getDocSetNC (SolrIndexSearcher.java: 640) 在 org.apache.solr.search.SolrIndexSearcher.numDocs (SolrIndexSearcher.java:1422) 在 com.askme.solrenhancements.facet.ExtendedFacet .getCustomFacetCount (ExtendedFacet.java:132) 在 com.askme.solrenhancements。

4

1 回答 1

0

我在测试中也遇到了这个问题。我发现以下代码附近的块很有趣:

SimpleFSDirectory.readInternal

protected void readInternal(byte[] b, int offset, int len)
     throws IOException {
  synchronized (file) {
    long position = getFilePointer();
    if (position != file.position) {
      file.seek(position);
      file.position = position;
    }
    int total = 0;

    try {
      do {
        final int readLength;
        if (total + chunkSize > len) {
          readLength = len - total;
        } else {
          // LUCENE-1566 - work around JVM Bug by breaking very large reads into chunks
          readLength = chunkSize;
        }
        final int i = file.read(b, offset + total, readLength);
        if (i == -1) {
          throw new IOException("read past EOF");
        }
        file.position += i;
        total += i;
      } while (total < len);
    } catch (OutOfMemoryError e) {
      // propagate OOM up and add a hint for 32bit VM Users hitting the bug
      // with a large chunk size in the fast path.
      final OutOfMemoryError outOfMemoryError = new OutOfMemoryError(
          "OutOfMemoryError likely caused by the Sun VM Bug described in "
          + "https://issues.apache.org/jira/browse/LUCENE-1566; try calling FSDirectory.setReadChunkSize "
          + "with a a value smaller than the current chunks size (" + chunkSize + ")");
      outOfMemoryError.initCause(e);
      throw outOfMemoryError;
    }
  }
}

我猜你的 solr 和我一样是在 windows 上构建的。您可以使用以下帖子中的“代码补丁”:使用 NIO 位置读取来避免 FSIndexInput 中的同步

于 2011-03-10T13:54:27.420 回答