2019-05-22 23:16:55 +02:00
package memory
import (
"flag"
"fmt"
"sync"
"github.com/VictoriaMetrics/VictoriaMetrics/lib/logger"
)
2020-04-09 14:28:53 +02:00
var allowedMemPercent = flag . Float64 ( "memory.allowedPercent" , 60 , "Allowed percent of system memory VictoriaMetrics caches may occupy. " +
"Too low value may increase cache miss rate, which usually results in higher CPU and disk IO usage. " +
"Too high value may evict too much data from OS page cache, which will result in higher disk IO usage" )
2019-05-22 23:16:55 +02:00
2019-08-25 13:39:39 +02:00
var (
allowedMemory int
remainingMemory int
)
2019-05-22 23:16:55 +02:00
var once sync . Once
2019-08-25 13:39:39 +02:00
func initOnce ( ) {
if ! flag . Parsed ( ) {
// Do not use logger.Panicf here, since logger may be uninitialized yet.
panic ( fmt . Errorf ( "BUG: memory.Allowed must be called only after flag.Parse call" ) )
}
2020-06-03 22:39:29 +02:00
if * allowedMemPercent < 1 || * allowedMemPercent > 200 {
logger . Panicf ( "FATAL: -memory.allowedPercent must be in the range [1...200]; got %f" , * allowedMemPercent )
2019-08-25 13:39:39 +02:00
}
percent := * allowedMemPercent / 100
mem := sysTotalMemory ( )
allowedMemory = int ( float64 ( mem ) * percent )
remainingMemory = mem - allowedMemory
logger . Infof ( "limiting caches to %d bytes, leaving %d bytes to the OS according to -memory.allowedPercent=%g" , allowedMemory , remainingMemory , * allowedMemPercent )
}
2019-05-22 23:16:55 +02:00
// Allowed returns the amount of system memory allowed to use by the app.
//
// The function must be called only after flag.Parse is called.
func Allowed ( ) int {
2019-08-25 13:39:39 +02:00
once . Do ( initOnce )
2019-05-22 23:16:55 +02:00
return allowedMemory
}
2019-08-25 13:39:39 +02:00
// Remaining returns the amount of memory remaining to the OS.
//
// This function must be called only after flag.Parse is called.
func Remaining ( ) int {
once . Do ( initOnce )
return remainingMemory
}