loki icon indicating copy to clipboard operation
loki copied to clipboard

refactor(stringlabels): Support stringlabels in storage.

Open jeschkies opened this issue 6 months ago • 2 comments

What this PR does / why we need it: This is a next step of support Prometheus stringlabels implementation in Loki. It adds support in the storage package.

Special notes for your reviewer: The tests should compile with build tag stringlabels.

Outstanding Performance Issues

  • [ ] Benchmark_store_SelectSample
  • [ ] bloom/v1
    • [ ] BenchmarkMapClear
    • [ ] BenchmarkNewMap
    • [ ] BenchmarkBlockQuerying
    • [ ] BenchmarkScalableBloomTestAndAdd
  • [x] Chunk encoding and decoding
  • [ ] series.BenchmarkParseIndexEntries
  • [x] series.index.BenchmarkEncode
  • [ ] Benchmark_BlocksCacheOld
  • [x] tsdb
    • [x] BenchmarkTenantHeads
    • [x] BenchmarkTSDBIndex_Volume
  • [ ] Benchmark_MultiQueries

Checklist

  • [ ] Reviewed the CONTRIBUTING.md guide (required)
  • [ ] Documentation added
  • [ ] Tests updated
  • [ ] Title matches the required conventional commits format, see here
    • Note that Promtail is considered to be feature complete, and future development for logs collection will be in Grafana Alloy. As such, feat PRs are unlikely to be accepted unless a case can be made for the feature actually being a bug fix to existing behavior.
  • [ ] Changes that require user attention or interaction to upgrade are documented in docs/sources/setup/upgrade/_index.md
  • [ ] If the change is deprecating or removing a configuration option, update the deprecated-config.yaml and deleted-config.yaml files respectively in the tools/deprecated-config-checker directory. Example PR

jeschkies avatar Jun 13 '25 15:06 jeschkies

I still have to run the benchmarks

jeschkies avatar Jun 13 '25 15:06 jeschkies

Here are the benchmark results

                                                        │ before.log  │             after.log              │
                                                        │   sec/op    │   sec/op     vs base               │
_store_SelectSample/count_over_time({foo="bar"}[5m])-16   370.7µ ± 4%   392.4µ ± 3%  +5.86% (p=0.000 n=10)
_store_SelectSample/rate({foo="bar"}[5m])-16              356.8µ ± 2%   375.8µ ± 8%  +5.34% (p=0.001 n=10)
_store_SelectSample/bytes_rate({foo="bar"}[5m])-16        364.7µ ± 2%   380.8µ ± 3%  +4.40% (p=0.000 n=10)
_store_SelectSample/bytes_over_time({foo="bar"}[5m])-16   358.2µ ± 3%   385.7µ ± 2%  +7.67% (p=0.000 n=10)
geomean                                                   362.6µ        383.6µ       +5.81%

                                                        │  before.log  │              after.log              │
                                                        │  samples/op  │ samples/op  vs base                 │
_store_SelectSample/count_over_time({foo="bar"}[5m])-16   0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=10) ¹
_store_SelectSample/rate({foo="bar"}[5m])-16              0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=10) ¹
_store_SelectSample/bytes_rate({foo="bar"}[5m])-16        0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=10) ¹
_store_SelectSample/bytes_over_time({foo="bar"}[5m])-16   0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=10) ¹
geomean                                                              ²               +0.00%                ²
¹ all samples are equal
² summaries must be >0 to compute geomean

                                                        │  before.log  │              after.log              │
                                                        │     B/op     │     B/op      vs base               │
_store_SelectSample/count_over_time({foo="bar"}[5m])-16   385.3Ki ± 0%   386.8Ki ± 0%  +0.38% (p=0.043 n=10)
_store_SelectSample/rate({foo="bar"}[5m])-16              384.2Ki ± 1%   385.7Ki ± 0%       ~ (p=0.190 n=10)
_store_SelectSample/bytes_rate({foo="bar"}[5m])-16        386.4Ki ± 1%   386.4Ki ± 0%       ~ (p=0.739 n=10)
_store_SelectSample/bytes_over_time({foo="bar"}[5m])-16   385.2Ki ± 0%   386.0Ki ± 0%       ~ (p=0.165 n=10)
geomean                                                   385.3Ki        386.2Ki       +0.25%

                                                        │ before.log  │              after.log               │
                                                        │  allocs/op  │  allocs/op   vs base                 │
_store_SelectSample/count_over_time({foo="bar"}[5m])-16   1.038k ± 0%   1.038k ± 0%       ~ (p=1.000 n=10) ¹
_store_SelectSample/rate({foo="bar"}[5m])-16              1.038k ± 0%   1.038k ± 0%       ~ (p=1.000 n=10) ¹
_store_SelectSample/bytes_rate({foo="bar"}[5m])-16        1.038k ± 0%   1.038k ± 0%       ~ (p=1.000 n=10) ¹
_store_SelectSample/bytes_over_time({foo="bar"}[5m])-16   1.038k ± 0%   1.038k ± 0%       ~ (p=1.000 n=10) ¹
geomean                                                   1.038k        1.038k       +0.00%
¹ all samples are equal

pkg: github.com/grafana/loki/v3/pkg/storage/bloom/v1
                           │ before.log  │             after.log              │
                           │   sec/op    │   sec/op     vs base               │
PopulateSeriesWithBloom-16   1.944m ± 2%   1.987m ± 5%       ~ (p=0.218 n=10)
MapClear-16                  22.32m ± 1%   24.03m ± 5%  +7.66% (p=0.002 n=10)
NewMap-16                    25.99m ± 1%   27.09m ± 3%  +4.23% (p=0.000 n=10)
BlockQuerying/fused-16       216.9m ± 4%   227.6m ± 4%  +4.95% (p=0.005 n=10)
geomean                      22.24m        23.29m       +4.74%

                           │  before.log  │              after.log              │
                           │     B/op     │     B/op      vs base               │
PopulateSeriesWithBloom-16   10.03Mi ± 0%   10.03Mi ± 0%  +0.00% (p=0.003 n=10)
MapClear-16                  3.621Mi ± 0%   3.646Mi ± 0%  +0.69% (p=0.001 n=10)
NewMap-16                    13.66Mi ± 0%   13.67Mi ± 0%       ~ (p=0.052 n=10)
BlockQuerying/fused-16       42.01Mi ± 1%   41.95Mi ± 1%       ~ (p=0.631 n=10)
geomean                      12.02Mi        12.03Mi       +0.16%

                           │ before.log  │              after.log               │
                           │  allocs/op  │  allocs/op   vs base                 │
PopulateSeriesWithBloom-16    662.0 ± 0%    662.0 ± 0%       ~ (p=1.000 n=10) ¹
MapClear-16                  449.5k ± 0%   449.5k ± 0%  +0.00% (p=0.001 n=10)
NewMap-16                    450.0k ± 0%   450.0k ± 0%       ~ (p=0.061 n=10)
BlockQuerying/fused-16       470.4k ± 0%   470.4k ± 0%       ~ (p=1.000 n=10)
geomean                      89.09k        89.09k       +0.00%
¹ all samples are equal

pkg: github.com/grafana/loki/v3/pkg/storage/bloom/v1/filter
                              │ before.log  │             after.log              │
                              │   sec/op    │   sec/op     vs base               │
HashKernel-16                   8.006n ± 6%   7.687n ± 4%       ~ (p=0.075 n=10)
BucketsIncrement-16             17.11n ± 6%   17.07n ± 3%       ~ (p=0.684 n=10)
BucketsSet-16                   10.17n ± 8%   10.17n ± 1%       ~ (p=0.361 n=10)
BucketsGet-16                   7.216n ± 7%   7.391n ± 4%       ~ (p=0.436 n=10)
PartitionedBloomAdd-16          37.05n ± 6%   37.54n ± 5%       ~ (p=0.247 n=10)
PartitionedBloomTest-16         13.47n ± 7%   13.54n ± 7%       ~ (p=0.541 n=10)
PartitionedBloomTestAndAdd-16   48.47n ± 4%   47.13n ± 7%       ~ (p=0.579 n=10)
PartitionedFillRatio-16         14.87µ ± 7%   14.72µ ± 5%       ~ (p=0.631 n=10)
ScalableBloomAdd-16             75.63n ± 5%   76.71n ± 5%       ~ (p=0.739 n=10)
ScalableBloomTest-16            16.18n ± 5%   15.91n ± 5%       ~ (p=0.425 n=10)
ScalableBloomTestAndAdd-16      165.7n ± 6%   173.9n ± 6%       ~ (p=0.165 n=10)
Read-16                         214.1n ± 0%   214.0n ± 0%       ~ (p=0.588 n=10)
geomean                         48.19n        48.22n       +0.05%

                              │   before.log   │              after.log               │
                              │      B/op      │    B/op      vs base                 │
HashKernel-16                   0.000 ±   0%     0.000 ±  0%       ~ (p=1.000 n=10) ¹
BucketsIncrement-16             0.000 ±   0%     0.000 ±  0%       ~ (p=1.000 n=10) ¹
BucketsSet-16                   0.000 ±   0%     0.000 ±  0%       ~ (p=1.000 n=10) ¹
BucketsGet-16                   0.000 ±   0%     0.000 ±  0%       ~ (p=1.000 n=10) ¹
PartitionedBloomAdd-16          0.000 ±   0%     0.000 ±  0%       ~ (p=1.000 n=10) ¹
PartitionedBloomTest-16         0.000 ±   0%     0.000 ±  0%       ~ (p=1.000 n=10) ¹
PartitionedBloomTestAndAdd-16   0.000 ±   0%     0.000 ±  0%       ~ (p=1.000 n=10) ¹
PartitionedFillRatio-16         0.000 ±   0%     0.000 ±  0%       ~ (p=1.000 n=10) ¹
ScalableBloomAdd-16             1.000 ±   0%     1.000 ±  0%       ~ (p=1.000 n=10) ¹
ScalableBloomTest-16            0.000 ±   0%     0.000 ±  0%       ~ (p=1.000 n=10) ¹
ScalableBloomTestAndAdd-16      1.000 ± 100%     2.000 ± 50%       ~ (p=0.370 n=10)
Read-16                         15.00 ±   0%     15.00 ±  7%       ~ (p=1.000 n=10)
geomean                                      ²                +5.95%                ²
¹ all samples are equal
² summaries must be >0 to compute geomean

                              │  before.log  │              after.log              │
                              │  allocs/op   │ allocs/op   vs base                 │
HashKernel-16                   0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=10) ¹
BucketsIncrement-16             0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=10) ¹
BucketsSet-16                   0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=10) ¹
BucketsGet-16                   0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=10) ¹
PartitionedBloomAdd-16          0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=10) ¹
PartitionedBloomTest-16         0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=10) ¹
PartitionedBloomTestAndAdd-16   0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=10) ¹
PartitionedFillRatio-16         0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=10) ¹
ScalableBloomAdd-16             0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=10) ¹
ScalableBloomTest-16            0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=10) ¹
ScalableBloomTestAndAdd-16      0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=10) ¹
Read-16                         1.000 ± 0%     1.000 ± 0%       ~ (p=1.000 n=10) ¹
geomean                                    ²               +0.00%                ²
¹ all samples are equal
² summaries must be >0 to compute geomean

pkg: github.com/grafana/loki/v3/pkg/storage/chunk
                             │  before.log  │              after.log               │
                             │    sec/op    │    sec/op     vs base                │
Encode-16                      31.55µ ± 17%   35.41µ ± 14%  +12.23% (p=0.035 n=10)
Decode1-16                     34.61µ ±  5%   42.28µ ±  3%  +22.15% (p=0.000 n=10)
Decode100-16                   537.7µ ±  5%   551.9µ ±  1%        ~ (p=0.089 n=10)
Decode10000-16                 52.40m ±  1%   52.28m ±  1%        ~ (p=0.529 n=10)
ParseNewerExternalKey-16       377.4n ±  8%   399.9n ±  2%   +5.98% (p=0.000 n=10)
ParseNewExternalKey-16         378.2n ±  5%   383.2n ±  3%        ~ (p=0.225 n=10)
RootParseNewExternalKey-16     352.9n ±  7%   343.1n ±  7%   -2.76% (p=0.042 n=10)
RootParseNewerExternalKey-16   346.3n ±  2%   347.7n ±  6%        ~ (p=0.565 n=10)
geomean                        12.34µ         12.95µ         +4.95%

                             │   before.log   │               after.log                │
                             │      B/op      │     B/op      vs base                  │
Encode-16                      148.0Ki ± 0%     148.1Ki ± 0%   +0.09% (p=0.023 n=10)
Decode1-16                     147.1Ki ± 0%     147.6Ki ± 0%   +0.37% (p=0.000 n=10)
Decode100-16                   438.7Ki ± 0%     492.6Ki ± 0%  +12.29% (p=0.000 n=10)
Decode10000-16                 28.90Mi ± 0%     34.17Mi ± 0%  +18.21% (p=0.000 n=10)
ParseNewerExternalKey-16         0.000 ± 0%       0.000 ± 0%        ~ (p=1.000 n=10) ¹
ParseNewExternalKey-16           0.000 ± 0%       0.000 ± 0%        ~ (p=1.000 n=10) ¹
RootParseNewExternalKey-16       0.000 ± 0%       0.000 ± 0%        ~ (p=1.000 n=10) ¹
RootParseNewerExternalKey-16     0.000 ± 0%       0.000 ± 0%        ~ (p=1.000 n=10) ¹
geomean                                     ²                  +3.66%                ²
¹ all samples are equal
² summaries must be >0 to compute geomean

                             │  before.log   │              after.log               │
                             │   allocs/op   │  allocs/op   vs base                 │
Encode-16                       27.00 ± 0%      27.00 ± 0%       ~ (p=1.000 n=10) ¹
Decode1-16                      53.00 ± 0%      53.00 ± 0%       ~ (p=1.000 n=10) ¹
Decode100-16                   5.003k ± 0%     5.003k ± 0%       ~ (p=1.000 n=10) ¹
Decode10000-16                 500.0k ± 0%     500.0k ± 0%  +0.00% (p=0.000 n=10)
ParseNewerExternalKey-16        0.000 ± 0%      0.000 ± 0%       ~ (p=1.000 n=10) ¹
ParseNewExternalKey-16          0.000 ± 0%      0.000 ± 0%       ~ (p=1.000 n=10) ¹
RootParseNewExternalKey-16      0.000 ± 0%      0.000 ± 0%       ~ (p=1.000 n=10) ¹
RootParseNewerExternalKey-16    0.000 ± 0%      0.000 ± 0%       ~ (p=1.000 n=10) ¹
geomean                                    ²                +0.00%                ²
¹ all samples are equal
² summaries must be >0 to compute geomean

