Benchmark different mmap sizes and journal modes

This commit is contained in:
Matt Joiner 2021-05-06 12:00:20 +10:00
parent 20c00dedc0
commit abe003b6b3
3 changed files with 42 additions and 15 deletions

View File

@ -13,6 +13,7 @@ import (
type NewDirectStorageOpts struct {
NewConnOpts
InitDbOpts
InitConnOpts
}
// A convenience function that creates a connection pool, resource provider, and a pieces storage
@ -22,16 +23,9 @@ func NewDirectStorage(opts NewDirectStorageOpts) (_ storage.ClientImplCloser, er
if err != nil {
return
}
journalMode := "delete"
if opts.Memory {
journalMode = "off"
}
err = initConn(conn, InitConnOpts{
SetJournalMode: journalMode,
MmapSizeOk: true,
MmapSize: 1 << 25,
})
err = initConn(conn, opts.InitConnOpts)
if err != nil {
conn.Close()
return
}
err = initDatabase(conn, opts.InitDbOpts)

View File

@ -38,6 +38,8 @@ func (me InitConnOpts) JournalMode() string {
return "wal"
}
var UnexpectedJournalMode = errors.New("unexpected journal mode")
func initConn(conn conn, opts InitConnOpts) error {
// Recursive triggers are required because we need to trim the blob_meta size after trimming to
// capacity. Hopefully we don't hit the recursion limit, and if we do, there's an error thrown.
@ -53,7 +55,7 @@ func initConn(conn conn, opts InitConnOpts) error {
err = sqlitex.ExecTransient(conn, fmt.Sprintf(`pragma journal_mode=%s`, opts.SetJournalMode), func(stmt *sqlite.Stmt) error {
ret := stmt.ColumnText(0)
if ret != opts.SetJournalMode {
panic(ret)
return UnexpectedJournalMode
}
return nil
})
@ -62,7 +64,10 @@ func initConn(conn conn, opts InitConnOpts) error {
}
}
if !opts.MmapSizeOk {
opts.MmapSize = 1 << 24 // 8 MiB
// Set the default. Currently it seems the library picks reasonable defaults, especially for
// wal.
opts.MmapSize = -1
//opts.MmapSize = 1 << 24 // 8 MiB
}
if opts.MmapSize >= 0 {
err = sqlitex.ExecTransient(conn, fmt.Sprintf(`pragma mmap_size=%d`, opts.MmapSize), nil)

View File

@ -2,6 +2,7 @@ package sqliteStorage
import (
"bytes"
"errors"
"fmt"
"io"
"io/ioutil"
@ -12,6 +13,7 @@ import (
_ "github.com/anacrolix/envpprof"
"github.com/anacrolix/torrent/storage"
test_storage "github.com/anacrolix/torrent/storage/test"
"github.com/dustin/go-humanize"
qt "github.com/frankban/quicktest"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
@ -82,10 +84,36 @@ func BenchmarkMarkComplete(b *testing.B) {
opts.Memory = memory
opts.Path = filepath.Join(b.TempDir(), "storage.db")
opts.Capacity = capacity
ci, err := NewDirectStorage(opts)
c.Assert(err, qt.IsNil)
defer ci.Close()
runBench(b, ci)
directBench := func(b *testing.B) {
ci, err := NewDirectStorage(opts)
if errors.Is(err, UnexpectedJournalMode) {
b.Skipf("setting journal mode %q: %v", opts.SetJournalMode, err)
}
c.Assert(err, qt.IsNil)
defer ci.Close()
runBench(b, ci)
}
for _, journalMode := range []string{"", "wal", "off", "delete", "memory"} {
opts.SetJournalMode = journalMode
b.Run("JournalMode="+journalMode, func(b *testing.B) {
for _, mmapSize := range []int64{-1, 0, 1 << 24, 1 << 25, 1 << 26} {
if memory && mmapSize >= 0 {
continue
}
b.Run(fmt.Sprintf("MmapSize=%s", func() string {
if mmapSize < 0 {
return "default"
} else {
return humanize.IBytes(uint64(mmapSize))
}
}()), func(b *testing.B) {
opts.MmapSize = mmapSize
opts.MmapSizeOk = true
directBench(b)
})
}
})
}
})
b.Run("ResourcePieces", func(b *testing.B) {
for _, batchWrites := range []bool{false, true} {