dircache: increase cache size & lifetime

Looking at the dircache debug output, we see
that a "git status" workload has a very bad
cache hit rate because the entries expire or
get evicted before they can be reused.

Increase both cache size and lifetime for
a 4x speedup:

Before: 75s
After:  17s

https://github.com/rfjakob/gocryptfs/issues/410
This commit is contained in:
Jakob Unterwurzacher 2020-05-17 21:37:36 +02:00
parent f6088e5008
commit f8ad2ac3e2
2 changed files with 9 additions and 9 deletions

View File

@ -12,11 +12,11 @@ import (
) )
const ( const (
// Number of entries in the dirCache. Three entries work well for two // Number of entries in the dirCache.
// (probably also three) parallel tar extracts (hit rate around 92%). // 20 entries work well for "git stat" on a small git repo on sshfs.
// Keep in sync with test_helpers.maxCacheFds ! // Keep in sync with test_helpers.maxCacheFds !
// TODO: How to share this constant without causing an import cycle? // TODO: How to share this constant without causing an import cycle?
dirCacheSize = 3 dirCacheSize = 20
// Enable Lookup/Store/Clear debug messages // Enable Lookup/Store/Clear debug messages
enableDebugMessages = false enableDebugMessages = false
// Enable hit rate statistics printing // Enable hit rate statistics printing
@ -151,7 +151,7 @@ func (d *dirCacheStruct) Lookup(dirRelPath string) (fd int, iv []byte) {
// expireThread is started on the first Lookup() // expireThread is started on the first Lookup()
func (d *dirCacheStruct) expireThread() { func (d *dirCacheStruct) expireThread() {
for { for {
time.Sleep(1 * time.Second) time.Sleep(60 * time.Second)
d.Clear() d.Clear()
if enableStats { if enableStats {
d.Lock() d.Lock()

View File

@ -14,6 +14,11 @@ import (
"time" "time"
) )
// gocryptfs may hold up to maxCacheFds open for caching
// Keep in sync with fusefrontend.dirCacheSize
// TODO: How to share this constant without causing an import cycle?!
const maxCacheFds = 20
// Indexed by mountpoint. Initialized in doInit(). // Indexed by mountpoint. Initialized in doInit().
var MountInfo map[string]mountInfo var MountInfo map[string]mountInfo
@ -137,11 +142,6 @@ func UnmountPanic(dir string) {
} }
} }
// gocryptfs may hold up to maxCacheFds open for caching
// Keep in sync with fusefrontend.dirCacheSize
// TODO: How to share this constant without causing an import cycle?!
const maxCacheFds = 3
// UnmountErr tries to unmount "dir", retrying 10 times, and returns the // UnmountErr tries to unmount "dir", retrying 10 times, and returns the
// resulting error. // resulting error.
func UnmountErr(dir string) (err error) { func UnmountErr(dir string) (err error) {