pkg: github.com/grafana/loki/v3/pkg/storage/chunk/client/local
          │ before.log  │           after.log           │
          │   sec/op    │   sec/op     vs base          │
_Query-16   1.089µ ± 1%   1.086µ ± 1%  ~ (p=0.540 n=10)

          │ before.log │           after.log            │
          │    B/op    │    B/op     vs base            │
_Query-16   656.0 ± 0%   656.0 ± 0%  ~ (p=1.000 n=10) ¹
¹ all samples are equal

          │ before.log │           after.log            │
          │ allocs/op  │ allocs/op   vs base            │
_Query-16   10.00 ± 0%   10.00 ± 0%  ~ (p=1.000 n=10) ¹
¹ all samples are equal

pkg: github.com/grafana/loki/v3/pkg/storage/chunk/client/util
                     │ before.log  │           after.log           │
                     │   sec/op    │   sec/op     vs base          │
GetParallelChunks-16   1.109m ± 2%   1.122m ± 2%  ~ (p=0.190 n=10)

                     │  before.log  │           after.log            │
                     │     B/op     │     B/op      vs base          │
GetParallelChunks-16   131.5Ki ± 3%   131.9Ki ± 2%  ~ (p=0.971 n=10)

                     │ before.log │          after.log           │
                     │ allocs/op  │ allocs/op   vs base          │
GetParallelChunks-16   163.0 ± 1%   162.0 ± 0%  ~ (p=0.057 n=10)

pkg: github.com/grafana/loki/v3/pkg/storage/chunk/fetcher
         │ before.log  │           after.log           │
         │   sec/op    │   sec/op     vs base          │
Fetch-16   364.0µ ± 4%   365.1µ ± 6%  ~ (p=0.971 n=10)

         │  before.log  │           after.log            │
         │     B/op     │     B/op      vs base          │
Fetch-16   285.1Ki ± 1%   286.2Ki ± 1%  ~ (p=0.579 n=10)

         │ before.log  │           after.log           │
         │  allocs/op  │  allocs/op   vs base          │
Fetch-16   4.212k ± 2%   4.222k ± 1%  ~ (p=0.971 n=10)

pkg: github.com/grafana/loki/v3/pkg/storage/config
               │ before.log  │           after.log           │
               │   sec/op    │   sec/op     vs base          │
ExternalKey-16   423.9n ± 1%   422.2n ± 1%  ~ (p=0.101 n=10)

               │ before.log │           after.log            │
               │    B/op    │    B/op     vs base            │
ExternalKey-16   112.0 ± 0%   112.0 ± 0%  ~ (p=1.000 n=10) ¹
¹ all samples are equal

               │ before.log │           after.log            │
               │ allocs/op  │ allocs/op   vs base            │
ExternalKey-16   6.000 ± 0%   6.000 ± 0%  ~ (p=1.000 n=10) ¹
¹ all samples are equal

pkg: github.com/grafana/loki/v3/pkg/storage/stores/series
                                  │ before.log  │              after.log              │
                                  │   sec/op    │   sec/op     vs base                │
ParseIndexEntries500-16             66.36µ ± 0%   68.81µ ± 0%   +3.69% (p=0.000 n=10)
ParseIndexEntries2500-16            382.7µ ± 0%   396.6µ ± 0%   +3.64% (p=0.000 n=10)
ParseIndexEntries10000-16           1.643m ± 0%   1.703m ± 0%   +3.67% (p=0.000 n=10)
ParseIndexEntries50000-16           9.069m ± 1%   9.383m ± 0%   +3.45% (p=0.000 n=10)
ParseIndexEntriesRegexSet500-16     35.65µ ± 0%   43.18µ ± 3%  +21.10% (p=0.000 n=10)
ParseIndexEntriesRegexSet2500-16    173.0µ ± 0%   212.3µ ± 0%  +22.66% (p=0.000 n=10)
ParseIndexEntriesRegexSet10000-16   694.8µ ± 0%   855.1µ ± 0%  +23.07% (p=0.000 n=10)
ParseIndexEntriesRegexSet50000-16   3.548m ± 2%   4.349m ± 1%  +22.57% (p=0.000 n=10)
IndexCaching-16                     38.58µ ± 2%   38.86µ ± 2%        ~ (p=0.280 n=10)
geomean                             392.7µ        436.7µ       +11.21%

                                  │  before.log  │               after.log               │
                                  │     B/op     │     B/op      vs base                 │
