Skip to content

Commit

Permalink
*: support cgroup with systemd (#48096) (#48146)
Browse files Browse the repository at this point in the history
close #47442
  • Loading branch information
ti-chi-bot committed Nov 6, 2023
1 parent 9e55944 commit c9c0e88
Show file tree
Hide file tree
Showing 2 changed files with 38 additions and 0 deletions.
1 change: 1 addition & 0 deletions tidb-server/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -197,6 +197,7 @@ func main() {
checkTempStorageQuota()
}
setupLog()
memory.InitMemoryHook()
setupExtensions()

err := cpuprofile.StartCPUProfiler()
Expand Down
37 changes: 37 additions & 0 deletions util/memory/meminfo.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,10 @@ import (
"github.com/pingcap/failpoint"
"github.com/pingcap/tidb/parser/terror"
"github.com/pingcap/tidb/util/cgroup"
"github.com/pingcap/tidb/util/logutil"
"github.com/pingcap/tidb/util/mathutil"
"github.com/shirou/gopsutil/v3/mem"
"go.uber.org/zap"
)

// MemTotal returns the total amount of RAM on this system
Expand Down Expand Up @@ -50,6 +52,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
Expand Down Expand Up @@ -139,6 +145,7 @@ func MemUsedCGroup() (uint64, error) {
return memo, nil
}

// it is for test and init.
func init() {
if cgroup.InContainer() {
MemTotal = MemTotalCGroup
Expand All @@ -162,6 +169,36 @@ 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
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()
Expand Down

0 comments on commit c9c0e88

Please sign in to comment.