Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

LUCENE-10346: Specially treat SingletonSortedNumericDocValues in FastTaxonomyFacetCounts#countAll() #574

Merged
merged 2 commits into from
Jan 3, 2022

Conversation

gf2121
Copy link
Contributor

@gf2121 gf2121 commented Dec 31, 2021

CPU profile often tells SingletonSortedNumericDocValues#nextDoc() is using a high percentage of CPU when running luceneutil, but the nextDoc() of dense cases should be rather simple. So I suspect that it is too many layers of abstraction that cause the stress of JVM. Unwraping it to NumericDocvalues shows around 30% speed up.

                            TaskQPS baseline      StdDevQPS my_modified_version      StdDev                Pct diff p-value
            HighTermTitleBDVSort      132.24     (20.6%)      125.67      (9.9%)   -5.0% ( -29% -   32%) 0.330
                         LowTerm     1424.13      (3.2%)     1381.34      (4.4%)   -3.0% ( -10% -    4%) 0.014
                   OrHighNotHigh      707.82      (3.3%)      687.49      (6.0%)   -2.9% ( -11% -    6%) 0.062
                      TermDTSort      155.32     (10.9%)      151.02     (10.2%)   -2.8% ( -21% -   20%) 0.406
                    OrNotHighMed      618.46      (3.7%)      602.65      (4.4%)   -2.6% ( -10% -    5%) 0.047
                          Fuzzy1       76.22      (5.3%)       74.71      (6.6%)   -2.0% ( -13% -   10%) 0.293
               HighTermMonthSort      174.89     (10.4%)      171.45     (10.6%)   -2.0% ( -20% -   21%) 0.554
                    OrHighNotMed      776.08      (4.9%)      761.70      (7.8%)   -1.9% ( -13% -   11%) 0.367
           HighTermDayOfYearSort       56.23     (10.7%)       55.26     (10.9%)   -1.7% ( -21% -   22%) 0.615
                         MedTerm     1449.48      (3.7%)     1425.87      (5.1%)   -1.6% ( -10% -    7%) 0.250
                   OrNotHighHigh      687.92      (4.9%)      677.06      (5.5%)   -1.6% ( -11% -    9%) 0.339
                    OrHighNotLow      742.99      (4.7%)      732.23      (5.9%)   -1.4% ( -11% -    9%) 0.390
                    OrNotHighLow      789.37      (2.7%)      778.80      (4.7%)   -1.3% (  -8% -    6%) 0.270
                      HighPhrase       75.84      (2.2%)       75.14      (3.0%)   -0.9% (  -6% -    4%) 0.269
                HighSloppyPhrase       20.71      (5.9%)       20.56      (5.2%)   -0.7% ( -11% -   11%) 0.678
                          IntNRQ      106.38     (18.4%)      105.67     (18.2%)   -0.7% ( -31% -   44%) 0.908
                       OrHighMed       45.10      (1.5%)       44.83      (1.8%)   -0.6% (  -3% -    2%) 0.261
                     MedSpanNear      192.49      (2.5%)      191.51      (3.5%)   -0.5% (  -6% -    5%) 0.593
                       OrHighLow      489.82      (5.5%)      487.79      (5.7%)   -0.4% ( -11% -   11%) 0.815
                 MedSloppyPhrase       27.33      (2.9%)       27.22      (2.3%)   -0.4% (  -5% -    5%) 0.623
                       MedPhrase      208.94      (2.9%)      208.09      (3.7%)   -0.4% (  -6% -    6%) 0.696
                         Respell       71.84      (2.4%)       71.55      (2.4%)   -0.4% (  -5% -    4%) 0.600
                      OrHighHigh       36.26      (1.3%)       36.13      (1.1%)   -0.4% (  -2% -    2%) 0.344
           BrowseMonthSSDVFacets       15.95      (2.7%)       15.90      (2.5%)   -0.4% (  -5% -    5%) 0.672
                      AndHighMed       85.83      (2.2%)       85.53      (2.7%)   -0.3% (  -5% -    4%) 0.658
                         Prefix3      123.15      (2.6%)      122.74      (2.5%)   -0.3% (  -5% -    4%) 0.678
                          Fuzzy2       76.41      (4.7%)       76.23      (4.2%)   -0.2% (  -8% -    9%) 0.867
       BrowseDayOfYearSSDVFacets       14.52      (2.4%)       14.49      (2.2%)   -0.2% (  -4% -    4%) 0.747
             MedIntervalsOrdered       56.39      (4.2%)       56.27      (4.1%)   -0.2% (  -8% -    8%) 0.871
            HighIntervalsOrdered        9.29      (4.7%)        9.27      (4.4%)   -0.2% (  -8% -    9%) 0.896
         AndHighMedDayTaxoFacets      119.76      (2.5%)      119.53      (2.9%)   -0.2% (  -5% -    5%) 0.831
                    HighSpanNear       20.89      (2.0%)       20.85      (2.3%)   -0.2% (  -4% -    4%) 0.803
             LowIntervalsOrdered       45.51      (4.9%)       45.47      (4.8%)   -0.1% (  -9% -   10%) 0.952
                       LowPhrase       64.17      (2.6%)       64.14      (2.6%)   -0.1% (  -5% -    5%) 0.951
                     LowSpanNear      104.45      (2.2%)      104.41      (1.9%)   -0.0% (  -4% -    4%) 0.959
                        Wildcard      103.83      (2.8%)      103.80      (2.8%)   -0.0% (  -5% -    5%) 0.970
                     AndHighHigh       42.33      (2.6%)       42.33      (2.4%)   -0.0% (  -4% -    5%) 0.991
     BrowseRandomLabelSSDVFacets       10.62      (2.5%)       10.62      (1.8%)    0.0% (  -4% -    4%) 0.981
        AndHighHighDayTaxoFacets       29.75      (2.3%)       29.76      (2.7%)    0.1% (  -4% -    5%) 0.949
            MedTermDayTaxoFacets       26.56      (3.0%)       26.58      (2.5%)    0.1% (  -5% -    5%) 0.945
                      AndHighLow     1012.26      (4.5%)     1013.62      (4.3%)    0.1% (  -8% -    9%) 0.923
                 LowSloppyPhrase       78.82      (6.8%)       79.03      (6.0%)    0.3% ( -11% -   14%) 0.897
                        PKLookup      204.09      (3.0%)      204.82      (2.9%)    0.4% (  -5% -    6%) 0.703
          OrHighMedDayTaxoFacets       14.53      (3.4%)       14.59      (2.7%)    0.4% (  -5% -    6%) 0.694
                        HighTerm     1607.26      (5.2%)     1623.99      (5.6%)    1.0% (  -9% -   12%) 0.543
     BrowseRandomLabelTaxoFacets       11.93      (6.9%)       15.52      (2.5%)   30.1% (  19% -   42%) 0.000
            BrowseDateTaxoFacets       13.46      (9.0%)       18.28      (3.6%)   35.8% (  21% -   53%) 0.000
       BrowseDayOfYearTaxoFacets       13.59      (9.1%)       18.53      (3.6%)   36.3% (  21% -   53%) 0.000
           BrowseMonthTaxoFacets       13.93     (10.9%)       19.70     (14.9%)   41.4% (  14% -   75%) 0.000

