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

使用cgroup限制进程资源

ruisui885个月前 (01-10)技术分析41

这里使用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限制进程资源” 的相关文章

Beta版Linux Mint“Xia”发行版22.1发布

IT之家 12 月 13 日消息,Beta 版 Linux Mint“Xia” 22.1 昨日(12 月 12 日)发布,新版本基于 Ubuntu 24.04,内核版本为 Linux 6.8,长期支持将持续到 2029 年,为用户提供可靠稳定的使用体验。新版本在软件包管理方面,主要弃用了传统的 ap...

react hooks自定义组件居然能这样做

前言  这里写一下如何封装可复用组件。首先技术栈 react hooks + props-type + jsx封装纯函数组件。类组件和typeScript在这不做讨论,大家别白跑一趟。接下来会说一下封装可复用组件的思路,比如一个新手应该怎么去封装,都需要有哪些东西。  然后说一些复杂组件需要的功能,...

HTML5最新版本介绍

HTML5是HTML4.01和XHTML1.0之后超文本标记语言的最新版本,由一群自由思想者设计,最终实现了多媒体支持、交互性、更智能的表单和更好的语义标注。 HTML 5不只是 HTML规范的最新版本,它是用于生成现代 Web内容的一系列相关技术的总称,其中最重要的三个技术是:HTML5核心规范...

全新斯柯达柯珞克Karoq深度评测:大众替代品

“斯柯达柯珞克是一款出色的全能家庭 SUV,具有许多有用的功能”价格36,605 英镑- 49,190 英镑优点方便的 VarioFlex 后排座椅非常适合家庭入住驾驶乐趣缺点保修期短保守的内饰性格比Yeti少结论——斯柯达柯珞克是一辆好车吗?斯柯达柯珞克是在辉煌的七座 斯柯达柯迪亚克之后推出的,因...

关于Vue页面跳转传参,参数不同, 但页面只获取参数一次的问题

#头条创作挑战赛#1.问题描述问题描述: element 展示表格(页面A),点击表格的每一行的查看详情按钮,可以携带此行的信息参数跳转到另一个页面(页面B),但是从A页面到B页面,只有第一次跳转的时候B页面可以获取到A页面的参数,返回再次A->B ,B页面无法获取到参数。2.解决办法:方法一...

三勾知识付费(PHP+vue3)微信小程序平台+SAAS+前后端源码

项目介绍三勾小程序商城基于thinkphp8+element-plus+uniapp打造的面向开发的小程序商城,方便二次开发或直接使用,可发布到多端,包括微信小程序、微信公众号、QQ小程序、支付宝小程序、字节跳动小程序、百度小程序、android端、ios端。软件架构后端:thinkphp8 管理端...