ParseIndexEntries500-16             16.04Ki ± 0%   16.04Ki ± 0%       ~ (p=0.211 n=10)
ParseIndexEntries2500-16            80.05Ki ± 0%   80.05Ki ± 0%       ~ (p=0.582 n=10)
ParseIndexEntries10000-16           320.1Ki ± 0%   320.1Ki ± 0%       ~ (p=0.243 n=10)
ParseIndexEntries50000-16           1.532Mi ± 0%   1.532Mi ± 0%  +0.00% (p=0.002 n=10)
ParseIndexEntriesRegexSet500-16     8.588Ki ± 0%   8.588Ki ± 0%       ~ (p=1.000 n=10) ¹
ParseIndexEntriesRegexSet2500-16    40.63Ki ± 0%   40.63Ki ± 0%       ~ (p=1.000 n=10)
ParseIndexEntriesRegexSet10000-16   160.7Ki ± 0%   160.7Ki ± 0%       ~ (p=0.296 n=10)
ParseIndexEntriesRegexSet50000-16   784.7Ki ± 0%   784.7Ki ± 0%       ~ (p=0.588 n=10)
IndexCaching-16                     19.66Ki ± 0%   19.66Ki ± 0%       ~ (p=0.582 n=10)
geomean                             93.71Ki        93.71Ki       +0.00%
¹ all samples are equal

                                  │ before.log │              after.log              │
                                  │ allocs/op  │ allocs/op   vs base                 │
ParseIndexEntries500-16             3.000 ± 0%   3.000 ± 0%       ~ (p=1.000 n=10) ¹
ParseIndexEntries2500-16            3.000 ± 0%   3.000 ± 0%       ~ (p=1.000 n=10) ¹
ParseIndexEntries10000-16           3.000 ± 0%   3.000 ± 0%       ~ (p=1.000 n=10) ¹
ParseIndexEntries50000-16           3.000 ± 0%   3.000 ± 0%       ~ (p=1.000 n=10) ¹
ParseIndexEntriesRegexSet500-16     21.00 ± 0%   21.00 ± 0%       ~ (p=1.000 n=10) ¹
ParseIndexEntriesRegexSet2500-16    21.00 ± 0%   21.00 ± 0%       ~ (p=1.000 n=10) ¹
ParseIndexEntriesRegexSet10000-16   21.00 ± 0%   21.00 ± 0%       ~ (p=1.000 n=10) ¹
ParseIndexEntriesRegexSet50000-16   21.00 ± 0%   21.00 ± 0%       ~ (p=1.000 n=10) ¹
IndexCaching-16                     278.0 ± 0%   278.0 ± 0%       ~ (p=1.000 n=10) ¹
geomean                             11.78        11.78       +0.00%
¹ all samples are equal

pkg: github.com/grafana/loki/v3/pkg/storage/stores/series/index
                      │ before.log  │              after.log              │
                      │   sec/op    │    sec/op     vs base               │
EncodeLabelsJson-16     992.1n ± 1%   1024.5n ± 1%  +3.27% (p=0.000 n=10)
EncodeLabelsString-16   3.479µ ± 0%    3.497µ ± 0%  +0.53% (p=0.000 n=10)
geomean                 1.858µ         1.893µ       +1.89%

                      │  before.log  │              after.log               │
                      │     B/op     │     B/op      vs base                │
EncodeLabelsJson-16       560.0 ± 0%     760.0 ± 0%  +35.71% (p=0.000 n=10)
EncodeLabelsString-16   1.039Ki ± 0%   1.039Ki ± 0%        ~ (p=0.211 n=10)
geomean                   771.9          899.2       +16.50%

                      │ before.log │              after.log              │
                      │ allocs/op  │ allocs/op   vs base                 │
EncodeLabelsJson-16     18.00 ± 0%   18.00 ± 0%       ~ (p=1.000 n=10) ¹
EncodeLabelsString-16   9.000 ± 0%   9.000 ± 0%       ~ (p=1.000 n=10) ¹
geomean                 12.73        12.73       +0.00%
¹ all samples are equal

pkg: github.com/grafana/loki/v3/pkg/storage/stores/shipper/bloomshipper
                                      │ before.log  │             after.log              │
                                      │   sec/op    │   sec/op     vs base               │
_BlocksCacheOld-16                      44.77µ ± 4%   45.27µ ± 1%  +1.11% (p=0.022 n=10)
_BlocksCacheNew-16                      73.82µ ± 7%   76.97µ ± 7%       ~ (p=0.393 n=10)
_Fetcher_processMetasCacheResponse-16   2.741µ ± 3%   2.748µ ± 7%       ~ (p=0.853 n=10)
geomean                                 20.85µ        21.24µ       +1.87%

                                      │  before.log  │              after.log              │
                                      │     B/op     │     B/op      vs base               │
_BlocksCacheOld-16                        33.00 ± 9%     33.00 ± 3%       ~ (p=0.447 n=10)
_BlocksCacheNew-16                      1.030Ki ± 0%   1.032Ki ± 0%       ~ (p=0.405 n=10)
_Fetcher_processMetasCacheResponse-16     871.5 ± 1%     872.0 ± 1%       ~ (p=0.444 n=10)
geomean                                   311.9          312.2       +0.08%

                                      │  before.log   │              after.log               │
                                      │   allocs/op   │  allocs/op   vs base                 │
