mirror of
https://github.com/VictoriaMetrics/VictoriaMetrics.git
synced 2024-12-15 16:30:55 +01:00
lib/cgroup: set GOGC to 50 by default if it isn't set
This should reduce memory usage for typical VictoriaMetrics workloads by up to 50%
This commit is contained in:
parent
28a778dc9f
commit
377bb06b47
@ -7,16 +7,16 @@ import (
|
|||||||
"runtime"
|
"runtime"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
"sync"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// AvailableCPUs returns the number of available CPU cores for the app.
|
// AvailableCPUs returns the number of available CPU cores for the app.
|
||||||
func AvailableCPUs() int {
|
func AvailableCPUs() int {
|
||||||
availableCPUsOnce.Do(updateGOMAXPROCSToCPUQuota)
|
|
||||||
return runtime.GOMAXPROCS(-1)
|
return runtime.GOMAXPROCS(-1)
|
||||||
}
|
}
|
||||||
|
|
||||||
var availableCPUsOnce sync.Once
|
func init() {
|
||||||
|
updateGOMAXPROCSToCPUQuota()
|
||||||
|
}
|
||||||
|
|
||||||
// updateGOMAXPROCSToCPUQuota updates GOMAXPROCS to cgroup CPU quota if GOMAXPROCS isn't set in environment var.
|
// updateGOMAXPROCSToCPUQuota updates GOMAXPROCS to cgroup CPU quota if GOMAXPROCS isn't set in environment var.
|
||||||
func updateGOMAXPROCSToCPUQuota() {
|
func updateGOMAXPROCSToCPUQuota() {
|
||||||
|
@ -1,9 +1,39 @@
|
|||||||
package cgroup
|
package cgroup
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"os"
|
||||||
|
"runtime/debug"
|
||||||
"strconv"
|
"strconv"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// GetGOGC returns GOGC value for the currently running process.
|
||||||
|
//
|
||||||
|
// See https://golang.org/pkg/runtime/#hdr-Environment_Variables for more details about GOGC
|
||||||
|
func GetGOGC() int {
|
||||||
|
return gogc
|
||||||
|
}
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
initGOGC()
|
||||||
|
}
|
||||||
|
|
||||||
|
func initGOGC() {
|
||||||
|
if v := os.Getenv("GOGC"); v != "" {
|
||||||
|
n, err := strconv.Atoi(v)
|
||||||
|
if err != nil {
|
||||||
|
n = 100
|
||||||
|
}
|
||||||
|
gogc = n
|
||||||
|
} else {
|
||||||
|
// Set GOGC to 50% by default if it isn't set yet.
|
||||||
|
// This should reduce memory usage for typical workloads for VictoriaMetrics components.
|
||||||
|
gogc = 50
|
||||||
|
debug.SetGCPercent(gogc)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var gogc int
|
||||||
|
|
||||||
// GetMemoryLimit returns cgroup memory limit
|
// GetMemoryLimit returns cgroup memory limit
|
||||||
func GetMemoryLimit() int64 {
|
func GetMemoryLimit() int64 {
|
||||||
// Try determining the amount of memory inside docker container.
|
// Try determining the amount of memory inside docker container.
|
||||||
|
@ -51,6 +51,7 @@ func writePrometheusMetrics(w io.Writer) {
|
|||||||
fmt.Fprintf(w, "vm_allowed_memory_bytes %d\n", memory.Allowed())
|
fmt.Fprintf(w, "vm_allowed_memory_bytes %d\n", memory.Allowed())
|
||||||
fmt.Fprintf(w, "vm_available_memory_bytes %d\n", memory.Allowed()+memory.Remaining())
|
fmt.Fprintf(w, "vm_available_memory_bytes %d\n", memory.Allowed()+memory.Remaining())
|
||||||
fmt.Fprintf(w, "vm_available_cpu_cores %d\n", cgroup.AvailableCPUs())
|
fmt.Fprintf(w, "vm_available_cpu_cores %d\n", cgroup.AvailableCPUs())
|
||||||
|
fmt.Fprintf(w, "vm_gogc %d\n", cgroup.GetGOGC())
|
||||||
|
|
||||||
// Export start time and uptime in seconds
|
// Export start time and uptime in seconds
|
||||||
fmt.Fprintf(w, "vm_app_start_timestamp %d\n", startTime.Unix())
|
fmt.Fprintf(w, "vm_app_start_timestamp %d\n", startTime.Unix())
|
||||||
|
Loading…
Reference in New Issue
Block a user