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系统进行限制,这是一个大页文件系统

相互关系

  1. 每次在系统中创建新层级时,该系统中的所有任务都是那个层级的默认cgroup(root cgroup,此cgroup在创建层级时自动创建,后面在该层级中创建的cgroup都是此cgroup的后代)的初始成员。
  2. 一个子系统最多只能附加到一个层级
  3. 一个层级可以附加多个子系统
  4. 一个任务可以是多个cgroup的成员,但是这些cgroup必须在不同的层级
  5. 系统中的进程(任务)创建子进程(任务)时,该子任务自动成为其父进程所在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入门的更多相关文章

  1. Linux Cgroup 入门教程:cpuset

    这是 Cgroup 系列的第四篇,往期回顾: Linux Cgroup 入门教程:基本概念 Linux Cgroup 入门教程:CPU Linux Cgroup 入门教程:内存 通过上篇文章的学习,我 ...

  2. IT技术学习指导之Linux系统入门的4个阶段(纯干货带图)

    IT技术学习指导之Linux系统入门的4个阶段(纯干货带图) 全世界60%的人都在使用Linux.几乎没有人没有受到Linux系统的"恩惠",我们享受的大量服务(包括网页服务.聊天 ...

  3. Linux 基础入门(新版)”实验报告一~十二

    实验报告 日期: 2015年9月15日 一.实验的目的与要求 熟练地使用 Linux,本实验介绍 Linux 基本操作,shell 环境下的常用命令. 二.主要内容 1.Linux 基础入门& ...

  4. Linux基础入门学习笔记20135227黄晓妍

    学习计时:共24小时 读书:1小时 代码:8小时 作业:3小时 博客:12小时 一.学习目标 1. 能够独立安装Linux操作系统   2. 能够熟练使用Linux系统的基本命令   3. 熟练使用L ...

  5. Linux 基础入门 第二周9.21~9.27

    一.学习内容 本周主要学习内容主要贴合: 在进行<深入理解计算机系统>这门课的实验中没有遇到什么大问题,学习内容与上周实验<linux基础入门>有相似之处.本实验中的内容比较贴 ...

  6. [转载] linux cgroup

    原文: http://coolshell.cn/articles/17049.html 感谢左耳朵耗子的精彩文章. 前面,我们介绍了Linux Namespace,但是Namespace解决的问题主要 ...

  7. Docker基础技术:Linux CGroup

    前面,我们介绍了Linux Namespace,但是Namespace解决的问题主要是环境隔离的问题,这只是虚拟化中最最基础的一步,我们还需要解决对计算机资源使用上的隔离.也就是说,虽然你通过Name ...

  8. 【转载】茶叶蛋干货!《超容易的Linux系统管理入门书》(连载十)进行动态主机配置DHCP

    使用动态主机配置协议DHCP(Dynamic Host Configuration Protocol)则可以避免网络参数变化后一些繁琐的配置,客户端可以从DHCP服务端检索相关信息并完成相关网络配置, ...

  9. 【转载】绝对干货!Linux小白最佳实践:《超容易的Linux系统管理入门书》(连载九)如何通过源代码安装软件

    除了使用Linux的包管理机制进行软件的安装.更新和卸载,从源代码进行软件的安装也是非常常见的,开源软件提供了源代码包,开发者可以方便的通过源代码进行安装.从源码安装软件一般经过软件配置.编译软件.执 ...

随机推荐

  1. [linux]makefile多目录

    在使用makefile多目录编写前需要掌握几个函数及符号 自定义变量 target=edit 引用的时候直接使用 $(target) 有点像C语言中的#define,这里的 $(target)会被替换 ...

  2. JavaScript--总结一(变量+数据类型+运算符)

    JavaScript是什么? 是一门脚本语言(不需要编译,直接执行) 是一门解释性语言 是一门动态类型的语言 是一门基于对象的语言 JavaScript分为三个部分 1.ECMAScript  标准- ...

  3. ThinkPHP的url简化

    TP的url请求简化 下面是apache的配置过程,可以参考: 1.       httpd.conf 配置文件中加载了mod_rewrite.so模块 2.       AllowOverride ...

  4. python学习笔记 | PyCharm创建文件时自动添加头文件

    File Settings Editor File and Code Templates Python Script 然后在右边的框中写入信息就可以啦: # -*- coding: utf-8 -*- ...

  5. requests +httprunne r

    1.get 请求和 post 请求的区别是什么?  2.requests 模拟 get 请求时,有哪两种方式让响应的结果不是乱码?(直接代码描述)  3.requests 库中的 post 方法,参数 ...

  6. Azure Terraform(五)利用Azure DevOps 实现自动化部署基础资源

    一,引言 上一篇我们结合学习 Azure Traffic Manger 的内容,做了一个负载均衡的基础设施架构.通过 Terraform 部署执行计划,将整个 Azure Traffic Manage ...

  7. kubernets之服务发现

    一  服务与pod的发现 1.1  服务发现pod是很显而易见的事情,通过简称pod的标签是否和服务的标签一致即可,但是pod是如何发现服务的呢?这个问题其实感觉比较多余,但是接下来你就可能不这么想了 ...

  8. thinkpad8平板安装win10系统

    ThinkPad8 因为是平板电脑,只有一个micro USB接口,常规安装没法使用鼠标或键盘进行输入,所以难倒很多人. 幸好前段时间买了根otg线和3.0usb hub,安装方法记录如下: 准备:U ...

  9. fileinput模块用法

    fileinput模块功能: 提供拼接一个或多个文本文件的功能,可以通过使用for循环来读取一个或多个文本文件的所有行,从而进行逐行处理(如进行显示.替换.添加行号等). 其功能类似于linux命令的 ...

  10. Nginx和Tomcat配置SSL实现https访问

    环境:CentOS 7 Nginx版本: nginx/1.18.0 1. 安装nginx 详细步骤可以参考如下官网:http://nginx.org/en/linux_packages.html#RH ...