Cgroup学习笔记

  cgroups 系统是 Linux 内核提供的一个基于进程组的资源管理的框架,可以为特定的进程组限定可以使用的资源。其具体介绍可以参考周明耀先生的CGroup 例及原理描述1,该文详细讲述了cgroup的概念、结构、原理,并给出了应用实例,是不可多得的精品级入门文档,因此建议移步学习,其内容在此也不作复述。

  本文主要解答对cgroup的认知和运用上的一些常见问题。

1. namespace与hierarchy、cgroup是什么关系,容器=层级?

  为了更好的理解他们的关系,我们先看一下曹江华先生的Linux 容器的建立和简单管理2中对cgroup子系统的介绍,其中提到了这样一个子系统——ns:

  ns 子系统提供了一个将进程分组到不同名称空间的方法。在具体名称空间中,进程可彼此互动,但会与在其它名称空间中运行的进程隔绝。这些分开的名称空间在用于操作系统级别的虚拟化时,有时也称之为容器。

  可见,容器和层级并没有直接的关系,容器在cgroup系统中只是作为一个子系统(资源管理器)为hierarchy中的进程划分命名空间,将之隔离开来。

  值得一提的是,提到ns子系统的文章都是2013年之前的,这是因为在2013年linux内核中的cgroup功能做了很多改动,直接把ns子系统剔除了。参考Wiki中提到的:

Redesign of cgroups started in 2013, with additional changes brought by versions 3.15 and 3.16 of the Linux kernel.……The "ns" subsystem was added early in cgroups development to integrate namespaces and control groups. If the "ns" cgroup was mounted, each namespace would also create a new group in the cgroup hierarchy. This was an experiment that was later judged to be a poor fit for the cgroups API, and removed from the kernel.

  为什么要剔除ns子系统呢?笔者的理解是这样的,用过cgroup的人会清楚,cgroup就是对系统资源进行分配,而容器不仅对进程使用的资源做隔离,还要禁止不同容器间进程的通信,这超出了cgroup的职责范围,使其功能变得更加复杂和紊乱。因此,容器不再由cgroup管理,而是交由其他技术实现了。

2. cgroup有没有ID?单个cgroup可在不同hierarchy中重复吗?

  cgroup没有ID,不过有指向hierarchy(结构体)的指针和指向top-cgroup的指针,还包含有分别组织起兄弟cgroup和子cgroup的链表的表头,因此每个cgroup在系统中都是唯一的。

  Hierarchy本质上是文件系统中的一个目录结构,cgroup在hierarchy中是以目录的形式存在的,不同的hierarchy中的cgroup均是不同的目录,目录中包含的是该cgroup和该hierarchy子系统的一系列配置文件,以及子cgroup。

3. hierarchy与subsystem的关系

  hierarchy可有多个不同的subsystem依附,如cpu、memory同时依附;一个subsystem只能依附一个hierarchy,但如果第二个hierarchy没有其他subsystem,那么就可以依附,如可同时存在两个仅有cpu依附的hierarchy。详细规则可参考Red Hat Enterprise Linux 6 Resource Management Guide3中的Relationships Between Subsystems, Hierarchies, Control Groups and Tasks一节。

4.root-cgroup是否包含hierarchy中所有进程?

  不是,同一hierarchy内每个cgroup的进程都不会出现在其他cgroup中。

  root-cgroup默认的设定是,系统一旦有新的进程出现,即刻会被root-cgroup包含进去(子进程未做测试)。某个cgroup管理的进程可在其目录下的tasks文件中查看,操作进程加入cgroup也仅需将pid添加进该文件中。

*注:一旦把一个进程放进某个cgroup,不把它移到其他cgroup是不会离开该cgroup的;而只要加入到其他cgroup,原cgroup将会自动释放该进程。

5.子cgroup能否继承父cgroup资源配置?

  会自动继承,因为子cgroup的资源配置不能超出父cgroup的限定范围。正如Ubuntu Document中提到:

In general, the kernel enforces the hierarchical constraints on limits, so that for instance if devices cgroup /child1 cannot access a disk drive, then/child1/child2 cannot give itself those rights.

  而在父cgroup的限定下,子cgroup的资源配置相互之间可以相同。

6.如果给多个cgroup分配的资源有重叠会怎样?譬如说给A分配了50%的资源,给B分配了100%的资源,它们会如何竞争?

  这里给出笔者针对CPU资源的实验结果:假设A需要使用10%的资源,B需要用80%的资源,那么当限制A使用50%的资源的时候,B是能用80%的;但A需要使用80%的资源的话,那么限定A使用50%的时候,A和B运行时都使用50%的资源。

  可见,cgroup的功能是限定资源,而不是划分资源。

  操作cgroup的命令和子系统配置文件的功能可以参考how to use cgroup【4】

7.如何在更改容器状态后快速切换资源的分配?

  修改该容器对应cgroup的配置文件。

8.为什么每个cgroup里都会自动创建一个user目录?- Ubuntu 14.04

  参考help.ubuntu.com中的解释:

As of Ubuntu 14.04 (Linux Kernel 3.16), users are automatically placed in a set of cgroups which they own, safely allowing them to constrain their own jobs using child cgroups. This feature is relied upon, for instance, for unprivileged container creation in lxc.

参考资料

【1】CGroup 介绍、应用实例及原理描述. http://www.ibm.com/developerworks/cn/linux/1506_cgroup/index.html

【2】Linux 容器的建立和简单管理. https://www.ibm.com/developerworks/cn/linux/1312_caojh_linuxlxc/

【3】Red Hat Enterprise Linux 6 Resource Management Guide. https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/6/html/Resource_Management_Guide/index.html

【4】how to use cgroup. http://tiewei.github.io/devops/howto-use-cgroup/

【5】CGROUPS. https://www.kernel.org/doc/Documentation/cgroups/cgroups.txt

【6】wiki/Cgroups. https://en.wikipedia.org/wiki/Cgroups

【7】All About the Linux Kernel: Cgroup’s Redesign. http://www.linux.com/news/featured-blogs/200-libby-clark/733595-all-about-the-linux-kernel-cgroups-redesign

【8】Ubuntu Document. https://help.ubuntu.com/lts/serverguide/cgroups-delegation.html

时间: 2024-12-15 04:51:11

Cgroup学习笔记的相关文章

cgroup学习笔记1 -- cgroup安装与入门

参考资料 http://www.ibm.com/developerworks/cn/linux/1506_cgroup/ http://www.elmerzhang.com/2012/11/cgroups-learning-1-introduction/ http://blog.csdn.net/jk198310/article/details/9292667 http://blog.chinaunix.net/uid-20788636-id-4451420.html 1 安装 1.1 系统配置

2016年7月19日学习笔记

2016年7月19日学习笔记 计算机系统的组成部分 计算机系统由硬件系统和软件系统两大部分组成 硬件系统 冯.诺依曼体系结构: 1946年数学家冯.诺依曼提出运算器,控制器,存储器,输入设备,输出设备. 具体变现为一下硬件: 运算器,控制器  ------>  CPU 存储器          ------>  内存(断电数据清空),硬盘(可永久存储数据) 输入设备------>  键盘,鼠标等 输出设备------>  显示器 打印机等 软件系统 OS : Operating S

这是三天的linux学习笔记,大神可以指教,别喷我,我新手。

20140825.学习笔记开启新终端    ctrl+shift+n关闭终端    alt+F4扩大终端    ctrl+shift+"+"缩小终端    ctrl+"-"开启新的终端标签    ctrl+shift+t关闭终端标签    ctrl+shift+w标签之间的切换    alt+标签对应的编号切换到真实终端tty3   ctrl+alt+F3tty回到图形     alt+F1或者F7 快捷键设置终端--->编辑--->键盘快捷键 设置终端

美团网 KVM虚拟化公开课学习笔记

KVM优化技术,美团开放平台--邱剑 基于KVM现有选项做一些优化,视频地址:http://www.osforce.cn/course/77/learn#lesson/80 CPU调优: 1.Context switch(用户态到内核态的优化):ring0->nernel mode,ring 3->user mode; 设置:宿主机BIOS中开启intel VT-X 2.缓存优化  Cache-Node Binding 将qemu进程绑定到特定的CPU node或者core上---避免L2/L

学习笔记: Linux目录,inode

目录,inode学习笔记 1. 关于目录,文件,数据块 对于使用计算机的人而言,经常有一种 错误的认知:目录(或者说,文件夹)里面存放着文件.实际上,目录里面并不存放文件,以及文件数据. 实际上,目录是一个特殊的文件,针对这个特殊的文件也存在一些特殊的规则,比如利用命令cp /dev/null <your directory>并不能够销毁这个特殊的文件,因为目录的一些特殊的比特位保证了这一安全性,降低了人工操作带来的风险.在一些老版本的Unix系统里面,用户可以利用cat命令打开目录,查看里面

2016年7月21日学习笔记

2016年7月21日学习笔记 Linux安装以后出现的文件目录的作用: 文件系统的类型 LINUX有四种基本文件系统类型:普通文件.目录文件.连接文件和特殊文件,可用file命令来识别. 普通文件:如文本文件.C语言元代码.SHELL脚本.二进制的可执行文件等,可用cat.less.more.vi.emacs来察看内容,用mv来改名. 目录文件:包括文件名.子目录名及其指针.它是LINUX储存文件名的唯一地方,可用ls列出目录文件. 连接文件:是指向同一索引节点的那些目录条目.用ls来查看是,连

vector 学习笔记

vector 使用练习: /**************************************** * File Name: vector.cpp * Author: sky0917 * Created Time: 2014年04月27日 11:07:33 ****************************************/ #include <iostream> #include <vector> using namespace std; int main

Caliburn.Micro学习笔记(一)----引导类和命名匹配规则

Caliburn.Micro学习笔记(一)----引导类和命名匹配规则 用了几天时间看了一下开源框架Caliburn.Micro 这是他源码的地址http://caliburnmicro.codeplex.com/ 文档也写的很详细,自己在看它的文档和代码时写了一些demo和笔记,还有它实现的原理记录一下 学习Caliburn.Micro要有MEF和MVVM的基础 先说一下他的命名规则和引导类 以后我会把Caliburn.Micro的 Actions IResult,IHandle ICondu

jQuery学习笔记(一):入门

jQuery学习笔记(一):入门 一.JQuery是什么 JQuery是什么?始终是萦绕在我心中的一个问题: 借鉴网上同学们的总结,可以从以下几个方面观察. 不使用JQuery时获取DOM文本的操作如下: 1 document.getElementById('info').value = 'Hello World!'; 使用JQuery时获取DOM文本操作如下: 1 $('#info').val('Hello World!'); 嗯,可以看出,使用JQuery的优势之一是可以使代码更加简练,使开