前言:
现在咱们对“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: "a,
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语言多进程编程实例