forked from TrueCloudLab/frostfs-node
[#586] Fix writecache benchmarks and refactor hacky NeedsCompression
Signed-off-by: Alejandro Lopez <a.lopez@yadro.com>
This commit is contained in:
parent
023b90342c
commit
8f994163ee
17 changed files with 161 additions and 92 deletions
|
@ -3,50 +3,120 @@ package benchmark
|
|||
import (
|
||||
"context"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"git.frostfs.info/TrueCloudLab/frostfs-node/pkg/local_object_storage/blobstor/common"
|
||||
"git.frostfs.info/TrueCloudLab/frostfs-node/pkg/local_object_storage/blobstor/teststore"
|
||||
"git.frostfs.info/TrueCloudLab/frostfs-node/pkg/local_object_storage/internal/testutil"
|
||||
meta "git.frostfs.info/TrueCloudLab/frostfs-node/pkg/local_object_storage/metabase"
|
||||
"git.frostfs.info/TrueCloudLab/frostfs-node/pkg/local_object_storage/writecache"
|
||||
"git.frostfs.info/TrueCloudLab/frostfs-node/pkg/local_object_storage/writecache/writecachebadger"
|
||||
"git.frostfs.info/TrueCloudLab/frostfs-node/pkg/local_object_storage/writecache/writecachebbolt"
|
||||
oidtest "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/object/id/test"
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
func BenchmarkWritecache(b *testing.B) {
|
||||
b.Run("bbolt", func(b *testing.B) {
|
||||
cache := writecachebbolt.New(
|
||||
writecachebbolt.WithPath(b.TempDir()),
|
||||
)
|
||||
benchmarkPut(b, cache)
|
||||
func BenchmarkWritecacheSeq(b *testing.B) {
|
||||
const payloadSize = 8 << 10
|
||||
b.Run("bbolt_seq", func(b *testing.B) {
|
||||
benchmarkPutSeq(b, newBBoltCache(b), payloadSize)
|
||||
})
|
||||
b.Run("badger", func(b *testing.B) {
|
||||
cache := writecachebadger.New(
|
||||
writecachebadger.WithPath(b.TempDir()),
|
||||
)
|
||||
benchmarkPut(b, cache)
|
||||
b.Run("badger_seq", func(b *testing.B) {
|
||||
benchmarkPutSeq(b, newBadgerCache(b), payloadSize)
|
||||
})
|
||||
}
|
||||
|
||||
func benchmarkPut(b *testing.B, cache writecache.Cache) {
|
||||
if err := cache.Open(false); err != nil {
|
||||
b.Fatalf("initializing: %v", err)
|
||||
}
|
||||
if err := cache.Init(); err != nil {
|
||||
b.Fatalf("opening: %v", err)
|
||||
}
|
||||
defer cache.Close()
|
||||
func BenchmarkWritecachePar(b *testing.B) {
|
||||
const payloadSize = 8 << 10
|
||||
b.Run("bbolt_par", func(b *testing.B) {
|
||||
benchmarkPutPar(b, newBBoltCache(b), payloadSize)
|
||||
})
|
||||
b.Run("badger_par", func(b *testing.B) {
|
||||
benchmarkPutPar(b, newBadgerCache(b), payloadSize)
|
||||
})
|
||||
}
|
||||
|
||||
func benchmarkPutSeq(b *testing.B, cache writecache.Cache, size uint64) {
|
||||
benchmarkPutPrepare(b, cache)
|
||||
|
||||
ctx := context.Background()
|
||||
objGen := testutil.RandObjGenerator{ObjSize: 8 << 10}
|
||||
objGen := testutil.RandObjGenerator{ObjSize: size}
|
||||
|
||||
b.ResetTimer()
|
||||
for n := 0; n < b.N; n++ {
|
||||
obj := objGen.Next()
|
||||
rawData, err := obj.Marshal()
|
||||
require.NoError(b, err, "marshaling object")
|
||||
prm := common.PutPrm{
|
||||
Address: oidtest.Address(),
|
||||
Object: objGen.Next(),
|
||||
Address: testutil.AddressFromObject(b, obj),
|
||||
Object: obj,
|
||||
RawData: rawData,
|
||||
}
|
||||
if _, err := cache.Put(ctx, prm); err != nil {
|
||||
b.Fatalf("putting: %v", err)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func benchmarkPutPar(b *testing.B, cache writecache.Cache, size uint64) {
|
||||
benchmarkPutPrepare(b, cache)
|
||||
|
||||
ctx := context.Background()
|
||||
|
||||
b.ResetTimer()
|
||||
b.RunParallel(func(pb *testing.PB) {
|
||||
objGen := testutil.RandObjGenerator{ObjSize: size}
|
||||
for pb.Next() {
|
||||
obj := objGen.Next()
|
||||
rawData, err := obj.Marshal()
|
||||
require.NoError(b, err, "marshaling object")
|
||||
prm := common.PutPrm{
|
||||
Address: testutil.AddressFromObject(b, obj),
|
||||
Object: obj,
|
||||
RawData: rawData,
|
||||
}
|
||||
if _, err := cache.Put(ctx, prm); err != nil {
|
||||
b.Fatalf("putting: %v", err)
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
func benchmarkPutPrepare(b *testing.B, cache writecache.Cache) {
|
||||
require.NoError(b, cache.Open(false), "opening")
|
||||
require.NoError(b, cache.Init(), "initializing")
|
||||
b.Cleanup(func() {
|
||||
require.NoError(b, cache.Close(), "closing")
|
||||
})
|
||||
}
|
||||
|
||||
type testMetabase struct{}
|
||||
|
||||
func (testMetabase) UpdateStorageID(meta.UpdateStorageIDPrm) (meta.UpdateStorageIDRes, error) {
|
||||
return meta.UpdateStorageIDRes{}, nil
|
||||
}
|
||||
|
||||
func newBBoltCache(b *testing.B) writecache.Cache {
|
||||
bs := teststore.New(
|
||||
teststore.WithPut(func(pp common.PutPrm) (common.PutRes, error) { return common.PutRes{}, nil }),
|
||||
)
|
||||
return writecachebbolt.New(
|
||||
writecachebbolt.WithPath(b.TempDir()),
|
||||
writecachebbolt.WithBlobstor(bs),
|
||||
writecachebbolt.WithMetabase(testMetabase{}),
|
||||
writecachebbolt.WithMaxCacheSize(256<<30),
|
||||
writecachebbolt.WithSmallObjectSize(128<<10),
|
||||
)
|
||||
}
|
||||
|
||||
func newBadgerCache(b *testing.B) writecache.Cache {
|
||||
bs := teststore.New(
|
||||
teststore.WithPut(func(pp common.PutPrm) (common.PutRes, error) { return common.PutRes{}, nil }),
|
||||
)
|
||||
return writecachebadger.New(
|
||||
writecachebadger.WithPath(b.TempDir()),
|
||||
writecachebadger.WithBlobstor(bs),
|
||||
writecachebadger.WithMetabase(testMetabase{}),
|
||||
writecachebadger.WithMaxCacheSize(256<<30),
|
||||
writecachebadger.WithGCInterval(10*time.Second),
|
||||
)
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue