5. Cgroups控制组

Cgroups介绍

Cgroups(Control Groups)最初叫 Process Container,由 Google 工程师(Paul Menage 和 Rohit Seth)于 2006 年提出,后来因为 Container 有多重含义容易引起误解,就在 2007 年更名为 Control Groups,并被整合进 Linux 内核。顾名思义就是把进程放到一个组里面统一加以控制。

Cgroups是Control Groups的缩写,它是Linux 内核的一个特征,在2.6.24被引入,Cgroups用于提供对Linux的进程组进行资源上的限制/统计/隔离等操作的这样一种功能。

cgroups 是 Linux 内核提供的一种机制,这种机制可以根据特定的行为,把一系列系统任务及其子任务整合(或分隔)到按资源划分等级的不同组内,从而为系统资源管理提供一个统一的框架。

https://www.kernel.org/doc/html/latest/admin-guide/cgroup-v2.html

过去有一段时间,内核开发者甚至把 namespace 也作为一个 cgroups 的 subsystem 加入进来,也就是说 cgroups 曾经甚至还包含了资源隔离的能力。但是资源隔离会给 cgroups 带来许多问题,如 PID 在循环出现的时候 cgroup 却出现了命名冲突、cgroup 创建后进入新的 namespace 导致脱离了控制等等。所以在 2011 年就被移除了。

https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=a77aea92010acf54ad785047234418d5d68772e2

CGroups特点

cgroups 的 API 以一个伪文件系统的方式实现,即用户可以通过文件操作实现 cgroups 的组织管理。

subsystem(子系统) 

subsystem 实际上就是 cgroups 的资源控制系统,每种 subsystem 独立地控制一种资源。 

blkio: 这个 subsystem 可以为块设备设定输入 / 输出限制,比如物理驱动设备(包括磁盘、固态硬盘、USB 等)。 

cpu: 这个 subsystem 使用调度程序控制 task 对 CPU 的使用。 

cpuacct: 这个 subsystem 自动生成 cgroup 中 task 对 CPU 资源使用情况的报告。 

cpuset: 这个 subsystem 可以为 cgroup 中的 task 分配独立的 CPU(此处针对多处理器系统)和内存。 

devices: 这个 subsystem 可以开启或关闭 cgroup 中 task 对设备的访问。 

freezer:这个 subsystem 可以挂起或恢复 cgroup 中的 task。 

memory:这个 subsystem 可以设定 cgroup 中 task 对内存使用量的限定,并且自动生成这些 task 对内存资源使用情况的报告。 

perfevent:这个 subsystem 使用后使得 cgroup 中的 task 可以进行统一的性能测试。 

net_cls: 这个 subsystem Docker 没有直接使用,它通过使用等级识别符 (classid) 标记网络数据包,从而允许 Linux 流量控制程序(TC:Traffic Controller)识别从具体 cgroup 中生成的数据包。


实验案例

# cd /sys/fs/cgroup/cpu

# mkdir testcpu

# ls testcpu/

cgroup.clone_children  cpuacct.stat          cpu.cfs_period_us  cpu.rt_runtime_us  notify_on_release

cgroup.event_control  cpuacct.usage        cpu.cfs_quota_us  cpu.shares        tasks

cgroup.procs          cpuacct.usage_percpu  cpu.rt_period_us  cpu.stat

# grep -c 'processor' /proc/cpuinfo  # 查看CPU核数

/dev/zero在类UNIX 操作系统中, /dev/zero 是一个特殊的文件,当你读它的时候,它会提供无限的空字符(NULL, ASCII NUL, 0x00)。  

# dd if=/dev/zero of=/dev/null &   # 启动1个进程占满CPU

一个CPU已经100%使用

设定进程组CPU使用配额为30%, 这个值需要调整/sys/fs/cgroup/cpu/testcpu/cpu.cfs_quota_us来实现,。

# cat /sys/fs/cgroup/cpu/testcpu/cpu.cfs_quota_us

-1

# echo 30000 > /sys/fs/cgroup/cpu/testcpu/cpu.cfs_quota_us

# cat /sys/fs/cgroup/cpu/testcpu/cpu.cfs_quota_us

30000

设定死循环所在进程5782为限制对象,通过调整tasks的内容来实现,只需要将PID写入该文件即可。

# cat /sys/fs/cgroup/cpu/testcpu/tasks  #空的

# echo 5782 >/sys/fs/cgroup/cpu/testcpu/tasks

被限制后使用情况

# ps -ef|grep "/dev/zero"|grep -v grep|awk '{print $2}'|xargs kill   #杀掉进程

# rmdir /sys/fs/cgroup/cpu/testcpu #删除测试目录

实验案例

https://docs.docker.com/engine/reference/commandline/run/

Docker通过下面两组参数来控制容器内存的使用量

参数

docker run -it -m 200M --memory-swap=300M progrium/stress --vm 1 --vm-bytes 290M

重复分配释放中

启动一个大于300M的线程

docker run -it -m 200M --memory-swap=300M progrium/stress --vm 1 --vm-bytes 310M

直接给kill掉

Docker通过下面两组参数来控制容器CPU的使用量

参数

绑定到0 CPU上面

docker run -it --cpuset-cpus="0" --name Centos centos /bin/bash

dd if=/dev/zero of=/dev/null &

跑满CPU
CPU0使用情况
CPU0使用情况

配额

docker run -it --cpuset-cpus="0" --cpu-quota=50000 --name Centos centos /bin/bash

dd if=/dev/zero of=/dev/null &


份额

默认情况下,所有的容器得到同等比例的 CPU 周期。在有多个容器竞争 CPU 时我们可以设置每个容器能使用的 CPU 时间比例。这个比例叫作共享权值,通过-c或--cpu-shares设置。Docker 默认每个容器的权值为 1024。不设置或将其设置为 0,都将使用这个默认值。系统会根据每个容器的共享权值和所有容器共享权值和比例来给容器分配 CPU 时间。

docker run -it --cpuset-cpus="0" -c 1024 --cpu-quota=100000 --name Centos centos /bin/bash

docker run -it --cpuset-cpus="0" -c 2048 --cpu-quota=100000 --name Centos1 centos /bin/bash

CFS(完全公平调度器)

CFS是Completely Fair Scheduler简称,即完全公平调度器。CFS的设计理念是在真实硬件上实现理想的、精确的多任务CPU。CFS调度器和以往的调度器不同之处在于没有时间片的概念,而是分配cpu使用时间的比例。例如:2个相同优先级的进程在一个cpu上运行,那么每个进程都将会分配50%的cpu运行时间。这就是要实现的公平。

以上举例是基于同等优先级的情况下。但是现实却并非如此,有些任务优先级就是比较高。那么CFS调度器的优先级是如何实现的呢?首先,我们引入权重的概念,权重代表着进程的优先级。各个进程之间按照权重的比例分配cpu时间。例如:2个进程A和B。A的权重是1024,B的权重是2048。那么A获得cpu的时间比例是1024/(1024+2048) = 33.3%。B进程获得的cpu时间比例是2048/(1024+2048)=66.7%。我们可以看出,权重越大分配的时间比例越大,相当于优先级越高。在引入权重之后,分配给进程的时间计算公式如下:

分配给进程的时间 = 总的cpu时间 * 进程的权重/就绪队列(runqueue)所有进程权重之和

CFS 默认的调度周期是 100ms。

设置每个容器进程的调度周期,以及在这个周期内各个容器最多能使用多少 CPU 时间。

--cpu-period 设置调度周期,

--cpu-quota 设置在每个周期内容器能使用的 CPU 时间。

例如:

docker run -it --cpu-period=50000 --cpu-quota=25000 Centos centos /bin/bash

将 CFS 调度的周期设为 50000,将容器在每个周期内的 CPU 配额设置为 25000,表示该容器每 50ms 可以得到 50% 的 CPU 运行时间。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,869评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,716评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,223评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,047评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,089评论 6 395
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,839评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,516评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,410评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,920评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,052评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,179评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,868评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,522评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,070评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,186评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,487评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,162评论 2 356