Skip to content

Commit 0817859

Browse files
committed
enable cache host memory %
1 parent deb4433 commit 0817859

File tree

6 files changed

+48
-11
lines changed

6 files changed

+48
-11
lines changed

go.mod

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ require (
1717
github.com/knadh/koanf/providers/rawbytes v0.1.0
1818
github.com/knadh/koanf/v2 v2.0.1
1919
github.com/redis/go-redis/v9 v9.5.1
20+
github.com/shirou/gopsutil v2.21.11+incompatible
2021
go.uber.org/zap v1.27.0
2122
google.golang.org/grpc v1.62.0
2223
google.golang.org/protobuf v1.33.0
@@ -99,6 +100,7 @@ require (
99100
github.com/vishvananda/netlink v1.2.1-beta.2 // indirect
100101
github.com/vishvananda/netns v0.0.4 // indirect
101102
github.com/x448/float16 v0.8.4 // indirect
103+
github.com/yusufpapurcu/wmi v1.2.4 // indirect
102104
go.uber.org/multierr v1.11.0 // indirect
103105
go4.org/mem v0.0.0-20220726221520-4f986261bf13 // indirect
104106
go4.org/netipx v0.0.0-20231129151722-fdeea329fbba // indirect

go.sum

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,7 @@ github.com/github/fakeca v0.1.0 h1:Km/MVOFvclqxPM9dZBC4+QE564nU4gz4iZ0D9pMw28I=
9393
github.com/github/fakeca v0.1.0/go.mod h1:+bormgoGMMuamOscx7N91aOuUST7wdaJ2rNjeohylyo=
9494
github.com/go-json-experiment/json v0.0.0-20231102232822-2e55bd4e08b0 h1:ymLjT4f35nQbASLnvxEde4XOBL+Sn7rFuV+FOJqkljg=
9595
github.com/go-json-experiment/json v0.0.0-20231102232822-2e55bd4e08b0/go.mod h1:6daplAwHHGbUGib4990V3Il26O0OC4aRyvewaaAihaA=
96+
github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0=
9697
github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE=
9798
github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78=
9899
github.com/godbus/dbus/v5 v5.1.1-0.20230522191255-76236955d466 h1:sQspH8M4niEijh3PFscJRLDnkL547IeP7kpPe3uUhEg=
@@ -201,6 +202,8 @@ github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDN
201202
github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA=
202203
github.com/safchain/ethtool v0.3.0 h1:gimQJpsI6sc1yIqP/y8GYgiXn/NjgvpM0RNoWLVVmP0=
203204
github.com/safchain/ethtool v0.3.0/go.mod h1:SA9BwrgyAqNo7M+uaL6IYbxpm5wk3L7Mm6ocLW+CJUs=
205+
github.com/shirou/gopsutil v2.21.11+incompatible h1:lOGOyCG67a5dv2hq5Z1BLDUqqKp3HkbjPcz5j6XMS0U=
206+
github.com/shirou/gopsutil v2.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA=
204207
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
205208
github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
206209
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
@@ -241,6 +244,8 @@ github.com/vishvananda/netns v0.0.4 h1:Oeaw1EM2JMxD51g9uhtC0D7erkIjgmj8+JZc26m1Y
241244
github.com/vishvananda/netns v0.0.4/go.mod h1:SpkAiCQRtJ6TvvxPnOSyH3BMl6unz3xZlaprSwhNNJM=
242245
github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM=
243246
github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg=
247+
github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0=
248+
github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0=
244249
go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
245250
go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
246251
go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=
@@ -267,6 +272,7 @@ golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJ
267272
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
268273
golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M=
269274
golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
275+
golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
270276
golang.org/x/sys v0.0.0-20200217220822-9197077df867/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
271277
golang.org/x/sys v0.0.0-20200728102440-3e129f6d46b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
272278
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=

pkg/config.default.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ tlsEnabled: false
44
rttThresholdMilliseconds: 100
55
hostStorageCapacityThresholdPct: 0.95
66
pageSizeBytes: 4000000 # 4MB
7-
maxCacheSizeMb: 100 # 100MB
7+
maxCachePct: 60
88
grpcMessageSizeBytes: 1000000000
99
grpcDialTimeoutS: 1
1010
discoveryIntervalS: 5

pkg/server.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -212,7 +212,7 @@ func (cs *CacheService) GetState(ctx context.Context, req *proto.GetStateRequest
212212
var memStats runtime.MemStats
213213
runtime.ReadMemStats(&memStats)
214214
memoryUsage := float64(memStats.Alloc) / (1024 * 1024)
215-
capacityUsagePct := memoryUsage / float64(cs.cfg.MaxCacheSizeMb)
215+
capacityUsagePct := memoryUsage / float64(cs.cas.maxCacheSizeMb)
216216

217217
return &proto.GetStateResponse{
218218
Version: BlobCacheVersion,

pkg/storage.go

Lines changed: 37 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,22 +5,25 @@ import (
55
"context"
66
"errors"
77
"fmt"
8+
"log"
89
"strings"
910
"time"
1011

1112
"github.com/beam-cloud/ristretto"
13+
"github.com/shirou/gopsutil/mem"
1214
)
1315

1416
type ContentAddressableStorage struct {
15-
ctx context.Context
16-
currentHost *BlobCacheHost
17-
cache *ristretto.Cache[string, interface{}]
18-
config BlobCacheConfig
19-
metadata *BlobCacheMetadata
17+
ctx context.Context
18+
currentHost *BlobCacheHost
19+
cache *ristretto.Cache[string, interface{}]
20+
config BlobCacheConfig
21+
metadata *BlobCacheMetadata
22+
maxCacheSizeMb int64
2023
}
2124

2225
func NewContentAddressableStorage(ctx context.Context, currentHost *BlobCacheHost, metadata *BlobCacheMetadata, config BlobCacheConfig) (*ContentAddressableStorage, error) {
23-
if config.MaxCacheSizeMb <= 0 || config.PageSizeBytes <= 0 {
26+
if config.MaxCachePct <= 0 || config.PageSizeBytes <= 0 {
2427
return nil, errors.New("invalid cache configuration")
2528
}
2629

@@ -31,21 +34,42 @@ func NewContentAddressableStorage(ctx context.Context, currentHost *BlobCacheHos
3134
currentHost: currentHost,
3235
}
3336

37+
availableMemoryMb := getAvailableMemoryMb()
38+
maxCacheSizeMb := (availableMemoryMb * config.MaxCachePct) / 100
39+
maxCost := maxCacheSizeMb * 1e6
40+
41+
Logger.Infof("Total available memory: %dMB", availableMemoryMb)
42+
Logger.Infof("Max cache size: %dMB", maxCacheSizeMb)
43+
Logger.Infof("Max cost: %d", maxCost)
44+
45+
if maxCacheSizeMb <= 0 {
46+
return nil, errors.New("invalid memory limit")
47+
}
48+
3449
cache, err := ristretto.NewCache(&ristretto.Config[string, interface{}]{
3550
NumCounters: 1e7,
36-
MaxCost: config.MaxCacheSizeMb * 1e6,
51+
MaxCost: maxCost,
3752
BufferItems: 64,
3853
OnEvict: cas.onEvict,
39-
Metrics: false,
54+
Metrics: config.DebugMode,
4055
})
4156
if err != nil {
4257
return nil, err
4358
}
4459

4560
cas.cache = cache
61+
cas.maxCacheSizeMb = maxCacheSizeMb
4662
return cas, nil
4763
}
4864

65+
func getAvailableMemoryMb() int64 {
66+
v, err := mem.VirtualMemory()
67+
if err != nil {
68+
log.Fatalf("Unable to retrieve host memory info: %v", err)
69+
}
70+
return int64(v.Total / (1024 * 1024))
71+
}
72+
4973
type cacheValue struct {
5074
Hash string
5175
Content []byte
@@ -55,6 +79,10 @@ func (cas *ContentAddressableStorage) Add(ctx context.Context, hash string, cont
5579
size := int64(len(content))
5680
chunkKeys := []string{}
5781

82+
if cas.config.DebugMode {
83+
Logger.Debugf("Cost added before Add: %+v", cas.cache.Metrics.CostAdded())
84+
}
85+
5886
// Break content into chunks and store
5987
for offset := int64(0); offset < size; offset += cas.config.PageSizeBytes {
6088
chunkIdx := offset / cas.config.PageSizeBytes
@@ -103,6 +131,7 @@ func (cas *ContentAddressableStorage) Add(ctx context.Context, hash string, cont
103131
return err
104132
}
105133

134+
Logger.Debugf("Added object: %s, size: %d bytes", hash, size)
106135
return nil
107136
}
108137

pkg/types.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ type BlobCacheConfig struct {
2323
HostStorageCapacityThresholdPct float64 `key:"hostStorageCapacityThresholdPct" json:"host_storage_capacity_threshold_pct"`
2424
ObjectTtlS int `key:"objectTtlS" json:"object_ttl_s"`
2525
RoundTripThresholdMilliseconds uint `key:"rttThresholdMilliseconds" json:"rtt_threshold_ms"`
26-
MaxCacheSizeMb int64 `key:"maxCacheSizeMb" json:"max_cache_size_mb"`
26+
MaxCachePct int64 `key:"maxCachePct" json:"max_cache_pct"`
2727
PageSizeBytes int64 `key:"pageSizeBytes" json:"page_size_bytes"`
2828
GRPCDialTimeoutS int `key:"grpcDialTimeoutS" json:"grpc_dial_timeout_s"`
2929
GRPCMessageSizeBytes int `key:"grpcMessageSizeBytes" json:"grpc_message_size_bytes"`

0 commit comments

Comments
 (0)