github.com/swiftstack/ProxyFS@v0.0.0-20210203235616-4017c267d62f/inode/benchmark_test.go (about) 1 // Copyright (c) 2015-2021, NVIDIA CORPORATION. 2 // SPDX-License-Identifier: Apache-2.0 3 4 package inode 5 6 import ( 7 "strconv" 8 "testing" 9 10 "github.com/swiftstack/ProxyFS/utils" 11 ) 12 13 func writeBenchmarkHelper(b *testing.B, byteSize uint64) { 14 testVolumeHandle, _ := FetchVolumeHandle("TestVolume") 15 fileInodeNumber, _ := testVolumeHandle.CreateFile(PosixModePerm, 0, 0) 16 buffer := make([]byte, 4096) 17 b.ResetTimer() 18 for i := 0; i < b.N; i++ { 19 testVolumeHandle.Write(fileInodeNumber, 0, buffer, nil) 20 } 21 } 22 23 func Benchmark4KiBWrite(b *testing.B) { 24 writeBenchmarkHelper(b, 4*1024) 25 } 26 27 func Benchmark8KiBWrite(b *testing.B) { 28 writeBenchmarkHelper(b, 8*1024) 29 } 30 31 func Benchmark16KiBWrite(b *testing.B) { 32 writeBenchmarkHelper(b, 16*1024) 33 } 34 35 func Benchmark32KiBWrite(b *testing.B) { 36 writeBenchmarkHelper(b, 32*1024) 37 } 38 39 func Benchmark64KiBWrite(b *testing.B) { 40 writeBenchmarkHelper(b, 64*1024) 41 } 42 43 func readBenchmarkHelper(b *testing.B, byteSize uint64) { 44 testVolumeHandle, _ := FetchVolumeHandle("TestVolume") 45 fileInodeNumber, _ := testVolumeHandle.CreateFile(PosixModePerm, 0, 0) 46 buffer := make([]byte, byteSize) 47 testVolumeHandle.Write(fileInodeNumber, 0, buffer, nil) 48 b.ResetTimer() 49 for i := 0; i < b.N; i++ { 50 testVolumeHandle.Read(fileInodeNumber, 0, byteSize, nil) 51 } 52 } 53 54 func BenchmarkRead4KiB(b *testing.B) { 55 readBenchmarkHelper(b, 4*1024) 56 } 57 58 func BenchmarkRead8KiB(b *testing.B) { 59 readBenchmarkHelper(b, 8*1024) 60 } 61 62 func BenchmarkRead16KiB(b *testing.B) { 63 readBenchmarkHelper(b, 16*1024) 64 } 65 66 func BenchmarkRead32KiB(b *testing.B) { 67 readBenchmarkHelper(b, 32*1024) 68 } 69 70 func BenchmarkRead64KiB(b *testing.B) { 71 readBenchmarkHelper(b, 64*1024) 72 } 73 74 func getReadPlanBenchmarkHelper(b *testing.B, byteSize uint64) { 75 testVolumeHandle, _ := FetchVolumeHandle("TestVolume") 76 fileInodeNumber, _ := testVolumeHandle.CreateFile(PosixModePerm, 0, 0) 77 buffer := make([]byte, byteSize) 78 testVolumeHandle.Write(fileInodeNumber, 0, buffer, nil) 79 var zero uint64 80 b.ResetTimer() 81 for i := 0; i < b.N; i++ { 82 testVolumeHandle.GetReadPlan(fileInodeNumber, &zero, &byteSize) 83 } 84 } 85 86 func BenchmarkGetReadPlan4KiB(b *testing.B) { 87 getReadPlanBenchmarkHelper(b, 4*1024) 88 } 89 90 func BenchmarkGetReadPlan8KiB(b *testing.B) { 91 getReadPlanBenchmarkHelper(b, 8*1024) 92 } 93 94 func BenchmarkGetReadPlan16KiB(b *testing.B) { 95 getReadPlanBenchmarkHelper(b, 16*1024) 96 } 97 98 func BenchmarkGetReadPlan32KiB(b *testing.B) { 99 getReadPlanBenchmarkHelper(b, 32*1024) 100 } 101 102 func BenchmarkGetReadPlan64KiB(b *testing.B) { 103 getReadPlanBenchmarkHelper(b, 64*1024) 104 } 105 106 func readCacheBenchmarkHelper(b *testing.B, byteSize uint64) { 107 testVolumeHandle, _ := FetchVolumeHandle("TestVolume") 108 fileInodeNumber, _ := testVolumeHandle.CreateFile(PosixModePerm, 0, 0) 109 buffer := make([]byte, byteSize) 110 testVolumeHandle.Write(fileInodeNumber, 0, buffer, nil) 111 testVolumeHandle.Flush(fileInodeNumber, false) 112 var zero uint64 113 zero = 0 114 readPlan, _ := testVolumeHandle.GetReadPlan(fileInodeNumber, &zero, &byteSize) 115 testVolumeHandle.Read(fileInodeNumber, 0, byteSize, nil) 116 // at this point, the read cache should be populated 117 118 // let's get the log segment number 119 _, _, objectName, _ := utils.PathToAcctContObj(readPlan[0].ObjectPath) 120 logSegmentNumber, _ := strconv.ParseUint(objectName, 16, 64) 121 122 volume := testVolumeHandle.(*volumeStruct) 123 124 b.ResetTimer() 125 for i := 0; i < b.N; i++ { 126 buf := []byte{} 127 readCacheKey := readCacheKeyStruct{volumeName: "TestVolume", logSegmentNumber: logSegmentNumber, cacheLineTag: 0} 128 volume.volumeGroup.Lock() 129 readCacheElement, _ := volume.volumeGroup.readCache[readCacheKey] 130 cacheLine := readCacheElement.cacheLine 131 buf = append(buf, cacheLine[:byteSize]...) 132 volume.volumeGroup.Unlock() 133 } 134 } 135 136 func BenchmarkReadCache4KiB(b *testing.B) { 137 readCacheBenchmarkHelper(b, 4*1024) 138 } 139 140 func BenchmarkReadCache8KiB(b *testing.B) { 141 readCacheBenchmarkHelper(b, 8*1024) 142 } 143 144 func BenchmarkReadCache16KiB(b *testing.B) { 145 readCacheBenchmarkHelper(b, 16*1024) 146 } 147 148 func BenchmarkReadCache32KiB(b *testing.B) { 149 readCacheBenchmarkHelper(b, 32*1024) 150 } 151 152 func BenchmarkReadCache64KiB(b *testing.B) { 153 readCacheBenchmarkHelper(b, 64*1024) 154 }