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

使用cgroup限制进程资源

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

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

博信股份新战略后再推新品 TOPPERS E2耳机售价199元

中新网6月21日电 20日,博信股份在北京正式推出新品TOPPERS主动降噪耳机E2,这是博信股份继2月战略暨新品发布会后的第二次新品亮相。价格方面,TOPPERS主动降噪耳机E2零售价199元,并于6月20日下午4点在京东商城公开销售。据介绍,TOPPERS主动降噪耳机E2采用AMS(奥地利微电子...

美国民众负债累累 但今年假期消费者支出仍将创下新高

智通财经APP获悉,在迎接假期之际,许多美国人已经背负了创纪录的信用卡债务。然而,今年假期消费者支出仍将创下新高。根据美国零售联合会(NRF)上周发布的报告,预计今年11月1日至12月31日期间的消费总额将达到创纪录的9795亿至9890亿美元之间。NRF首席经济学家Jack Kleinhenz表示...

双子座应用程序推出模型切换器以在Android上访问2.0

#头条精品计划# 快速导读谷歌推出了Gemini 2.0 Flash实验版,现已在其安卓应用中可用,之前仅在gemini.google.com网站上提供。新版本的15.50包含模型切换器,用户可以在设置中选择不同模型,包括1.5 Pro、1.5 Flash和2.0 Flash实验版。谷歌提醒,2.0...

vue3使用vue-router路由(路由懒加载、路由传参)

vue-router 是 vue的一个插件库1. 专门用来实现一个SPA单页面应用2 .基于vue的项目基本都会用到此库SPA的理解1) 单页Web应用(single page web application,SPA)2) 整个应用只有一个完整的页面3) 点击页面中的链接不会刷新页面, 本身也不会向...

Vue页面传参详解

一、两种方式方法1:name跳转页面this.$router.push({name:'anotherPage',params:{id:1}})另一页面接收参数方式:this.$route.params.id示例:控制台展示:方法2:path跳转页面this.$router.push(...

Vue进阶(二十六):详解router.push()

在Vue2.0路由跳转中,除了使用 <router-link> 声明式创建 a 标签来定义导航链接,还可以借助 router 的实例方法,通过编码式编写代码来实现。router.push(location)想要导航到不同的 URL,则使用 router.push 方法。这个方法会向 hi...