1
// Copyright 2017 The Upspin Authors. All rights reserved.
2
// Use of this source code is governed by a BSD-style
3
// license that can be found in the LICENSE file.
19
// These benchmarks by default run on local storage. To isolate the performance
20
// of the DirServer from the system's storage the DirServer logs should be
21
// written to a ram disk.
23
// To set up a ram disk on Linux Ubuntu 16.04 do:
25
// mkdir /dev/shm/benchdir
27
// Then run benchmarks:
29
// env TMPDIR=/dev/shm/benchdir go test -bench=. -benchmem
32
func BenchmarkPutAtRoot(b *testing.B) {
33
benchmarkPut(b, userName)
36
func BenchmarkPut1Deep(b *testing.B) {
37
benchmarkPut(b, userName+"/"+mkName())
40
func BenchmarkPut2Deep(b *testing.B) {
41
benchmarkPut(b, userName+"/"+mkName()+"/"+mkName())
44
func BenchmarkPut4Deep(b *testing.B) {
45
benchmarkPut(b, userName+"/"+mkName()+"/"+mkName()+"/"+mkName()+"/"+mkName())
48
func benchmarkPut(b *testing.B, dir upspin.PathName) {
50
s, _, cleanup := setupBenchServer(b)
55
for i := 0; i < b.N; i++ {
57
name := dir + "/" + subdir
58
_, err := s.Put(&upspin.DirEntry{
61
Attr: upspin.AttrDirectory,
71
func BenchmarkLookupAtRootNotCached(b *testing.B) {
72
benckmarkLookup(b, !cached, userName+"/"+mkName())
75
func BenchmarkLookupAtRootCached(b *testing.B) {
76
benckmarkLookup(b, cached, userName+"/"+mkName())
79
func BenchmarkLookup4DeepNotCached(b *testing.B) {
80
benckmarkLookup(b, !cached, userName+"/"+mkName()+"/"+mkName()+"/"+mkName()+"/"+mkName())
83
func BenchmarkLookup4DeepCached(b *testing.B) {
84
benckmarkLookup(b, cached, userName+"/"+mkName()+"/"+mkName()+"/"+mkName()+"/"+mkName())
87
func benckmarkLookup(b *testing.B, cached bool, dir upspin.PathName) {
89
s, _, cleanup := setupBenchServer(b)
91
s.userTrees = cache.NewLRU(1)
95
for i := 0; i < b.N; i++ {
96
_, err := s.Lookup(dir)
101
s.userTrees.RemoveOldest()
106
// setupBenchServer sets up the benchmark tests and returns the server to use,
107
// the user's config and a clean up function to use after benchmarks are run.
108
func setupBenchServer(t testing.TB) (*server, upspin.Config, func()) {
109
testDir, err := ioutil.TempDir("", "DirServer.Bench")
113
generatorInstance = nil
115
s, cfg := newDirServerForTestingWithTestDir(t, userName, testDir)
116
_, err = makeDirectory(s, userName+"/")
121
os.RemoveAll(testDir)
122
log.SetOutput(os.Stderr)
127
func mkAll(b *testing.B, s *server, dir upspin.PathName) {
128
p, err := path.Parse(dir)
132
for i := 0; i < p.NElem(); i++ {
133
makeDirectory(s, p.First(i+1).Path())
139
func mkName() upspin.PathName {
141
return upspin.PathName(fmt.Sprintf("%d", nameCount))