agent/cgroup/group_cpu.go (100 lines of code) (raw):
//+build linux
package cgroup
import (
"errors"
"os"
"strconv"
)
var (
ErrCfsNotEnabled = errors.New("Make sure that CONFIG_CFS_BANDWIDTH option is enabled in your kernel")
ErrRtNotEnabled = errors.New("Make sure that CONFIG_RT_GROUP_SCHED option is enabled in your kernel")
)
type CpuGroup struct {
path string
}
func NewCpuGroup(subpath string, pid int) (Cgroup, error) {
return NewGroup(subpath, "cpu", pid)
}
func (g *CpuGroup) Set(c *Config) error {
if c.CpuShares != 0 {
if err := writeValue(g.path, "cpu.shares", strconv.FormatInt(c.CpuShares, 10)); err != nil {
return err
}
}
if c.CpuPeriod != 0 {
switch err := writeValue(g.path, "cpu.cfs_period_us", strconv.FormatInt(c.CpuPeriod, 10)); {
case err == nil:
case os.IsNotExist(err):
return ErrCfsNotEnabled
default:
return err
}
}
if c.CpuQuota != 0 {
switch err := writeValue(g.path, "cpu.cfs_quota_us", strconv.FormatInt(c.CpuQuota, 10)); {
case err == nil:
case os.IsNotExist(err):
return ErrCfsNotEnabled
default:
return err
}
}
if c.CpuRtPeriod != 0 {
switch err := writeValue(g.path, "cpu.rt_period_us", strconv.FormatInt(c.CpuRtPeriod, 10)); {
case err == nil:
case os.IsNotExist(err):
return ErrRtNotEnabled
default:
return err
}
}
if c.CpuRtRuntime != 0 {
switch err := writeValue(g.path, "cpu.rt_runtime_us", strconv.FormatInt(c.CpuRtRuntime, 10)); {
case err == nil:
case os.IsNotExist(err):
return ErrRtNotEnabled
default:
return err
}
}
return nil
}
func (g *CpuGroup) Get(c *Config) error {
switch v, err := readInt64Value(g.path, "cpu.shares"); {
case err == nil:
c.CpuShares = v
default:
return err
}
switch v, err := readInt64Value(g.path, "cpu.cfs_period_us"); {
case err == nil:
c.CpuPeriod = v
case os.IsNotExist(err):
default:
return err
}
switch v, err := readInt64Value(g.path, "cpu.cfs_quota_us"); {
case err == nil:
c.CpuQuota = v
case os.IsNotExist(err):
default:
return err
}
switch v, err := readInt64Value(g.path, "cpu.rt_period_us"); {
case err == nil:
c.CpuRtPeriod = v
case os.IsNotExist(err):
default:
return err
}
switch v, err := readInt64Value(g.path, "cpu.cfs_runtime_us"); {
case err == nil:
c.CpuRtRuntime = v
case os.IsNotExist(err):
default:
return err
}
return nil
}
func (g *CpuGroup) GetPath() string {
return g.path
}