diff --git a/tidb-server/main.go b/tidb-server/main.go index ff5e0e7b5cce8..b36d646044f37 100644 --- a/tidb-server/main.go +++ b/tidb-server/main.go @@ -206,6 +206,7 @@ func main() { checkTempStorageQuota() } setupLog() + memory.InitMemoryHook() setupExtensions() setupStmtSummary() diff --git a/util/memory/meminfo.go b/util/memory/meminfo.go index 50dcf555db77e..e8501eab521b2 100644 --- a/util/memory/meminfo.go +++ b/util/memory/meminfo.go @@ -20,10 +20,17 @@ import ( "github.com/pingcap/failpoint" "github.com/pingcap/sysutil" +<<<<<<< HEAD:util/memory/meminfo.go "github.com/pingcap/tidb/parser/terror" "github.com/pingcap/tidb/util/cgroup" "github.com/pingcap/tidb/util/mathutil" +======= + "github.com/pingcap/tidb/pkg/parser/terror" + "github.com/pingcap/tidb/pkg/util/cgroup" + "github.com/pingcap/tidb/pkg/util/logutil" +>>>>>>> 4667ed9e168 (*: support cgroup with systemd (#48096)):pkg/util/memory/meminfo.go "github.com/shirou/gopsutil/v3/mem" + "go.uber.org/zap" ) // MemTotal returns the total amount of RAM on this system @@ -51,6 +58,10 @@ func MemTotalNormal() (uint64, error) { if time.Since(t) < 60*time.Second { return total, nil } + return memTotalNormal() +} + +func memTotalNormal() (uint64, error) { v, err := mem.VirtualMemory() if err != nil { return v.Total, err @@ -140,6 +151,7 @@ func MemUsedCGroup() (uint64, error) { return memo, nil } +// it is for test and init. func init() { if cgroup.InContainer() { MemTotal = MemTotalCGroup @@ -164,6 +176,37 @@ func init() { terror.MustNil(err) } +// InitMemoryHook initializes the memory hook. +// It is to solve the problem that tidb cannot read cgroup in the systemd. +// so if we are not in the container, we compare the cgroup memory limit and the physical memory, +// the cgroup memory limit is smaller, we use the cgroup memory hook. +func InitMemoryHook() { + if cgroup.InContainer() { + logutil.BgLogger().Info("use cgroup memory hook because TiDB is in the container") + return + } + cgroupValue, err := cgroup.GetMemoryLimit() + if err != nil { + return + } + physicalValue, err := memTotalNormal() + if err != nil { + return + } + if physicalValue > cgroupValue && cgroupValue != 0 { + MemTotal = MemTotalCGroup + MemUsed = MemUsedCGroup + sysutil.RegisterGetMemoryCapacity(MemTotalCGroup) + logutil.BgLogger().Info("use cgroup memory hook", zap.Int64("cgroupMemorySize", int64(cgroupValue)), zap.Int64("physicalMemorySize", int64(physicalValue))) + } else { + logutil.BgLogger().Info("use physical memory hook", zap.Int64("cgroupMemorySize", int64(cgroupValue)), zap.Int64("physicalMemorySize", int64(physicalValue))) + } + _, err = MemTotal() + terror.MustNil(err) + _, err = MemUsed() + terror.MustNil(err) +} + // InstanceMemUsed returns the memory usage of this TiDB server func InstanceMemUsed() (uint64, error) { used, t := serverMemUsage.get()