2019-05-22 23:16:55 +02:00
|
|
|
package memory
|
|
|
|
|
|
|
|
import (
|
|
|
|
"syscall"
|
|
|
|
|
2020-08-11 21:54:13 +02:00
|
|
|
"github.com/VictoriaMetrics/VictoriaMetrics/lib/cgroup"
|
2019-05-22 23:16:55 +02:00
|
|
|
"github.com/VictoriaMetrics/VictoriaMetrics/lib/logger"
|
|
|
|
)
|
|
|
|
|
2019-10-16 23:49:54 +02:00
|
|
|
const maxInt = int(^uint(0) >> 1)
|
|
|
|
|
2019-05-22 23:16:55 +02:00
|
|
|
func sysTotalMemory() int {
|
|
|
|
var si syscall.Sysinfo_t
|
|
|
|
if err := syscall.Sysinfo(&si); err != nil {
|
|
|
|
logger.Panicf("FATAL: error in syscall.Sysinfo: %s", err)
|
|
|
|
}
|
2019-10-16 23:49:54 +02:00
|
|
|
totalMem := maxInt
|
|
|
|
if uint64(maxInt)/uint64(si.Totalram) > uint64(si.Unit) {
|
|
|
|
totalMem = int(uint64(si.Totalram) * uint64(si.Unit))
|
|
|
|
}
|
2020-08-11 21:54:13 +02:00
|
|
|
mem := cgroup.GetMemoryLimit()
|
|
|
|
if mem <= 0 || int64(int(mem)) != mem || int(mem) > totalMem {
|
2023-02-13 13:27:13 +01:00
|
|
|
// Try reading hierarchical memory limit.
|
2020-09-03 23:04:08 +02:00
|
|
|
// See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/699
|
|
|
|
mem = cgroup.GetHierarchicalMemoryLimit()
|
|
|
|
if mem <= 0 || int64(int(mem)) != mem || int(mem) > totalMem {
|
|
|
|
return totalMem
|
|
|
|
}
|
2019-06-28 17:08:09 +02:00
|
|
|
}
|
2020-08-11 21:54:13 +02:00
|
|
|
return int(mem)
|
2019-05-22 23:16:55 +02:00
|
|
|
}
|