From 45377b1526995acc02f649561d2544ea78e1bb30 Mon Sep 17 00:00:00 2001 From: Jin Date: Fri, 13 Oct 2023 09:36:04 +0800 Subject: [PATCH] benchmark io for leveldb and pebble --- ethdb/dbtest/testsuite.go | 85 +++++++++++++++++++++++++++++++++++ ethdb/leveldb/leveldb_test.go | 26 +++++++++++ ethdb/pebble/pebble_test.go | 21 +++++++++ 3 files changed, 132 insertions(+) diff --git a/ethdb/dbtest/testsuite.go b/ethdb/dbtest/testsuite.go index 0d3d5f5aa6..3bfad011c6 100644 --- a/ethdb/dbtest/testsuite.go +++ b/ethdb/dbtest/testsuite.go @@ -531,3 +531,88 @@ func makeDataset(size, ksize, vsize int, order bool) ([][]byte, [][]byte) { } return keys, vals } + +func BenchDatabaseSuite2(b *testing.B, New func() ethdb.KeyValueStore) { + var ( + keys, vals = makeDataset(1000, 32, 32, false) + sKeys, sVals = makeDataset(1000, 32, 32, true) + ) + // Run benchmarks sequentially + b.Run("Write", func(b *testing.B) { + benchWrite := func(b *testing.B, keys, vals [][]byte) { + db := New() + defer db.Close() + b.ResetTimer() + for i := 0; i < len(keys); i++ { + db.Put(keys[i], vals[i]) + } + } + b.Run("WriteSorted", func(b *testing.B) { + benchWrite(b, sKeys, sVals) + }) + b.Run("WriteRandom", func(b *testing.B) { + benchWrite(b, keys, vals) + }) + }) + b.Run("Read", func(b *testing.B) { + benchRead := func(b *testing.B, keys, vals [][]byte) { + db := New() + defer db.Close() + + for i := 0; i < len(keys); i++ { + db.Put(keys[i], vals[i]) + } + b.ResetTimer() + + for i := 0; i < len(keys); i++ { + db.Get(keys[i]) + } + } + b.Run("ReadSorted", func(b *testing.B) { + benchRead(b, sKeys, sVals) + }) + b.Run("ReadRandom", func(b *testing.B) { + benchRead(b, keys, vals) + }) + }) + b.Run("Iteration", func(b *testing.B) { + benchIteration := func(b *testing.B, keys, vals [][]byte) { + db := New() + defer db.Close() + + for i := 0; i < len(keys); i++ { + db.Put(keys[i], vals[i]) + } + b.ResetTimer() + + it := db.NewIterator(nil, nil) + for it.Next() { + } + it.Release() + } + b.Run("IterationSorted", func(b *testing.B) { + benchIteration(b, sKeys, sVals) + }) + b.Run("IterationRandom", func(b *testing.B) { + benchIteration(b, keys, vals) + }) + }) + b.Run("BatchWrite", func(b *testing.B) { + benchBatchWrite := func(b *testing.B, keys, vals [][]byte) { + db := New() + defer db.Close() + b.ResetTimer() + batch := db.NewBatch() + for i := 0; i < len(keys); i++ { + batch.Put(keys[i], vals[i]) + } + batch.Write() + } + b.Run("BenchWriteSorted", func(b *testing.B) { + benchBatchWrite(b, sKeys, sVals) + }) + b.Run("BenchWriteRandom", func(b *testing.B) { + benchBatchWrite(b, keys, vals) + }) + }) +} diff --git a/ethdb/leveldb/leveldb_test.go b/ethdb/leveldb/leveldb_test.go index d8c6386016..c1b8e2bf96 100644 --- a/ethdb/leveldb/leveldb_test.go +++ b/ethdb/leveldb/leveldb_test.go @@ -17,6 +17,7 @@ package leveldb import ( + "os" "testing" "github.com/ethereum/go-ethereum/ethdb" @@ -50,3 +51,28 @@ func BenchmarkLevelDB(b *testing.B) { } }) } + +func BenchmarkIOLevelDB(b *testing.B) { + dir, err := os.MkdirTemp("", "leveldb_*") + if err != nil { + b.Fatal(err) + } + var stor storage.Storage + stor, err = storage.OpenFile(dir, false) + if err != nil { + b.Fatal(err) + } + dbtest.BenchDatabaseSuite2(b, func() ethdb.KeyValueStore { + db, err := leveldb.Open(stor, nil) + if err != nil { + b.Fatal(err) + } + return &Database{ + db: db, + } + }) + err = os.RemoveAll(dir) + if err != nil { + b.Fatal(err) + } +} diff --git a/ethdb/pebble/pebble_test.go b/ethdb/pebble/pebble_test.go index 590d5bf035..17c3649acb 100644 --- a/ethdb/pebble/pebble_test.go +++ b/ethdb/pebble/pebble_test.go @@ -19,6 +19,7 @@ package pebble import ( + "os" "testing" "github.com/cockroachdb/pebble" @@ -56,3 +57,23 @@ func BenchmarkPebbleDB(b *testing.B) { } }) } + +func BenchmarkIOPebbleDB(b *testing.B) { + dir, err := os.MkdirTemp("", "pebble_*") + if err != nil { + b.Fatal(err) + } + dbtest.BenchDatabaseSuite2(b, func() ethdb.KeyValueStore { + db, err := pebble.Open(dir, &pebble.Options{}) + if err != nil { + b.Fatal(err) + } + return &Database{ + db: db, + } + }) + err = os.RemoveAll(dir) + if err != nil { + b.Fatal(err) + } +}