Linux CGroup入门
Linux cgroup
Linux CGroup全称Linux Control Group, 是Linux内核的一个功能,用来限制,控制与分离一个进程组群的资源(如CPU、内存、磁盘输入输出等)。Linux CGroupCgroup 可让您为系统中所运行任务(进程)的用户定义组群分配资源 — 比如 CPU 时间、系统内存、网络带宽或者这些资源的组合。您可以监控您配置的 cgroup,拒绝 cgroup 访问某些资源,甚至在运行的系统中动态配置您的 cgroup。
主要功能
- 限制资源使用:比如内存使用上限、文件系统的缓存限制
- 优先级控制:CPU利用和磁盘IO
- 挂起、恢复某些进程
相关概念
- 任务:task,任务就是一个进程
- 控制族群:control group,是一组按照某种标准划分的进程。cgroups中的资源控制都是以控制族群为单位实现。一个进程可以加入某个控制族群,也可以从一个进程组迁移到另一个控制族群。一个进程组的进程可以使用cgroups以控制族群为单位分配资源,同时受到cgroups以控制族群为单位设定的限制
- 层级:hierarchy,控制族群可以组织成hierarchical的形式,即一棵控制族群树。控制族群树上的子节点控制族群是父节点控制族群的孩子,继承父控制族群的特定的属性
- 子系统:subsystem,一个子系统就是一个资源控制器。子系统必须附加到一个层级上才能起作用,一个子系统附加到某个层级以后,这个层级上的所有控制族群都受到这个子系统的控制。
cgroup子系统
- cpu子系统:限制进程的cpu使用率
- cpuacct子系统:可以统计cgroup中的进程的cpu使用报告
- cpuset子系统:可以限制进程的memory使用量
- memory子系统:可以限制进程的块设备IO
- blkio子系统:可以控制进程能够访问某些设备
- devices子系统:可以控制进程能够访问某些设备
- net_cls子系统:可以标记cgroup中进程的网络数据包,使用tc(traffic control)模块对数据包进行控制
- net_prio子系统:设计网络流量的优先级
- freezer子系统:挂起或恢复cgroup中的进程
- ns子系统:使不同的cgroup下面的进程使用不同的namespace
- hugetlb子系统:针对于HugeTLB系统进行限制,这是一个大页文件系统
相互关系
- 每次在系统中创建新层级时,该系统中的所有任务都是那个层级的默认cgroup(root cgroup,此cgroup在创建层级时自动创建,后面在该层级中创建的cgroup都是此cgroup的后代)的初始成员。
- 一个子系统最多只能附加到一个层级
- 一个层级可以附加多个子系统
- 一个任务可以是多个cgroup的成员,但是这些cgroup必须在不同的层级
- 系统中的进程(任务)创建子进程(任务)时,该子任务自动成为其父进程所在cgroup的成员。然后可根据需要将该子任务移动到不同的cgroup中,但开始时它总是继承其父任务的cgroup。

