mirror of
https://github.com/prometheus/prometheus
synced 2026-05-01 07:30:30 +08:00
Extended SelectQuerier benchmarks to reproduce regression.
Signed-off-by: Bartlomiej Plotka <bwplotka@gmail.com>
This commit is contained in:
@@ -17,7 +17,9 @@ import (
|
||||
"context"
|
||||
"fmt"
|
||||
"io/ioutil"
|
||||
"math/rand"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"strconv"
|
||||
"testing"
|
||||
|
||||
@@ -140,61 +142,91 @@ func benchmarkPostingsForMatchers(b *testing.B, ir IndexReader) {
|
||||
}
|
||||
|
||||
func BenchmarkQuerierSelect(b *testing.B) {
|
||||
chunkDir, err := ioutil.TempDir("", "chunk_dir")
|
||||
tmpDir, err := ioutil.TempDir("", "test_querier_select_dir")
|
||||
testutil.Ok(b, err)
|
||||
defer func() {
|
||||
testutil.Ok(b, os.RemoveAll(chunkDir))
|
||||
}()
|
||||
h, err := NewHead(nil, nil, nil, 1000, chunkDir, nil, DefaultStripeSize, nil)
|
||||
testutil.Ok(b, err)
|
||||
defer h.Close()
|
||||
app := h.Appender(context.Background())
|
||||
numSeries := 1000000
|
||||
for i := 0; i < numSeries; i++ {
|
||||
app.Add(labels.FromStrings("foo", "bar", "i", fmt.Sprintf("%d%s", i, postingsBenchSuffix)), int64(i), 0)
|
||||
}
|
||||
testutil.Ok(b, app.Commit())
|
||||
b.Cleanup(func() { testutil.Ok(b, os.RemoveAll(tmpDir)) })
|
||||
|
||||
bench := func(b *testing.B, br BlockReader, sorted bool) {
|
||||
matcher := labels.MustNewMatcher(labels.MatchEqual, "foo", "bar")
|
||||
for s := 1; s <= numSeries; s *= 10 {
|
||||
b.Run(fmt.Sprintf("%dof%d", s, numSeries), func(b *testing.B) {
|
||||
q, err := NewBlockQuerier(br, 0, int64(s-1))
|
||||
for i, tcase := range []struct {
|
||||
series int
|
||||
samplesPerSeries int
|
||||
}{
|
||||
//{
|
||||
// series: 1,
|
||||
// samplesPerSeries: 1e8,
|
||||
//},
|
||||
{
|
||||
series: 1e3,
|
||||
samplesPerSeries: 1e5,
|
||||
},
|
||||
//{
|
||||
// series: 1e6,
|
||||
// samplesPerSeries: 1,
|
||||
//},
|
||||
} {
|
||||
b.Run(fmt.Sprintf("series=%v_with_samples=%v", tcase.series, tcase.samplesPerSeries), func(b *testing.B) {
|
||||
h, err := NewHead(
|
||||
nil, nil, nil,
|
||||
DefaultBlockDuration,
|
||||
filepath.Join(tmpDir, fmt.Sprintf("%v", i)),
|
||||
nil,
|
||||
DefaultStripeSize,
|
||||
nil,
|
||||
)
|
||||
testutil.Ok(b, err)
|
||||
b.Cleanup(func() { h.Close() })
|
||||
|
||||
app := h.Appender(context.Background())
|
||||
r := rand.New(rand.NewSource(123))
|
||||
for i := 0; i < tcase.series; i++ {
|
||||
ref, err := app.Add(labels.FromStrings("foo", "bar", "i", fmt.Sprintf("%d%s", i, postingsBenchSuffix)), int64(i*tcase.samplesPerSeries), r.Float64())
|
||||
testutil.Ok(b, err)
|
||||
|
||||
b.ResetTimer()
|
||||
for i := 0; i < b.N; i++ {
|
||||
ss := q.Select(sorted, nil, matcher)
|
||||
for ss.Next() {
|
||||
}
|
||||
testutil.Ok(b, ss.Err())
|
||||
for j := 1; j < tcase.samplesPerSeries; j++ {
|
||||
testutil.Ok(b, app.AddFast(ref, int64(i*tcase.samplesPerSeries+j), r.Float64()))
|
||||
}
|
||||
q.Close()
|
||||
}
|
||||
testutil.Ok(b, app.Commit())
|
||||
|
||||
bench := func(b *testing.B, br BlockReader, sorted bool) {
|
||||
matcher := labels.MustNewMatcher(labels.MatchEqual, "foo", "bar")
|
||||
|
||||
cases := []int{1, tcase.series / 2, tcase.series}
|
||||
if tcase.series == 1 {
|
||||
cases = []int{1}
|
||||
}
|
||||
for _, s := range cases {
|
||||
b.Run(fmt.Sprintf("%dof%d", s, tcase.series), func(b *testing.B) {
|
||||
q, err := NewBlockQuerier(br, 0, int64(s*tcase.samplesPerSeries-1))
|
||||
testutil.Ok(b, err)
|
||||
|
||||
b.ResetTimer()
|
||||
for i := 0; i < b.N; i++ {
|
||||
counter := 0
|
||||
ss := q.Select(sorted, nil, matcher)
|
||||
for ss.Next() {
|
||||
counter++
|
||||
}
|
||||
testutil.Ok(b, ss.Err())
|
||||
testutil.Equals(b, 0, len(ss.Warnings()))
|
||||
testutil.Equals(b, s, counter)
|
||||
}
|
||||
q.Close()
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
//b.Run("Head", func(b *testing.B) {
|
||||
// bench(b, h, false)
|
||||
//})
|
||||
//b.Run("SortedHead", func(b *testing.B) {
|
||||
// bench(b, h, true)
|
||||
//})
|
||||
|
||||
block, err := OpenBlock(nil, createBlockFromHead(b, filepath.Join(tmpDir, fmt.Sprintf("block%v", i)), h), nil)
|
||||
testutil.Ok(b, err)
|
||||
b.Cleanup(func() { testutil.Ok(b, block.Close()) })
|
||||
b.Run("Block", func(b *testing.B) {
|
||||
bench(b, block, false)
|
||||
})
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
b.Run("Head", func(b *testing.B) {
|
||||
bench(b, h, false)
|
||||
})
|
||||
b.Run("SortedHead", func(b *testing.B) {
|
||||
bench(b, h, true)
|
||||
})
|
||||
|
||||
tmpdir, err := ioutil.TempDir("", "test_benchquerierselect")
|
||||
testutil.Ok(b, err)
|
||||
defer func() {
|
||||
testutil.Ok(b, os.RemoveAll(tmpdir))
|
||||
}()
|
||||
|
||||
blockdir := createBlockFromHead(b, tmpdir, h)
|
||||
block, err := OpenBlock(nil, blockdir, nil)
|
||||
testutil.Ok(b, err)
|
||||
defer func() {
|
||||
testutil.Ok(b, block.Close())
|
||||
}()
|
||||
|
||||
b.Run("Block", func(b *testing.B) {
|
||||
bench(b, block, false)
|
||||
})
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user