_BlocksCacheOld-16                       0.000 ± 0%      0.000 ± 0%       ~ (p=1.000 n=10) ¹
_BlocksCacheNew-16                      1.000k ± 0%     1.000k ± 0%       ~ (p=1.000 n=10) ¹
_Fetcher_processMetasCacheResponse-16    15.00 ± 0%      15.00 ± 0%       ~ (p=1.000 n=10) ¹
geomean                                             ²                +0.00%                ²
¹ all samples are equal
² summaries must be >0 to compute geomean

pkg: github.com/grafana/loki/v3/pkg/storage/stores/shipper/indexshipper/tsdb
                          │ before.log  │              after.log              │
                          │   sec/op    │   sec/op     vs base                │
TenantHeads/10-16           141.3µ ± 2%   169.0µ ± 3%  +19.56% (p=0.000 n=10)
TenantHeads/100-16          1.207m ± 2%   1.523m ± 1%  +26.21% (p=0.000 n=10)
TenantHeads/1000-16         11.82m ± 2%   14.15m ± 1%  +19.74% (p=0.000 n=10)
IndexClient_Stats-16        22.96µ ± 1%   23.09µ ± 1%   +0.57% (p=0.009 n=10)
TSDBIndex_GetChunkRefs-16   2.929m ± 3%   3.008m ± 5%        ~ (p=0.315 n=10)
TSDBIndex_Volume-16         456.6µ ± 0%   549.9µ ± 0%  +20.44% (p=0.000 n=10)
geomean                     629.0µ        719.8µ       +14.45%

                          │  before.log  │               after.log                │
                          │     B/op     │     B/op       vs base                 │
TenantHeads/10-16           550.0Ki ± 0%    617.9Ki ± 0%   +12.34% (p=0.000 n=10)
TenantHeads/100-16          5.293Mi ± 0%    5.934Mi ± 0%   +12.11% (p=0.000 n=10)
TenantHeads/1000-16         55.92Mi ± 0%    63.08Mi ± 0%   +12.81% (p=0.000 n=10)
IndexClient_Stats-16        2.817Ki ± 3%    3.454Ki ± 4%   +22.60% (p=0.000 n=10)
TSDBIndex_GetChunkRefs-16   6.100Mi ± 0%    6.100Mi ± 0%         ~ (p=0.436 n=10)
TSDBIndex_Volume-16         51.70Ki ± 0%   114.17Ki ± 0%  +120.84% (p=0.000 n=10)
geomean                     733.1Ki         917.7Ki        +25.18%

                          │ before.log  │              after.log               │
                          │  allocs/op  │  allocs/op   vs base                 │
TenantHeads/10-16           2.145k ± 0%   3.146k ± 0%   +46.67% (p=0.000 n=10)
TenantHeads/100-16          21.44k ± 0%   31.45k ± 0%   +46.67% (p=0.000 n=10)
TenantHeads/1000-16         214.6k ± 0%   314.7k ± 0%   +46.64% (p=0.000 n=10)
IndexClient_Stats-16         57.00 ± 0%    59.00 ± 0%    +3.51% (p=0.000 n=10)
TSDBIndex_GetChunkRefs-16    43.00 ± 2%    44.00 ± 0%    +2.33% (p=0.001 n=10)
TSDBIndex_Volume-16         1.067k ± 0%   3.066k ± 0%  +187.35% (p=0.000 n=10)
geomean                     1.719k        2.506k        +45.79%

pkg: github.com/grafana/loki/v3/pkg/storage/stores/shipper/indexshipper/tsdb/index
                                      │  before.log   │               after.log                │
                                      │    sec/op     │     sec/op      vs base                │
ChunkStats/version_2/2_chunks-16        160.5n ±   0%   160.5n ±    0%       ~ (p=0.490 n=10)
ChunkStats/version_3/2_chunks-16        60.84n ±   6%   59.64n ±    2%       ~ (p=0.424 n=10)
ChunkStats/version_2/4_chunks-16        185.0n ±   1%   192.7n ±    0%  +4.16% (p=0.000 n=10)
ChunkStats/version_3/4_chunks-16        77.53n ±   8%   79.08n ±    5%       ~ (p=0.912 n=10)
ChunkStats/version_2/10_chunks-16       281.9n ±   0%   290.9n ±    0%  +3.17% (p=0.000 n=10)
ChunkStats/version_3/10_chunks-16       178.7n ±   6%   171.1n ±    5%       ~ (p=0.190 n=10)
ChunkStats/version_2/100_chunks-16      1.494µ ±   0%   1.536µ ±    4%  +2.81% (p=0.034 n=10)
ChunkStats/version_3/100_chunks-16      926.8n ±   0%   958.6n ±    1%  +3.44% (p=0.000 n=10)
ChunkStats/version_2/1000_chunks-16     13.21µ ±   2%   13.65µ ±    7%       ~ (p=0.353 n=10)
ChunkStats/version_3/1000_chunks-16     1.571µ ±   0%   1.584µ ±    1%  +0.86% (p=0.001 n=10)
ChunkStats/version_2/10000_chunks-16    159.0µ ±   1%   160.1µ ±    1%       ~ (p=0.165 n=10)
ChunkStats/version_3/10000_chunks-16    8.508µ ±   0%   8.513µ ±    1%       ~ (p=0.288 n=10)
ChunkStats/version_2/100000_chunks-16   1.728m ±   3%   1.778m ±    1%  +2.88% (p=0.003 n=10)
ChunkStats/version_3/100000_chunks-16   112.2µ ±   2%   114.5µ ±    5%       ~ (p=0.247 n=10)
ReadChunks/version_2/2_chunks-16        165.2n ±  48%   160.4n ±   47%       ~ (p=1.000 n=10)
ReadChunks/version_3/2_chunks-16        57.57n ± 397%   64.45n ±  613%       ~ (p=0.143 n=10)
ReadChunks/version_2/4_chunks-16        146.2n ± 244%   139.7n ±  182%       ~ (p=0.684 n=10)
ReadChunks/version_3/4_chunks-16        82.53n ± 832%   77.33n ± 1391%       ~ (p=0.445 n=7+6)
geomean                                 1.106µ          1.116µ          +0.89%

                                      │   before.log   │               after.log                │
                                      │      B/op      │     B/op      vs base                  │
ChunkStats/version_2/2_chunks-16          24.00 ± 0%       24.00 ± 0%       ~ (p=1.000 n=10)  ¹
ChunkStats/version_3/2_chunks-16          0.000 ± 0%       0.000 ± 0%       ~ (p=1.000 n=10)  ¹
ChunkStats/version_2/4_chunks-16          24.00 ± 0%       24.00 ± 0%       ~ (p=1.000 n=10)  ¹
ChunkStats/version_3/4_chunks-16          0.000 ± 0%       0.000 ± 0%       ~ (p=1.000 n=10)  ¹
ChunkStats/version_2/10_chunks-16         24.00 ± 0%       24.00 ± 0%       ~ (p=1.000 n=10)  ¹
ChunkStats/version_3/10_chunks-16         0.000 ± 0%       0.000 ± 0%       ~ (p=1.000 n=10)  ¹
ChunkStats/version_2/100_chunks-16        24.00 ± 0%       24.00 ± 0%       ~ (p=1.000 n=10)  ¹
ChunkStats/version_3/100_chunks-16        48.00 ± 0%       48.00 ± 0%       ~ (p=1.000 n=10)  ¹
ChunkStats/version_2/1000_chunks-16       24.00 ± 0%       24.00 ± 0%       ~ (p=1.000 n=10)
ChunkStats/version_3/1000_chunks-16       48.00 ± 0%       48.00 ± 0%       ~ (p=1.000 n=10)  ¹
ChunkStats/version_2/10000_chunks-16    120.2Ki ± 0%     120.2Ki ± 0%       ~ (p=0.712 n=10)
ChunkStats/version_3/10000_chunks-16      53.00 ± 2%       53.00 ± 0%       ~ (p=0.303 n=10)
ChunkStats/version_2/100000_chunks-16   3.065Mi ± 0%     3.066Mi ± 0%  +0.02% (p=0.001 n=10)
ChunkStats/version_3/100000_chunks-16   296.8Ki ± 0%     296.8Ki ± 0%       ~ (p=0.985 n=10)
ReadChunks/version_2/2_chunks-16          191.0 ±  ?       189.5 ±  ?       ~ (p=0.783 n=10)
ReadChunks/version_3/2_chunks-16          0.000 ±  ?       0.000 ±  ?       ~ (p=0.811 n=10)
ReadChunks/version_2/4_chunks-16          380.5 ±  ?       404.0 ±  ?       ~ (p=0.970 n=10)
ReadChunks/version_3/4_chunks-16          0.000 ±  ?       0.000 ±  ?       ~ (p=1.000 n=7+6)
geomean                                              ²                 +0.29%                 ²
¹ all samples are equal
² summaries must be >0 to compute geomean

                                      │  before.log  │              after.log               │
                                      │  allocs/op   │ allocs/op   vs base                  │
