allegro / allegro/bigcache

Memory usage grows indefinitely when setting same key within eviction interval

Ouverte
#311 3 commentaires 0 réactions 0 personnes assignées Voir sur GitHub
bug
Langage dominant
Go
Étoiles
8.2k
Forks
614
Merge moyen
5 j 12 h
PR mergées (30 j)
1

Description

This is effectively a follow-up on #109 which is closed for some reason.

We have experienced a bug in production service when hard limits were removed and OOM killed the app. The app has to hold some data in cache which is then repeatedly re-read from DB and re-set in a fixed interval of ~30 min. Keys for saving data in memory are always the same. What we observed is that after few hours memory consumption in our service has grown above any limit.

I slightly modified code snipped from #109 to experiment and reproduce Bigcache behavior:

```go
package main

import (
"strconv"
"time"

"github.com/allegro/bigcache/v3"
)

func main() {
evictionInteval := time.Minute

cacheCfg := bigcache.DefaultConfig(evictionInteval)
// cacheCfg.CleanWindow = time.Second
cacheCfg.Verbose = false
// cacheCfg.HardMaxCacheSize = 100

cache, _ := bigcache.NewBigCache(cacheCfg)
data := []byte("TESTDATATESTDATATESTDATATESTDATATESTDATATESTDATATESTDATA")

for {
for i := 0; i < 10000; i++ {
if err := cache.Set(strconv.Itoa(i), data); err != nil {
panic(err)
}
}
time.Sleep(100 * time.Millisecond)
}
}
```

The memory usage growth depends __only__ on `evictionInterval`.
So, for instance, on my linux machine, when `evictionInterval` set to
- 1 minute, RSS is ~877M
- 2 minutes, RSS is ~1680M
- etc

So if `evictionInterval` is big enough and we keep setting data with same _key_, we would end up with OOM killer.

It doesn't matter whether `GODEBUG=madvdontneed=1` is set or not. I run with this param, but it just seems to not affect anything.

Please note commented `// cacheCfg.CleanWindow = time.Second` line - I tried setting this param to different values starting from 1 sec, and it didn't help.

As a result the only way to limit memory consumption and prevent OOM is to set `HardMaxCacheSize`.

Guide de contribution

Aucun guide de contribution indexé pour ce dépôt

Évaluation

Cette issue n'a pas encore été évaluée.

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.