龙空技术网

使用cgroup限制进程资源

IT随笔SC 26

前言:

现在咱们对“c语言多进程编程实例”大约比较看重,同学们都需要分析一些“c语言多进程编程实例”的相关文章。那么小编也在网络上收集了一些关于“c语言多进程编程实例””的相关文章,希望各位老铁们能喜欢,兄弟们一起来学习一下吧!

这里使用containerd项目中的cgroup包来实现进程资源限制。

先写一个耗费一个CPU并且一秒增加10m内存的测试进程

package main

import (

"fmt"

"math/rand"

"time"

)

func main() {

go func() {

for {

rand.Intn(1000000000)

}

}()

caches := [][]byte{}

for {

tempValue := make([]byte, 10240000)

for i := range tempValue {

tempValue[i] = 0x01

}

caches = append(caches, tempValue)

fmt.Println(len(caches))

time.Sleep(time.Second * 1)

}

}

这里说明一下,如果不对caches数组赋值,那么实际占用的物理内存空间不会有太大增长(查看top命令的res列)

现在提供一下主程序

package main

import (

"fmt"

"os/exec"

"github.com/chaolihf/udpgo/lang"

"github.com/containerd/cgroups/v3/cgroup1"

"github.com/opencontainers/runtime-spec/specs-go"

"go.uber.org/zap"

)

var logger *zap.Logger

func init() {

logger = lang.InitProductLogger("logs/agent.log", 100, 5, 10)

}

func main() {

shares := uint64(20)

period := uint64(1000000)

quota := int64(200000)

memory := int64(10000000)

swap := int64(1000000000)

control, err := cgroup1.New(cgroup1.StaticPath("/test"), &specs.LinuxResources{

CPU: &specs.LinuxCPU{

Shares: &shares,

Quota: &quota,

Period: &period,

},

Memory: &specs.LinuxMemory{

Limit: &memory,

Swap: &swap,

},

})

if err != nil {

logger.Error(err.Error())

} else {

defer control.Delete()

cmd := exec.Command("./mock/mock")

if err := cmd.Start(); err != nil {

fmt.Println("Error:", err)

return

}

if err := control.Add(cgroup1.Process{Pid: cmd.Process.Pid}); err != nil {

logger.Error(err.Error())

}

logger.Info("add")

}

}

这里有以下注意点

1、CPU限制必须使用Period和quota参数,表示一个周期period1000000微秒也就是1秒里面可以使用份额quota为200000微秒也就是0.2秒,也就是一个核的20%

2、内存限制limit为物理内存限制,swap是物理内存加交换区,并且设置swap必须设置limit并且大于limit否则会提示非法的参数错误

3、limit物理内存会看到top的res不会超过10m,如果超过就会增加虚拟内存(virt中体现),并且可以看到swap量增加。如果超过swap限制就会出现oom,可以在var/log/message中看到

标签: #c语言多进程编程实例