cgroup

package module
v0.0.10 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Dec 7, 2022 License: Apache-2.0 Imports: 12 Imported by: 1

README

cgroup

a go library to control cgroup

Usage

import

go get github.com/realjf/cgroup

cgroup v1 example

import (
 "fmt"
 "os"
 "sync"

 "github.com/realjf/utils"
 "github.com/sirupsen/logrus"

 "github.com/realjf/cgroup"
)

type Limiter struct {
 cg cgroup.ICgroup
 wg sync.WaitGroup
}

func main() {
 limiter := &Limiter{
  wg: sync.WaitGroup{},
 }

 var err error

 limiter.cg, err = cgroup.NewCgroup(cgroup.V1, cgroup.WithName("test"))
 if err != nil {
  logrus.Println(err.Error())
  return
 }
 defer func() {
  err = limiter.cg.Close()
  if err != nil {
   logrus.Println(err.Error())
   return
  }
 }()
 // limit
 limiter.cg.SetOptions(cgroup.WithCPULimit(80))                      // cpu usage limit 80%
 limiter.cg.SetOptions(cgroup.WithMemoryLimit(20 * cgroup.Megabyte)) // memory limit 8MB
 limiter.cg.SetOptions(cgroup.WithDisableOOMKiller())                // disable oom killer

 err = limiter.cg.Create()
 if err != nil {
  logrus.Println(err.Error())
  return
 }
 // limit by pid
 pid := os.Getpid()
 logrus.Printf("limit pid: %d\n", pid)
 err = limiter.cg.LimitPid(pid)
 if err != nil {
  logrus.Println(err.Error())
  return
 }
 wpids, err := limiter.cg.GetLimitPids()
 if err != nil {
  logrus.Println(err.Error())
  return
 }
 logrus.Printf("limit pid now: %v\n", wpids)
 limiter.wg.Add(1)
 go limiter.command()

 limiter.wg.Wait()

 logrus.Println("done")
}

func (l *Limiter) command() {
 defer func() {
  l.wg.Done()
 }()
 cmd := utils.NewCmd().SetDebug(true)
 defer cmd.Close()

 var err error
 err = cmd.SetUsername(os.Getenv("SUDO_USER"))
 if err != 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...)
 if err != nil {
  fmt.Println(err.Error())
  return
 }

 out, err := cmd.Run()
 if err != 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"
)

type Limiter struct {
 cg cgroup.ICgroup
 wg sync.WaitGroup
}

func main() {
 limiter := &Limiter{
  wg: sync.WaitGroup{},
 }

 var err error

 limiter.cg, err = cgroup.NewCgroup(cgroup.V2, cgroup.WithSlice("/"), cgroup.WithGroup("mycgroup.slice"))
 if err != nil {
  logrus.Println(err.Error())
  return
 }
 defer func() {
  err = limiter.cg.Close()
  if err != nil {
   logrus.Println(err.Error())
   return
  }
 }()
 // limit
 limiter.cg.SetOptions(cgroup.WithCPULimit(80))                      // cpu usage limit 80%
 limiter.cg.SetOptions(cgroup.WithMemoryLimit(20 * cgroup.Megabyte)) // memory limit 8MB
 limiter.cg.SetOptions(cgroup.WithDisableOOMKiller())                // disable oom killer

 err = limiter.cg.Create()
 if err != nil {
  logrus.Println(err.Error())
  return
 }
 // limit by pid
 pid := os.Getpid()
 logrus.Printf("limit pid: %d\n", pid)
 err = limiter.cg.LimitPid(pid)
 if err != nil {
  logrus.Println(err.Error())
  return
 }
 wpids, err := limiter.cg.GetLimitPids()
 if err != nil {
  logrus.Println(err.Error())
  return
 }
 logrus.Printf("limit pid now: %v\n", wpids)
 limiter.wg.Add(1)
 go limiter.command()

 limiter.wg.Wait()

 logrus.Println("done")
}

func (l *Limiter) command() {
 defer func() {
  l.wg.Done()
 }()
 cmd := utils.NewCmd().SetDebug(true)
 defer cmd.Close()

 var err error
 err = cmd.SetUsername(os.Getenv("SUDO_USER"))
 if err != 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...)
 if err != nil {
  fmt.Println(err.Error())
  return
 }

 out, err := cmd.Run()
 if err != nil {
  fmt.Println(err.Error())
  return
 }
 fmt.Printf("%s\n", out)
}

Documentation

Index

Constants

View Source
const (
	Byte     Memory = 1
	Kilobyte        = 1024 * Byte
	Megabyte        = 1024 * Kilobyte
	Gigabyte        = 1024 * Megabyte
)

Variables

This section is empty.

Functions

func IsCgroupV2

func IsCgroupV2() bool

Types

type CgV2

type CgV2 struct {
}

type CgroupV1

type CgroupV1 interface {
	ICgroup
}

type CgroupV2

type CgroupV2 interface {
	ICgroup
}

type CgroupVersion

type CgroupVersion string
const (
	V1 CgroupVersion = "v1"
	V2 CgroupVersion = "v2"
)

func (*CgroupVersion) Set

func (e *CgroupVersion) Set(v string) error

Set must have pointer receiver so it doesn't change the value of a copy

func (*CgroupVersion) String

func (e *CgroupVersion) String() string

String is used both by fmt.Print and by Cobra in help textv

func (*CgroupVersion) Type

func (e *CgroupVersion) Type() string

Type is only used in help text

type ICgroup

type ICgroup interface {
	Create() error
	Version() CgroupVersion
	SetOptions(options ...Option)
	Instance() any
	Close() error
	Load() error
	LimitPid(pid int) error
	GetLimitPids() ([]uint64, error)
	Stats() (any, error)
	SetDebug(debug bool)
}

func NewCgroup

func NewCgroup(version CgroupVersion, options ...Option) (ICgroup, error)

type Memory

type Memory uint

Memory represents a number of bytes

type Metrics

type Metrics interface {
	*stats.Metrics | *v1.Metrics
}

type Option

type Option func(cgroup ICgroup)

func WithCPULimit

func WithCPULimit(cpuLimit Percent) Option

for cgroup v1,v2

func WithDisableOOMKiller

func WithDisableOOMKiller() Option

for cgroup v1,v2

func WithGroup

func WithGroup(group string) Option

for cgroup v2

func WithMemoryLimit

func WithMemoryLimit(memory Memory) Option

for cgroup v1,v2

func WithName

func WithName(name string) Option

for cgroup v1

func WithSlice

func WithSlice(slice string) Option

for cgroup v2

type Percent

type Percent uint

Percent is a percentage value. It is used to specify CPU rate limits.

Directories

Path Synopsis
example
v1
v2

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL