3.容器资源限制的实现 (Cgroup,subsystem,hierarchy)
总的思想是向Cgroup里的文件写限制内容实现。
①subsystem相关结构实现
type ResourceConfig struct{
MemoryLimit string
CpuShare string
Cpuset string
}
//set, apply, remove都是通过将内容写入到cgroup文件中来实现的
type Subsystem interface
Name() string
Set(path string, res *ResourceConfig) error //Set的作用是加入资源限制
Apply(path string, pid int) error //将进程pid加入Cgroup中
Remove(path string) error //删除Cgroup
}
//这里创建了subsystem的三个实例,分别是CPUset,memory,CPU.
var (
SubsystemsIns = []Subsystem{
&CpusetSubSystem{},
//这里创建了一个无名的MemorySubSystem结构类型
//但上面的切片类型为Subsystem,这就有点像C++中的向上类型转换.
&MemorySubSystem{},
&CpuSubSystem{},
}
)
②MemorySubSystem
func (s *MemorySubSystem) Set(cgroupPath string, res *ResourceConfig) error
//获得Cgroup root的绝对地址
if subsysCgroupPath, err := GetCgroupPath(s.Name(), cgroupPath, true); err == nil {
if res.MemoryLimit != "" {
//将cgroup中的内存限制写入到memory.limit_in_bytes文件中
if err := ioutil.WriteFile(path.Join(subsysCgroupPath, "memory.limit_in_bytes"), []byte(res.MemoryLimit), 0644)
}
网友评论