当前位置:首页 > 技术分析 > 正文内容

使用cgroup限制进程资源

ruisui884个月前 (01-10)技术分析24

这里使用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中看到

扫描二维码推送至手机访问。

版权声明:本文由ruisui88发布,如需转载请注明出处。

本文链接:http://www.ruisui88.com/post/138.html

标签: top res
分享给朋友:

“使用cgroup限制进程资源” 的相关文章

vue中组件之间的通信方式

** 1.1 父子组件**a. 父向子传数据: 第1种: 父通过属性传值,子组件通过props接收数据(注:props传过来的数据是单向的,不可以进行修改)第2种:子组件可以通过$parent来获取父组件里的数据和调用父组件的方法(注:数据是双向的,还要注意如用了UI组件并且在该UI组件里重新定义一...

Windows 下 Git 拉 Gitlab 代码

读者提问:『阿常你好,Windows 下 Git 拉 Gitlab 代码的操作步骤可以分享一下吗?』阿常回答:好的,总共分为五个步骤。一、Windows 下安装 Git官网下载链接:https://git-scm.com/download/winStandalone Installer(安装版)注意...

壹啦罐罐 Android 手机里的 Xposed 都装了啥

这是少数派推出的系列专题,叫做「我的手机里都装了啥」。这个系列将邀请到不同的玩家,从他们各自的角度介绍手机中最爱的或是日常使用最频繁的 App。文章将以「每周一篇」的频率更新,内容范围会包括 iOS、Android 在内的各种平台和 App。本期继续歪楼,由少数派撰稿作者@壹啦罐罐介绍他正在使用的...

2024最新版:前端性能优化方案汇总

前端训练营:1v1私教,终身辅导计划,帮你拿到满意的 offer。 已帮助数百位同学拿到了中大厂 offer。欢迎来撩~~~~~~~~Hello,大家好,我是 Sunday。前端性能优化一直是很多同学非常关注的问题,在日常的面试中也是经常会被问到的点。所以今天咱们就花一点时间来了解一下2024最新的...

深度解析!AI智能体在To B领域应用,汽车售后服务落地全攻略

在汽车售后服务领域,AI智能体的应用正带来一场效率和专业度的革命。本文深度解析了一个AI智能体在To B领域的实际应用案例,介绍了AI智能体如何通过提升服务顾问和维修技师的专业度及维修效率,优化汽车售后服务流程。上周我分享了AI智能体+AI小程序To C的AI应用场景《1000%增长!我仅用一个小时...

js中数组filter方法的使用和实现

定义filter() 方法创建一个新数组, 其包含通过所提供函数实现的测试的所有元素。语法var newArray = arr.filter(callback(element[, index[, selfArr]])[, thisArg])参数callback循环数组每个元素时调用的回调函数。回调函...