Baseline

PERCENT       CPU SAMPLES   STACK
3.85%         12316         org.apache.lucene.facet.sortedset.SortedSetDocValuesFacetCounts#countOneSegment()
3.78%         12076         org.apache.lucene.util.packed.DirectReader$DirectPackedReader20#get()
3.72%         11905         org.apache.lucene.index.SingletonSortedNumericDocValues#nextDoc()
2.88%         9199          org.apache.lucene.queries.intervals.OrderedIntervalsSource$OrderedIntervalIterator#nextInterval()
2.31%         7380          org.apache.lucene.facet.taxonomy.FastTaxonomyFacetCounts#countAll()
2.27%         7270          org.apache.lucene.codecs.lucene90.Lucene90DocValuesProducer$20#ordValue()
2.25%         7211          org.apache.lucene.facet.taxonomy.IntTaxonomyFacets#increment()
2.23%         7139          org.apache.lucene.index.SingletonSortedNumericDocValues#nextValue()
1.88%         6006          java.nio.Buffer#checkIndex()
1.86%         5965          jdk.internal.misc.Unsafe#convEndian()
1.85%         5916          org.apache.lucene.util.packed.DirectReader$DirectPackedReader4#get()
1.72%         5491          org.apache.lucene.codecs.lucene90.Lucene90PostingsReader$EverythingEnum#nextPosition()
1.49%         4780          java.nio.DirectByteBuffer#ix()
1.42%         4548          java.nio.Buffer#scope()
1.40%         4465          org.apache.lucene.codecs.lucene90.Lucene90DocValuesProducer$4#longValue()
1.39%         4434          org.apache.lucene.codecs.lucene90.Lucene90PostingsReader$EverythingEnum#advance()
1.33%         4254          org.apache.lucene.store.ByteBufferGuard#ensureValid()
1.32%         4219          org.apache.lucene.util.packed.DirectReader$DirectPackedReader12#get()
1.28%         4109          org.apache.lucene.codecs.lucene90.Lucene90DocValuesProducer$20#nextDoc()
1.28%         4089          jdk.internal.misc.ScopedMemoryAccess#getByteInternal()
1.16%         3709          org.apache.lucene.codecs.lucene90.Lucene90PostingsReader$BlockImpactsPostingsEnum#advance()
1.10%         3517          org.apache.lucene.store.ByteBufferGuard#getInt()
1.07%         3427          org.apache.lucene.codecs.lucene90.Lucene90NormsProducer$3#longValue()
0.98%         3149          org.apache.lucene.search.ConjunctionDISI#doNext()
0.98%         3120          org.apache.lucene.codecs.lucene90.Lucene90PostingsReader#findFirstGreater()
0.93%         2969          org.apache.lucene.codecs.lucene90.Lucene90DocValuesProducer$3#longValue()
0.92%         2927          org.apache.lucene.store.ByteBufferGuard#getByte()
0.88%         2828          com.carrotsearch.hppc.IntIntHashMap#indexOf()
0.82%         2635          org.apache.lucene.codecs.lucene90.Lucene90PostingsReader$BlockImpactsDocsEnum#advance()
0.82%         2633          org.apache.lucene.search.similarities.BM25Similarity$BM25Scorer#score()

