mirror of
https://github.com/opencontainers/runc.git
synced 2026-07-11 06:03:57 +08:00
4189cb65f8
This (and the converting function) is only used by one of the four cgroup drivers. The other three do some checking and conversion in place, so let the fs2 do the same. Signed-off-by: Kir Kolyshkin <kolyshkin@gmail.com>
78 lines
1.8 KiB
Go
78 lines
1.8 KiB
Go
// +build linux
|
|
|
|
package fs2
|
|
|
|
import (
|
|
"bufio"
|
|
"os"
|
|
"path/filepath"
|
|
"strconv"
|
|
|
|
"github.com/opencontainers/runc/libcontainer/cgroups"
|
|
"github.com/opencontainers/runc/libcontainer/cgroups/fscommon"
|
|
"github.com/opencontainers/runc/libcontainer/configs"
|
|
)
|
|
|
|
func isCpuSet(cgroup *configs.Cgroup) bool {
|
|
return cgroup.Resources.CpuWeight != 0 || cgroup.Resources.CpuQuota != 0 || cgroup.Resources.CpuPeriod != 0
|
|
}
|
|
|
|
func setCpu(dirPath string, cgroup *configs.Cgroup) error {
|
|
if !isCpuSet(cgroup) {
|
|
return nil
|
|
}
|
|
r := cgroup.Resources
|
|
|
|
// NOTE: .CpuShares is not used here. Conversion is the caller's responsibility.
|
|
if r.CpuWeight != 0 {
|
|
if err := fscommon.WriteFile(dirPath, "cpu.weight", strconv.FormatUint(r.CpuWeight, 10)); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
|
|
if r.CpuQuota != 0 || r.CpuPeriod != 0 {
|
|
str := "max"
|
|
if r.CpuQuota > 0 {
|
|
str = strconv.FormatInt(r.CpuQuota, 10)
|
|
}
|
|
period := r.CpuPeriod
|
|
if period == 0 {
|
|
// This default value is documented in
|
|
// https://www.kernel.org/doc/html/latest/admin-guide/cgroup-v2.html
|
|
period = 100000
|
|
}
|
|
str += " " + strconv.FormatUint(period, 10)
|
|
if err := fscommon.WriteFile(dirPath, "cpu.max", str); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
|
|
return nil
|
|
}
|
|
func statCpu(dirPath string, stats *cgroups.Stats) error {
|
|
f, err := os.Open(filepath.Join(dirPath, "cpu.stat"))
|
|
if err != nil {
|
|
return err
|
|
}
|
|
defer f.Close()
|
|
|
|
sc := bufio.NewScanner(f)
|
|
for sc.Scan() {
|
|
t, v, err := fscommon.GetCgroupParamKeyValue(sc.Text())
|
|
if err != nil {
|
|
return err
|
|
}
|
|
switch t {
|
|
case "usage_usec":
|
|
stats.CpuStats.CpuUsage.TotalUsage = v * 1000
|
|
|
|
case "user_usec":
|
|
stats.CpuStats.CpuUsage.UsageInUsermode = v * 1000
|
|
|
|
case "system_usec":
|
|
stats.CpuStats.CpuUsage.UsageInKernelmode = v * 1000
|
|
}
|
|
}
|
|
return nil
|
|
}
|