mirror of
https://github.com/VictoriaMetrics/VictoriaMetrics.git
synced 2024-11-21 14:44:00 +00:00
lib/memory: fall back to reading hierarchical memory limit in cgroups when the default limit isn't set
Updates https://github.com/VictoriaMetrics/VictoriaMetrics/issues/699
This commit is contained in:
parent
d387da142e
commit
be6ae4b5e7
3 changed files with 32 additions and 9 deletions
|
@ -14,3 +14,18 @@ func GetMemoryLimit() int64 {
|
||||||
}
|
}
|
||||||
return n
|
return n
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// GetHierarchicalMemoryLimit returns hierarchical memory limit
|
||||||
|
func GetHierarchicalMemoryLimit() int64 {
|
||||||
|
// See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/699
|
||||||
|
n, err := readInt64FromCommand("cat /sys/fs/cgroup/memory/memory.stat | grep hierarchical_memory_limit | cut -d' ' -f 2")
|
||||||
|
if err == nil {
|
||||||
|
return n
|
||||||
|
}
|
||||||
|
n, err = readInt64FromCommand(
|
||||||
|
"cat /sys/fs/cgroup/memory$(cat /proc/self/cgroup | grep memory | cut -d: -f3)/memory.stat | grep hierarchical_memory_limit | cut -d' ' -f 2")
|
||||||
|
if err != nil {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
return n
|
||||||
|
}
|
||||||
|
|
|
@ -9,15 +9,18 @@ import (
|
||||||
|
|
||||||
func readInt64(path, altCommand string) (int64, error) {
|
func readInt64(path, altCommand string) (int64, error) {
|
||||||
data, err := ioutil.ReadFile(path)
|
data, err := ioutil.ReadFile(path)
|
||||||
|
if err == nil {
|
||||||
|
data = bytes.TrimSpace(data)
|
||||||
|
return strconv.ParseInt(string(data), 10, 64)
|
||||||
|
}
|
||||||
|
return readInt64FromCommand(altCommand)
|
||||||
|
}
|
||||||
|
|
||||||
|
func readInt64FromCommand(command string) (int64, error) {
|
||||||
|
cmd := exec.Command("/bin/sh", "-c", command)
|
||||||
|
data, err := cmd.Output()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
// Read data according to https://unix.stackexchange.com/questions/242718/how-to-find-out-how-much-memory-lxc-container-is-allowed-to-consume
|
return 0, err
|
||||||
// This should properly determine the data location inside lxc container.
|
|
||||||
// See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/84
|
|
||||||
cmd := exec.Command("/bin/sh", "-c", altCommand)
|
|
||||||
data, err = cmd.Output()
|
|
||||||
if err != nil {
|
|
||||||
return 0, err
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
data = bytes.TrimSpace(data)
|
data = bytes.TrimSpace(data)
|
||||||
return strconv.ParseInt(string(data), 10, 64)
|
return strconv.ParseInt(string(data), 10, 64)
|
||||||
|
|
|
@ -20,7 +20,12 @@ func sysTotalMemory() int {
|
||||||
}
|
}
|
||||||
mem := cgroup.GetMemoryLimit()
|
mem := cgroup.GetMemoryLimit()
|
||||||
if mem <= 0 || int64(int(mem)) != mem || int(mem) > totalMem {
|
if mem <= 0 || int64(int(mem)) != mem || int(mem) > totalMem {
|
||||||
return totalMem
|
// Try reading hierachical memory limit.
|
||||||
|
// See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/699
|
||||||
|
mem = cgroup.GetHierarchicalMemoryLimit()
|
||||||
|
if mem <= 0 || int64(int(mem)) != mem || int(mem) > totalMem {
|
||||||
|
return totalMem
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return int(mem)
|
return int(mem)
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue