a go library to control cgroup
import
go get github.com/realjf/cgroupcgroup v1 example
import (
"fmt""os""sync""github.com/realjf/utils""github.com/sirupsen/logrus""github.com/realjf/cgroup"
)
typeLimiterstruct {
cg cgroup.ICgroupwg sync.WaitGroup
}
funcmain() {
limiter:=&Limiter{
wg: sync.WaitGroup{},
}
varerrerrorlimiter.cg, err=cgroup.NewCgroup(cgroup.V1, cgroup.WithName("test"))
iferr!=nil {
logrus.Println(err.Error())
return
}
deferfunc() {
err=limiter.cg.Close()
iferr!=nil {
logrus.Println(err.Error())
return
}
}()
// limitlimiter.cg.SetOptions(cgroup.WithCPULimit(80)) // cpu usage limit 80%limiter.cg.SetOptions(cgroup.WithMemoryLimit(20*cgroup.Megabyte)) // memory limit 8MBlimiter.cg.SetOptions(cgroup.WithDisableOOMKiller()) // disable oom killererr=limiter.cg.Create()
iferr!=nil {
logrus.Println(err.Error())
return
}
// limit by pidpid:=os.Getpid()
logrus.Printf("limit pid: %d\n", pid)
err=limiter.cg.LimitPid(pid)
iferr!=nil {
logrus.Println(err.Error())
return
}
wpids, err:=limiter.cg.GetLimitPids()
iferr!=nil {
logrus.Println(err.Error())
return
}
logrus.Printf("limit pid now: %v\n", wpids)
limiter.wg.Add(1)
golimiter.command()
limiter.wg.Wait()
logrus.Println("done")
}
func (l*Limiter) command() {
deferfunc() {
l.wg.Done()
}()
cmd:=utils.NewCmd().SetDebug(true)
defercmd.Close()
varerrerrorerr=cmd.SetUsername(os.Getenv("SUDO_USER"))
iferr!=nil {
fmt.Println(err.Error())
return
}
cmd.SetNoSetGroups(true)
args:= []string{"--cpu", "1", "--vm", "1", "--vm-bytes", "20M", "--timeout", "10s", "--vm-keep"}
_, err=cmd.Command("stress", args...)
iferr!=nil {
fmt.Println(err.Error())
return
}
out, err:=cmd.Run()
iferr!=nil {
fmt.Println(err.Error())
return
}
fmt.Printf("%s\n", out)
}
cgroup v2 example
import (
"fmt""os""sync""github.com/realjf/utils""github.com/sirupsen/logrus""github.com/realjf/cgroup"
)
typeLimiterstruct {
cg cgroup.ICgroupwg sync.WaitGroup
}
funcmain() {
limiter:=&Limiter{
wg: sync.WaitGroup{},
}
varerrerrorlimiter.cg, err=cgroup.NewCgroup(cgroup.V2, cgroup.WithSlice("/"), cgroup.WithGroup("mycgroup.slice"))
iferr!=nil {
logrus.Println(err.Error())
return
}
deferfunc() {
err=limiter.cg.Close()
iferr!=nil {
logrus.Println(err.Error())
return
}
}()
// limitlimiter.cg.SetOptions(cgroup.WithCPULimit(80)) // cpu usage limit 80%limiter.cg.SetOptions(cgroup.WithMemoryLimit(20*cgroup.Megabyte)) // memory limit 8MBlimiter.cg.SetOptions(cgroup.WithDisableOOMKiller()) // disable oom killererr=limiter.cg.Create()
iferr!=nil {
logrus.Println(err.Error())
return
}
// limit by pidpid:=os.Getpid()
logrus.Printf("limit pid: %d\n", pid)
err=limiter.cg.LimitPid(pid)
iferr!=nil {
logrus.Println(err.Error())
return
}
wpids, err:=limiter.cg.GetLimitPids()
iferr!=nil {
logrus.Println(err.Error())
return
}
logrus.Printf("limit pid now: %v\n", wpids)
limiter.wg.Add(1)
golimiter.command()
limiter.wg.Wait()
logrus.Println("done")
}
func (l*Limiter) command() {
deferfunc() {
l.wg.Done()
}()
cmd:=utils.NewCmd().SetDebug(true)
defercmd.Close()
varerrerrorerr=cmd.SetUsername(os.Getenv("SUDO_USER"))
iferr!=nil {
fmt.Println(err.Error())
return
}
cmd.SetNoSetGroups(true)
args:= []string{"--cpu", "1", "--vm", "1", "--vm-bytes", "20M", "--timeout", "10s", "--vm-keep"}
_, err=cmd.Command("stress", args...)
iferr!=nil {
fmt.Println(err.Error())
return
}
out, err:=cmd.Run()
iferr!=nil {
fmt.Println(err.Error())
return
}
fmt.Printf("%s\n", out)
}