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:
parent
f6088e5008
commit
f8ad2ac3e2
@ -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()
|
||||||
|
@ -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) {
|
||||||
|
Loading…
Reference in New Issue
Block a user