Skip to content

Commit

Permalink
*: support cgroup with systemd (pingcap#48096) (pingcap#48147)
Browse files Browse the repository at this point in the history
  • Loading branch information
ti-chi-bot authored Nov 6, 2023
1 parent 852b939 commit fc4edaf
Show file tree
Hide file tree
Showing 2 changed files with 39 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 @@ -206,6 +206,7 @@ func main() {
checkTempStorageQuota()
}
setupLog()
memory.InitMemoryHook()
setupExtensions()
setupStmtSummary()

Expand Down
38 changes: 38 additions & 0 deletions util/memory/meminfo.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,10 @@ import (
"github.com/pingcap/sysutil"
"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 @@ -51,6 +53,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 @@ -140,6 +146,7 @@ func MemUsedCGroup() (uint64, error) {
return memo, nil
}

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

0 comments on commit fc4edaf

Please sign in to comment.