如图所示的 CGroup 层级关系显示,CPU 和 Memory 两个子系统有自己独立的层级系统,而又通过 Task Group 取得关联。
利用cgroup查看进程
cd /proc/XXXX(PID)
cat cgroup
如下图所示:
jyroy@server3:~$ cd /proc/12055
jyroy@server3:/proc/12055$ cat cgroup
12:hugetlb:/docker/c70bfdccf2cf8a5b9108a0d2ede079c7869e5e223ba410060a9064fc09d929a8
11:blkio:/docker/c70bfdccf2cf8a5b9108a0d2ede079c7869e5e223ba410060a9064fc09d929a8
10:perf_event:/docker/c70bfdccf2cf8a5b9108a0d2ede079c7869e5e223ba410060a9064fc09d929a8
9:rdma:/
8:devices:/docker/c70bfdccf2cf8a5b9108a0d2ede079c7869e5e223ba410060a9064fc09d929a8
7:freezer:/docker/c70bfdccf2cf8a5b9108a0d2ede079c7869e5e223ba410060a9064fc09d929a8
6:cpuset:/docker/c70bfdccf2cf8a5b9108a0d2ede079c7869e5e223ba410060a9064fc09d929a8
5:memory:/docker/c70bfdccf2cf8a5b9108a0d2ede079c7869e5e223ba410060a9064fc09d929a8
4:net_cls,net_prio:/docker/c70bfdccf2cf8a5b9108a0d2ede079c7869e5e223ba410060a9064fc09d929a8
3:cpu,cpuacct:/docker/c70bfdccf2cf8a5b9108a0d2ede079c7869e5e223ba410060a9064fc09d929a8
2:pids:/docker/c70bfdccf2cf8a5b9108a0d2ede079c7869e5e223ba410060a9064fc09d929a8
1:name=systemd:/docker/c70bfdccf2cf8a5b9108a0d2ede079c7869e5e223ba410060a9064fc09d929a8
0::/system.slice/containerd.service
然后就可以利用docker容器的id查看docker的情况
jyroy@server3:/proc/12055$ docker ps -a | grep c70bfdc
c70bfdccf2cf pytorch-orion-dev:cu10.0-torch1.5-py36 "bash" 4 days ago Up 4 days pytorch-dev-jyroy
参考文献
CGroup介绍、应用实例及原理描述:https://www.ibm.com/developerworks/cn/linux/1506_cgroup/index.html
Linux cgroup总结:https://www.cnblogs.com/menkeyi/p/10941843.html
Linux CGroup入门的更多相关文章
- Linux Cgroup 入门教程:cpuset
这是 Cgroup 系列的第四篇,往期回顾: Linux Cgroup 入门教程:基本概念 Linux Cgroup 入门教程:CPU Linux Cgroup 入门教程:内存 通过上篇文章的学习,我 ...
- IT技术学习指导之Linux系统入门的4个阶段(纯干货带图)
IT技术学习指导之Linux系统入门的4个阶段(纯干货带图) 全世界60%的人都在使用Linux.几乎没有人没有受到Linux系统的"恩惠",我们享受的大量服务(包括网页服务.聊天 ...
- Linux 基础入门(新版)”实验报告一~十二
实验报告 日期: 2015年9月15日 一.实验的目的与要求 熟练地使用 Linux,本实验介绍 Linux 基本操作,shell 环境下的常用命令. 二.主要内容 1.Linux 基础入门& ...
- Linux基础入门学习笔记20135227黄晓妍
学习计时:共24小时 读书:1小时 代码:8小时 作业:3小时 博客:12小时 一.学习目标 1. 能够独立安装Linux操作系统 2. 能够熟练使用Linux系统的基本命令 3. 熟练使用L ...
- Linux 基础入门 第二周9.21~9.27
一.学习内容 本周主要学习内容主要贴合: 在进行<深入理解计算机系统>这门课的实验中没有遇到什么大问题,学习内容与上周实验<linux基础入门>有相似之处.本实验中的内容比较贴 ...
- [转载] linux cgroup
原文: http://coolshell.cn/articles/17049.html 感谢左耳朵耗子的精彩文章. 前面,我们介绍了Linux Namespace,但是Namespace解决的问题主要 ...
- Docker基础技术:Linux CGroup
前面,我们介绍了Linux Namespace,但是Namespace解决的问题主要是环境隔离的问题,这只是虚拟化中最最基础的一步,我们还需要解决对计算机资源使用上的隔离.也就是说,虽然你通过Name ...
- 【转载】茶叶蛋干货!《超容易的Linux系统管理入门书》(连载十)进行动态主机配置DHCP
使用动态主机配置协议DHCP(Dynamic Host Configuration Protocol)则可以避免网络参数变化后一些繁琐的配置,客户端可以从DHCP服务端检索相关信息并完成相关网络配置, ...
- 【转载】绝对干货!Linux小白最佳实践:《超容易的Linux系统管理入门书》(连载九)如何通过源代码安装软件
除了使用Linux的包管理机制进行软件的安装.更新和卸载,从源代码进行软件的安装也是非常常见的,开源软件提供了源代码包,开发者可以方便的通过源代码进行安装.从源码安装软件一般经过软件配置.编译软件.执 ...
随机推荐
- Android硬件访问服务中的HAL-查看打印的信息
JNI 向上提供本地函数,向下加载HAL文件并调用HAL的函数 HAL 负责访问驱动程序执行硬件操作. external\chromium_org\third_party\hwcplus\src\h ...
- DRF之访问权限控制和访问频率控制(节流)
权限控制 前言 用户验证用户权限,根据不同访问权限控制对不同内容的访问. 建议了解视图.token验证的内容. 使用流程 自定义访问权限类,继承BasePermission,重写has_permiss ...
- window10搭建pyspark(超级详细)
一.组件版本说明 Java JDK:1.8.0_144 spark-2.4.3-bin-hadoop2.7hadoop-2.7.7 scala-2.12.8 hadooponwindows-maste ...
- Liunx运维(十二)-Liunx系统常用内置命令
文档目录: 一.Liunx内置命令概述 二.LIunx常用内置命令实例 1.help查看内置命令帮助2.查看内置命令使用方法3.":" 占位符4. "." 与s ...
- 多图详解Go中的Channel源码
转载请声明出处哦~,本篇文章发布于luozhiyun的博客:https://www.luozhiyun.com 本文使用的go的源码时14.4 chan介绍 package main import & ...
- OpenOCD安装与使用(JTAG调试)
本文介绍openocd开源软件的安装以及搭配JTAG对Xilinx u500VC707devkit的调试 PC OS: Ubuntu20.04 LTS Target ARCH: riscv64 JTA ...
- 对Java集合的概述
前言 大部分编程语言都提供了数组来保存对象,数组是非常重要的数据结构之一.但是数组在初始化时就已经定义了数组长度,不可变,使用起来颇为麻烦.因此,Java 在 JDK 1.2 版本中添加了集合框架,用 ...
- UnityToLaya小插件-找出空格并替换
unity导出的文件中经常会出现带有空格的节点或者文件夹 而这些空格在本地开发测试过程中不会出现,当这些带有空格路径的文件需要放到网络上时,就出现问题了 所以这里写了一个简单的查找并清理空格的插件, ...
- 分装button组件引发的内存泄漏问题
这个问题其实一开始在vue里写的时候并没有注意到这一点,也没有报错,直到在react里写的时候给我报了一堆错之后,经各种磨烂之后最终找到是分装button组件的问题,既然找到问题在哪就好办了 直接先上 ...
- Linux tar压缩和解压
经常会忘记 tar 压缩和解压命令的使用,故记下来. 1. 打包压缩 tar -zcvf pack.tar.gz pack/ #打包压缩为一个.gz格式的压缩包 tar -jcvf pack.tar. ...