Candidate

PERCENT       CPU SAMPLES   STACK
4.15%         12823         org.apache.lucene.util.packed.DirectReader$DirectPackedReader20#get()
3.94%         12186         org.apache.lucene.facet.sortedset.SortedSetDocValuesFacetCounts#countOneSegment()
3.32%         10266         org.apache.lucene.facet.taxonomy.FastTaxonomyFacetCounts#countAll()
2.98%         9208          org.apache.lucene.queries.intervals.OrderedIntervalsSource$OrderedIntervalIterator#nextInterval()
2.38%         7351          org.apache.lucene.codecs.lucene90.Lucene90DocValuesProducer$20#ordValue()
2.07%         6386          org.apache.lucene.codecs.lucene90.Lucene90DocValuesProducer$DenseNumericDocValues#nextDoc()
1.85%         5723          org.apache.lucene.facet.taxonomy.IntTaxonomyFacets#increment()
1.81%         5600          jdk.internal.misc.Unsafe#convEndian()
1.81%         5588          org.apache.lucene.codecs.lucene90.Lucene90PostingsReader$EverythingEnum#nextPosition()
1.75%         5409          java.nio.Buffer#checkIndex()
1.72%         5310          org.apache.lucene.util.packed.DirectReader$DirectPackedReader4#get()
1.50%         4631          java.nio.Buffer#scope()
1.44%         4437          jdk.internal.misc.ScopedMemoryAccess#getByteInternal()
1.43%         4408          org.apache.lucene.codecs.lucene90.Lucene90PostingsReader$EverythingEnum#advance()
1.39%         4297          java.nio.DirectByteBuffer#ix()
1.39%         4280          org.apache.lucene.util.packed.DirectReader$DirectPackedReader12#get()
1.33%         4111          org.apache.lucene.store.ByteBufferGuard#ensureValid()
1.31%         4052          org.apache.lucene.codecs.lucene90.Lucene90DocValuesProducer$20#nextDoc()
1.29%         3974          org.apache.lucene.codecs.lucene90.Lucene90DocValuesProducer$4#longValue()
1.22%         3761          org.apache.lucene.codecs.lucene90.Lucene90PostingsReader$BlockImpactsPostingsEnum#advance()
1.13%         3502          org.apache.lucene.codecs.lucene90.Lucene90NormsProducer$3#longValue()
1.04%         3219          org.apache.lucene.search.ConjunctionDISI#doNext()
1.00%         3099          org.apache.lucene.codecs.lucene90.Lucene90PostingsReader#findFirstGreater()
0.99%         3067          org.apache.lucene.codecs.lucene90.Lucene90DocValuesProducer$3#longValue()
0.99%         3052          org.apache.lucene.store.ByteBufferGuard#getInt()
0.89%         2762          org.apache.lucene.codecs.lucene90.Lucene90PostingsReader$BlockImpactsDocsEnum#advance()
0.87%         2690          org.apache.lucene.search.similarities.BM25Similarity$BM25Scorer#score()
0.86%         2663          org.apache.lucene.store.ByteBufferGuard#getByte()
0.80%         2476          org.apache.lucene.codecs.lucene90.ForUtil#expand8()
0.78%         2420          org.apache.lucene.codecs.lucene90.Lucene90PostingsReader$EverythingEnum#skipPositions()

@gf2121 gf2121 changed the title LUCENE-10346: unwrap LUCENE-10346: Specially treat SingletonSortedNumericDocValues in FastTaxonomyFacetCounts#countAll() Dec 31, 2021
@rmuir
Copy link
Member

rmuir commented Dec 31, 2021

very interesting (and simple contained) find. cc @gsmiller @mikemccand , I think this is an easy win? Thank you @gf2121 !

@rmuir
Copy link
Member

rmuir commented Dec 31, 2021

This actually puts the taxo facets as running faster than SSDV facets? I wonder if the same optimization is missing in SSDV facets countall? Or perhaps there is a more complex explanation? Anyway, +1 to this change regardless, just wondering if we miss to optimize the single-valued situation for SSDV facets?

@gf2121
Copy link
Contributor Author

gf2121 commented Jan 1, 2022

Thanks @rmuir for so quick reply! Happy New Year :)

just wondering if we miss to optimize the single-valued situation for SSDV facets?

Thanks for remiding! I find we have already introduced the similar optimization for SSDV in #255

@jpountz jpountz merged commit 26713b3 into apache:main Jan 3, 2022
jpountz pushed a commit that referenced this pull request Jan 3, 2022
@gsmiller
Copy link
Contributor

gsmiller commented Jan 4, 2022

Great find! For what it's worth, this was overlooked when specializing SSDV in #255 because it was still using binary doc values at the time. When I switched over to numeric doc values, it looks like I overlooked adding this specialization. Thanks for the improvement!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants