lib/storage: optimize BenchmarkIndexDBGetTSIDs()

- Sort MetricName tags only once before the benchmark loop.
- Obtain indexSearch per each benchmark loop in order to give a chance for background merge
  for the recently created parts
This commit is contained in:
Aliaksandr Valialkin 2023-07-13 21:30:20 -07:00
parent fbddb4ad32
commit 203a436066
No known key found for this signature in database
GPG key ID: A72BEC6CD3D0DED1

View file

@ -144,14 +144,15 @@ func BenchmarkHeadPostingForMatchers(b *testing.B) {
b.ResetTimer()
benchSearch := func(b *testing.B, tfs *TagFilters, expectedMetricIDs int) {
is := db.getIndexSearch(tfs.accountID, tfs.projectID, noDeadline)
tfss := []*TagFilters{tfs}
tr := TimeRange{
MinTimestamp: 0,
MaxTimestamp: timestampFromTime(time.Now()),
}
for i := 0; i < b.N; i++ {
is := db.getIndexSearch(tfs.accountID, tfs.projectID, noDeadline)
metricIDs, err := is.searchMetricIDs(nil, tfss, tr, 2e9)
db.putIndexSearch(is)
if err != nil {
b.Fatalf("unexpected error in searchMetricIDs: %s", err)
}
@ -159,7 +160,6 @@ func BenchmarkHeadPostingForMatchers(b *testing.B) {
b.Fatalf("unexpected metricIDs found; got %d; want %d", len(metricIDs), expectedMetricIDs)
}
}
db.putIndexSearch(is)
}
addTagFilter := func(tfs *TagFilters, key, value string, isNegative, isRegexp bool) {
if err := tfs.Add([]byte(key), []byte(value), isNegative, isRegexp); err != nil {
@ -291,9 +291,11 @@ func BenchmarkIndexDBGetTSIDs(b *testing.B) {
value := fmt.Sprintf("value_%d", i)
mn.AddTag(key, value)
}
mn.sortTags()
var genTSID generationTSID
var metricNameRaw []byte
date := uint64(0)
date := uint64(12345)
is := db.getIndexSearch(0, 0, noDeadline)
defer db.putIndexSearch(is)
@ -301,7 +303,6 @@ func BenchmarkIndexDBGetTSIDs(b *testing.B) {
for i := 0; i < recordsCount; i++ {
mn.AccountID = uint32(i % accountsCount)
mn.ProjectID = uint32(i % projectsCount)
mn.sortTags()
metricNameRaw = mn.marshalRaw(metricNameRaw[:0])
generateTSID(&genTSID.TSID, &mn)
genTSID.generation = db.generation
@ -315,20 +316,21 @@ func BenchmarkIndexDBGetTSIDs(b *testing.B) {
b.RunParallel(func(pb *testing.PB) {
var genTSIDLocal generationTSID
var metricNameLocal []byte
mnLocal := mn
is := db.getIndexSearch(0, 0, noDeadline)
var mnLocal MetricName
mnLocal.CopyFrom(&mn)
mnLocal.sortTags()
for pb.Next() {
is := db.getIndexSearch(0, 0, noDeadline)
for i := 0; i < recordsPerLoop; i++ {
mnLocal.AccountID = uint32(i % accountsCount)
mnLocal.ProjectID = uint32(i % projectsCount)
mnLocal.sortTags()
metricNameLocal = mnLocal.Marshal(metricNameLocal[:0])
if !is.getTSIDByMetricName(&genTSIDLocal, metricNameLocal, date) {
panic(fmt.Errorf("cannot obtain tsid for row %d", i))
}
}
db.putIndexSearch(is)
}
db.putIndexSearch(is)
})
b.StopTimer()