linux中cgroup的简单使用

news2024/11/26 0:57:30

文章目录

  • 1 简介
    • 1.1 主要功能
    • 1.2 cgroups子系统
  • 2 绑定进程到指定cpu核数
  • 3 限制进程cpu使用率
    • 3.1 示例1
    • 3.2 示例2
  • 4 限制内存使用量
  • 5 限制磁盘读取速度

1 简介

Linux CGroup全称Linux Control Group, 是Linux内核的一个功能,用来限制,控制与分离一个进程组群的资源(如CPU、内存、磁盘输入输出等)。这个项目最早是由Google的工程师在2006年发起(主要是Paul Menage和Rohit Seth),最早的名称为进程容器(process containers)。在2007年时,因为在Linux内核中,容器(container)这个名词太过广泛,为避免混乱,被重命名为cgroup,并且被合并到2.6.24版的内核中去。然后,其它开始了他的发展。

Linux CGroupCgroup 可为系统中所运行任务(进程)的用户定义组群分配资源—比如CPU 时间、系统内存、网络带宽或者这些资源的组合。可以监控配置的​​​ cgroup,拒绝cgroup 访问某些资源,甚至在运行的系统中动态配置cgroup。

1.1 主要功能

(1)限制资源使用,比如内存使用上限以及文件系统的缓存限制。

(2)优先级控制,CPU利用和磁盘IO吞吐。

(3)一些审计或一些统计,主要目的是为了计费。

(4)挂起进程,恢复执行进程。

1.2 cgroups子系统

Cgroups(Control Groups)基于进程的限制,而非用户,因此对于超户运行的进程也是一样;

cgroups子系统:

  1. blkio 限制每个块设备的输入输出控制。例如:磁盘,光盘以及usb。
  2. cpu 限制使用cpu比例
  3. cpuacct 产生cgroup任务的cpu资源报告。
  4. cpuset 多核心的cpu时为cgroup任务分配单独的cpu和内存 绑定进程和cpu减少上下文切换 内存访问情况 就近访问内存
  5. devices 允许或拒绝对设备的访问。
  6. freezer 暂停和恢复cgroup任务。
  7. memory 设置内存限制以及产生内存资源报告。
  8. net_cls 可以标记 cgroups 中进程的网络数据包,然后可以使用 tc 模块(traffic control)对数据包进行控制。
  9. net_prio — 这个子系统用来设计网络流量的优先级。

10.ns 可以使不同 cgroups 下面的进程使用不同的 namespace。

11.hugetlb — 这个子系统主要针对于HugeTLB系统进行限制,这是一个大页文件系统。
在这里插入图片描述

2 绑定进程到指定cpu核数

#yum安装
yum install libcgroup libcgroup-tools  numactl  -y
#获取CPU线程数
grep 'processor' /proc/cpuinfo | sort -u | wc -l
#获取CPU NUMA内存节点信息
numactl --hardware
或
lscpu | grep NUMA

在这里插入图片描述

#创建设置small组策略 4核
cgcreate -g cpuset:small
cgset -r cpuset.cpus=0-3 small
cgset -r cpuset.mems=0 small
 
#创建设置large组策略 8核
cgcreate -g cpuset:large
cgset -r cpuset.cpus=0-7 large
cgset -r cpuset.mems=0 large

默认的cpuset.cpus和cpuset.mems是空的;需要同时设定这2个值,其中mems的值参考numa的node数字,上面通过numactl --hardware查到是0

注意:

  1. cpuset子系统是有两个参数是强制要求定义的,cpuset.cpus和cpuset.mems。

cpuset.cpus(强制)

指定允许这个cgroup 中任务访问的CPU。这是一个用逗号分开的列表,格式为ASCII,使​用小横线(”-”)代表范围。​

cpuset.mems(强制)

指定允许这个cgroup 中任务可访问的内存节点。这是一个用逗号分开的列表,格式​​​为ASCII,使用小横线(”-”)代表范围。

  1. 对于多线程的程序,该方法不生效;
  2. 配置完在/sys/fs/cgroup/cpuset目录会出现smal,large目录。

运行命令

cgexec -g cpuset:small 程序运行命令
cgexec -g cpuset:large 程序运行命令

#示例

#编写一个消耗cpu的脚本

vi t1.sh
#/bin/bash
x=0
while [ True ];do
    x=$x+1
done;

#限制程序运行在固定cpu核数上

#cgexec -g cpuset:small sh t1.sh &

#运行top命令,然后按1,可以看到每个cpu核数的情况

3 限制进程cpu使用率

3.1 示例1

#yum安装
yum install libcgroup libcgroup-tools  numactl  -y
systemctl status cgconfig.service
systemctl start cgconfig.service
#查看cgroup挂载点(centos7.7),此处可参见cgroups子系统
lssubsys -am

在这里插入图片描述

#创建隔离组
cd /sys/fs/cgroup/cpu
mkdir cpu_test
说明:目录创建完成会自动生成以下文件(注:该目录无法手动删除,如果不加入开机自启,重启后会消失)
ls cpu_test/

在这里插入图片描述

#跑一个耗cpu的脚本
vi t1.sh
/bin/bash
x=0
while [ True ];do
    x=$x+1
done;
chmod +x t1.sh
sh t1.sh  &

在这里插入图片描述

#修改参数
echo 20000 > /sys/fs/cgroup/cpu/cpu_test/cpu.cfs_quota_us
注:默认-1不限制,现在改成20000,是将cpu.cfs_quota_us设为20000,相对于cpu.cfs_period_us的100000是20%;可以理解cpu使用率限制在20%;
 
#找到进程号增加到cpu tasks里面,在看top,cpu使用率很快就下来
echo 2938 >> /sys/fs/cgroup/cpu/cpu_test/tasks

在这里插入图片描述

说明:在上面的情况下,如果将三个进程pid都写入到tasks,会出现三个进程共享20%cpu的情况;

在这里插入图片描述

3.2 示例2

说明:该部分内容补充示例1,使用命令创建控制群组;

#创建控制群组
cgcreate -g cpu:/g1
说明:这个命令会创建/sys/fs/cgroup/cpu/g1目录出来,在这个目录下有各种cgroup cpu的配置文件;
 
#设置CPU限制参数
cgset -r cpu.cfs_quota_us=20000 g1
#查看是否设置成功
cgget -r cpu.cfs_quota_us g1
 
#启动进程,通过top可以看到cpu占用100%,同时拿到进程pid:2231
cat t1.sh
/bin/bash
x=0
while [ True ];do
    x=$x+1
done;
sh  /tmp/t1.sh  &
 
#将此进程加入控制群组g1
cgclassify -g cpu:/g1 2231
cat /sys/fs/cgroup/cpu/g1/tasks

通过top看,cpu消耗变成了20%
注意:最好将一个进程写在一个控制组内;将多个进程写在一个控制组会共享cpu限制;
如:在一个控制组内写入3个进程,cpu限制使用为20%,每个进程大概会占6%左右;

4 限制内存使用量

#创建控制群组g2
cgcreate -g memory:g2
 
#查看默认内存是没有限制的
cgget -r memory.limit_in_bytes g2
 
#限制内存只有1GB
cgset -r memory.limit_in_bytes=1073741824 g2
 
#执行/tmp/highmemory.sh,进程号是21127 
vi /tmp/highmem.sh
/bin/bash
x="a"
while [ True ];do
    x=$x$x
done;
 
#将highmemory.sh进程加入g2的控制
cgclassify -g memory:g2 21127

5 限制磁盘读取速度

#要控制/dev/sdb的磁盘,通过下述命令查到磁盘驱动号8,16
ls -l /dev/sdb

在这里插入图片描述

#创建控制组,设定8,16磁盘有1MB的读取限制
cgcreate -g blkio:g1
cgset -r blkio.throttle.read_bps_device='8:16 10485760' g1
 
#启动读取测试命令,拿到pid 14468
dd if=/dev/sdb of=/dev/null
 
#通过命令可以看到对磁盘读写速度的消耗
iotop
 
#将进程加入g1控制组后,读取速度被限制
cgclassify -g blkio:g1 14468

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/778610.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

fastadmin 项目gitee管理

gitee创建一个仓库使用sourcetree等工具拉取代码使用phpstorm远程同步代码到本地设置忽略代码文件 注意:如果是直接把远程代码同步到本地,默认是你在 .gitignore中设置是无效的,代码一样会提交,需要先使用上面的截图去掉缓存&…

进程控制学习笔记

文章目录 进程退出孤儿进程僵尸进程进程回收waitpid()函数 进程退出 子进程的退出需要父进程对其资源的释放,子进程只能对用户区的数据进行释放,无法完成对内核区的释放。 可以获取到。 两个退出的区别: 系统调用不会刷新缓冲区&#xff…

【人工智能】神经网络、M-P_神经元模型、激活函数、神经网络结构、学习网络参数、代价定义、总代价

M-P_神经元模型、激活函数、神经网络结构、学习网络参数、代价定义 文章目录 M-P_神经元模型、激活函数、神经网络结构、学习网络参数、代价定义M-P 神经元模型激活函数(Activation function)神经网络结构举例训练神经网络学习网络参数代价定义均方误差交叉熵(Cross Entropy)…

html input 展示隐藏的密码

<!DOCTYPE html> <html> <meta http-equiv"Content-Type" content"text/html;charsetutf-8"/> <body><h2>登录表格</h2><form action"/action_page.php"><div class"container"><…

vue3-element-plus,控制表格多选的数量

1. 需求描述 控制表格的多选&#xff0c;最多只能选择5条数据&#xff0c;并且其他项禁用 2. 需求描述 <!-- selection-change 当选择项发生变化时会触发该事件--><template><el-tableref"multipleTableRef"v-loading"loading":data"…

微服务基础理论

微服务简介 微服务Microservices之父&#xff0c;马丁.福勒&#xff0c;对微服务大概的概述如下&#xff1a; 就目前而言&#xff0c;对于微服务业界并没有一个统一的、标准的定义&#xff08;While there is no precise definition of this architectural style ) 。但通在其…

flutter开发实战-build编译macos环境可安装dmg

flutter开发实战-build编译macos环境可安装dmg 之前开发中需要变异Macos成dmg的需求&#xff0c;这里记录一下build编译macos环境可安装dmg的过程。 一、工程目录 目录如下 如果工程没有macos&#xff0c;需要增加macos支持的平台。命令 flutter create --platformswindo…

Python爬虫+数据可视化:分析唯品会商品数据

目录 前言数据来源分析1. 明确需求2. 抓包分析&#xff1a;通过浏览器自带工具: 开发者工具 代码实现步骤: 发送请求 -> 获取数据 -> 解析数据 -> 保存数据发送请求解析数据保存数据 数据可视化先读取数据泳衣商品性别占比商品品牌分布占比各大品牌商品售价平均价格各…

华为数通HCIP-ISIS基础

IS-IS的基本概念 isis&#xff08;中间系统到中间路由协议&#xff09; 链路状态路由协议、IGP、无类路由协议&#xff1b; IS-IS是一种链路状态路由协议&#xff0c;IS-IS与OSPF在许多方面非常相似:运行IS-IS协议的直连设备之间通过发送Hello报文发现彼此&#xff0c;然后建…

每日一道面试题之HashSet的实现原理~

HashSet是Java中的一个集合类&#xff0c;它实现了Set接口(如下所示为源码)&#xff0c;它用于存储不重复的元素。HashSet的实现原理主要基于哈希表&#xff08;Hash Table&#xff09;&#xff0c;其内部使用了一个HashMap来存储元素&#xff0c;其数据存储结构是数组链表。在…

数学建模学习(1):Matlab函数

逻辑基础 1.逻辑变量 Logical类型: true(真值); false(假值) atrue bfalse 2.逻辑判定 数字逻辑&#xff1a; 常用的特殊逻辑&#xff1a; 3.逻辑运算 交叉知识-扩充优先级 优先级 符号 1&#xff08;最高&#xff09; 括号( ) 2 转置 ’ &#xff1b;次幂 ^ 3 一元…

svo1论文

SVO: Fast Semi-Direct Monocular Visual Odometry 摘要 我们提出了一种半直接单目视觉测距算法&#xff0c;该算法精确、鲁棒且比当前算法更快最先进的方法。半直接方法为运动估计技术消除了需要高成本的特征提取和鲁棒匹配。我们的算法可直接在像素强度上处理&#xff0c;以…

【C++初阶】---C++入门篇

文章目录 前言&#x1f31f;一、C历史介绍&#x1f31f;二、命名空间&#x1f30f;2.1.C与C对比&#x1f30f;2.2.命名空间的引入&#x1f30f;2.3.命名空间定义&#x1f30f;2.4.命名空间的使用&#x1f30f;2.5.对上述C与C对比中的第二个不同点的解释&#xff1a; &#x1f3…

基于有序模式的度量对多变量时间序列进行非线性分析研究(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f308;4 Matlab代码实现 &#x1f4a5;1 概述 基于有序模式的度量&#xff08;Ordinal Pattern-based Measures&#xff09;是一种用于多变量时间序列非线性分析的方法。它可以通过分析时间…

【C++】医学影像PACS管理系统源码支持三维图像后处理和重建

前言&#xff1a;随着计算机科学与医疗设备的迅猛发展&#xff0c;数字化图像技术与现代通讯及计算机技术相结合&#xff0c;形成了PACS (picture archiving and communication system影像储存与传输系统)。它将医学图像资料转化为数字信息通过高速计算机设备及通讯网络&#x…

剑指offer51.数组中的逆序对

用类似于归并排序的方法解决这道题&#xff0c;把数组分成左右两个数组&#xff0c;然后归并排序&#xff0c;在排序的过程中统计逆序对的个数 class Solution {int[] nums, tmp;public int reversePairs(int[] nums) {this.nums nums;tmp new int[nums.length];return merge…

C# List 详解五

目录 26.GetType() 27.IndexOf(T) 28.IndexOf(T, Int32) 29.IndexOf(T, Int32, Int32) 30.Insert(Int32, T) 31.InsertRange(Int32, IEnumerable) 32.LastIndexOf(T) 33.LastIndexOf(T, Int32) 34.LastIndexOf(T, Int32, Int32) …

阿里云效搭建github的前端流水线

先构建一个vue项目&#xff0c;新建一个node模板&#xff0c;配置流水线源&#xff0c;按照说明一步步配置就可以了&#xff0c;最好开始webhook 复制webhook地址&#xff0c;添加入github仓库的settings的webhooks中&#xff0c;Content type设置为json 流水线源设置好了之后…

什么是HTTP 500错误,怎么解决

目录 什么是HTTP 500 HTTP 500错误的常见原因&#xff1a; 如何修复HTTP 500 总结 什么是HTTP 500 错误 HTTP 500内部服务器错误是指在客户端发出请求后&#xff0c;服务器在处理请求过程中发生了未知的问题&#xff0c;导致服务器无法完成请求。HTTP 500错误是一个通用的服…

毕业!第六章 贪心(一、二)——区间问题,Huffman树,不等式与推公式

文章目录 区间问题905. 区间选点908. 最大不相交区间数量906. 区间分组907. 区间覆盖 Huffman树148. 合并果子 排序不等式913. 排队打水 绝对值不等式104. 货仓选址 推公式125. 耍杂技的牛 6.18~7.22完成算法基础的学习&#xff0c;剩下时间用来暴刷《算法竞赛指南》以巩固基础…