ChunkStats/version_2/2_chunks-16        1.000 ± 0%     1.000 ± 0%       ~ (p=1.000 n=10)  ¹
ChunkStats/version_3/2_chunks-16        0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=10)  ¹
ChunkStats/version_2/4_chunks-16        1.000 ± 0%     1.000 ± 0%       ~ (p=1.000 n=10)  ¹
ChunkStats/version_3/4_chunks-16        0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=10)  ¹
ChunkStats/version_2/10_chunks-16       1.000 ± 0%     1.000 ± 0%       ~ (p=1.000 n=10)  ¹
ChunkStats/version_3/10_chunks-16       0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=10)  ¹
ChunkStats/version_2/100_chunks-16      1.000 ± 0%     1.000 ± 0%       ~ (p=1.000 n=10)  ¹
ChunkStats/version_3/100_chunks-16      2.000 ± 0%     2.000 ± 0%       ~ (p=1.000 n=10)  ¹
ChunkStats/version_2/1000_chunks-16     1.000 ± 0%     1.000 ± 0%       ~ (p=1.000 n=10)  ¹
ChunkStats/version_3/1000_chunks-16     2.000 ± 0%     2.000 ± 0%       ~ (p=1.000 n=10)  ¹
ChunkStats/version_2/10000_chunks-16    3.000 ± 0%     3.000 ± 0%       ~ (p=1.000 n=10)  ¹
ChunkStats/version_3/10000_chunks-16    2.000 ± 0%     2.000 ± 0%       ~ (p=1.000 n=10)  ¹
ChunkStats/version_2/100000_chunks-16   13.00 ± 0%     13.00 ± 0%       ~ (p=1.000 n=10)  ¹
ChunkStats/version_3/100000_chunks-16   3.000 ± 0%     3.000 ± 0%       ~ (p=1.000 n=10)  ¹
ReadChunks/version_2/2_chunks-16        0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=10)  ¹
ReadChunks/version_3/2_chunks-16        0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=10)  ¹
ReadChunks/version_2/4_chunks-16        0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=10)  ¹
ReadChunks/version_3/4_chunks-16        0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=7+6) ¹
geomean                                            ²               +0.00%                 ²
¹ all samples are equal
² summaries must be >0 to compute geomean

pkg: github.com/grafana/loki/v3/pkg/storage/stores/shipper/indexshipper/util
                       │ before.log  │             after.log              │
                       │   sec/op    │   sec/op     vs base               │
_DedupeCallback-16       107.0n ± 1%   107.1n ± 0%       ~ (p=0.338 n=10)
_MultiQueries/50-16      42.44µ ± 0%   43.90µ ± 1%  +3.45% (p=0.000 n=10)
_MultiQueries/100-16     85.10µ ± 0%   87.61µ ± 1%  +2.95% (p=0.000 n=10)
_MultiQueries/1000-16    1.414m ± 3%   1.401m ± 3%       ~ (p=0.971 n=10)
_MultiQueries/10000-16   14.20m ± 8%   15.18m ± 4%  +6.88% (p=0.002 n=10)
_MultiQueries/50000-16   77.12m ± 4%   77.89m ± 4%       ~ (p=0.912 n=10)
geomean                  290.3µ        296.7µ       +2.20%

                       │  before.log  │               after.log               │
                       │     B/op     │     B/op      vs base                 │
_DedupeCallback-16         32.00 ± 0%     32.00 ± 0%       ~ (p=1.000 n=10) ¹
_MultiQueries/50-16      30.06Ki ± 0%   30.06Ki ± 0%       ~ (p=1.000 n=10) ¹
_MultiQueries/100-16     59.81Ki ± 0%   59.81Ki ± 0%       ~ (p=1.000 n=10) ¹
_MultiQueries/1000-16    804.5Ki ± 0%   804.5Ki ± 0%       ~ (p=0.404 n=10)
_MultiQueries/10000-16   7.742Mi ± 0%   7.742Mi ± 0%       ~ (p=0.616 n=10)
_MultiQueries/50000-16   38.29Mi ± 0%   38.29Mi ± 0%  +0.00% (p=0.041 n=10)
geomean                  155.3Ki        155.3Ki       -0.00%
¹ all samples are equal

                       │ before.log  │              after.log               │
                       │  allocs/op  │  allocs/op   vs base                 │
_DedupeCallback-16        1.000 ± 0%    1.000 ± 0%       ~ (p=1.000 n=10) ¹
_MultiQueries/50-16       507.0 ± 0%    507.0 ± 0%       ~ (p=1.000 n=10) ¹
_MultiQueries/100-16     1.007k ± 0%   1.007k ± 0%       ~ (p=1.000 n=10) ¹
_MultiQueries/1000-16    14.04k ± 0%   14.04k ± 0%       ~ (p=1.000 n=10) ¹
_MultiQueries/10000-16   140.1k ± 0%   140.1k ± 0%       ~ (p=0.087 n=10)
_MultiQueries/50000-16   700.2k ± 0%   700.2k ± 0%       ~ (p=0.094 n=10)
geomean                  2.982k        2.982k       +0.00%
¹ all samples are equal

I've noted the once which show a slow down in the description.

jeschkies avatar Jun 16 '25 09:06 jeschkies

Covered in https://github.com/grafana/loki/pull/18490

jeschkies avatar Jul 21 '25 13:07 jeschkies