写点什么

浅谈 Cgroups

  • 2019-11-18
  • 本文字数:3239 字

    阅读完需:约 11 分钟

浅谈Cgroups

在开发一款软件时,为了延长软件的生命周期,需要一款配套软件来对发布的软件进行监控。随着容器技术的成熟,系统的定制和软件的打包变得越来越容易,同时,对容器进行监控成为了容器使用者所必备的技能。下来,作者将带领大家认识一下容器的资源管理工具 Cgroups。


说起容器监控,首先会想到通过 Cadvisor, Docker stats 等多种方式获取容器的监控数据,并同时会想到容器通过 Cgroups 实现对容器中的资源进行限制。但是这些数据来自哪里,并且如何计算的?答案是 Cgroups。最近在写 docker 容器监控组件,在深入 Cadvisor 和 Docker stats 源码发现数据都来源于 Cgroups。了解之余,并对 Cgroups 做下笔记。

1 Cgroups 介绍

Cgroups 是 control groups 的缩写,是 Linux 内核提供的一种可以限制,记录,隔离进程组(process groups)所使用物理资源的机制。最初有 google 工程师提出,后来被整合进 Linux 的内核。因此,Cgroups 为容器实现虚拟化提供了基本保证,是构建 Docker,LXC 等一系列虚拟化管理工具的基石。

2 Cgroups 作用

  • 资源限制(Resource limiting): Cgroups 可以对进程组使用的资源总额进行限制。如对特定的进程进行内存使用上限限制,当超出上限时,会触发 OOM。

  • 优先级分配(Prioritization): 通过分配的 CPU 时间片数量及硬盘 IO 带宽大小,实际上就相当于控制了进程运行的优先级。

  • 资源统计(Accounting): Cgroups 可以统计系统的资源使用量,如 CPU 使用时长、内存用量等等,这个功能非常适用于计费。

  • 进程控制(ControlCgroups): 可以对进程组执行挂起、恢复等操作。

3 Cgroups 组成

Cgroups 主要由 task,cgroup,subsystem 及 hierarchy 构成。下面分别介绍下各自的概念。


  • task: 在 Cgroups 中,task 就是系统的一个进程。

  • cgroup: Cgroups 中的资源控制都以 cgroup 为单位实现的。cgroup 表示按照某种资源控制标准划分而成的任务组,包含一个或多个子系统。一个任务可以加入某个 cgroup,也可以从某个 cgroup 迁移到另外一个 cgroup。

  • subsystem: Cgroups 中的 subsystem 就是一个资源调度控制器(Resource Controller)。比如 CPU 子系统可以控制 CPU 时间分配,内存子系统可以限制 cgroup 内存使用量。

  • hierarchy: hierarchy 由一系列 cgroup 以一个树状结构排列而成,每个 hierarchy 通过绑定对应的 subsystem 进行资源调度。hierarchy 中的 cgroup 节点可以包含零或多个子节点,子节点继承父节点的属性。整个系统可以有多个 hierarchy。

组件之间的关系

Subsystems, Hierarchies,Control Group 和 Tasks 之间有许多的规则,下面介绍下:


1、同一个 hierarchy 能够附加一个或多个 subsystem。


如下图,将 cpu 和 memory subsystems(或者任意多个 subsystems)附加到同一个 hierarchy。



2、一个 subsystem 只能附加到一个 hierarchy 上。


如下图,cpu subsystem 已经附加到了 hierarchy A,并且 memory subsystem 已经附加到了 hierarchy B。因此 cpusubsystem 不能在附加到 hierarchy B。



3、系统每次新建一个 hierarchy 时,该系统上的所有 task 默认构成了这个新建的 hierarchy 的初始化 cgroup,这个 cgroup 也称为 root cgroup。对于你创建的每个 hierarchy,task 只能存在于其中一个 cgroup 中,即一个 task 不能存在于同一个 hierarchy 的不同 cgroup 中,但是一个 task 可以存在在不同 hierarchy 中的多个 cgroup 中。如果操作时把一个 task 添加到同一个 hierarchy 中的另一个 cgroup 中,则会从第一个 cgroup 中移除。


如下图,cpu 和 memory 被附加到 cpu_mem_cg 的 hierarchy。而 net_cls 被附加到 net_cls hierarchy。并且 httpd 进程被同时加到了 cpu_mem_cg hierarchy 的 cg1 cgroup 中和 net hierarchy 的 cg3 cgroup 中。并通过两个 hierarchy 的 subsystem 分别对 httpd 进程进行 cpu,memory 及网络带宽的限制。



4、系统中的任何一个 task(Linux 中的进程)fork 自己创建一个子 task(子进程)时,子 task 会自动的继承父 task cgroup 的关系,在同一个 cgroup 中,但是子 task 可以根据需要移到其它不同的 cgroup 中。父子 task 之间是相互独立不依赖的。


如下图,httpd 进程在 cpu_and_mem hierarchy 的/cg1 cgroup 中并把 PID 4537 写到该 cgroup 的 tasks 中。之后 httpd(PID=4537)进程 fork 一个子进程 httpd(PID=4840)与其父进程在同一个 hierarchy 的统一个 cgroup 中,但是由于父 task 和子 task 之间的关系独立不依赖的,所以子 task 可以移到其它的 cgroup 中。


4 Cgroups 使用

我们直接使用 shell 命令直接操作 hierarchy 并设置 cgroup 参数。在 centos6 上也可以直接使用 libcgroup 提供的工具可简化对 cgroup 的使用。


Create a Hierarchy

使用 shell 命令创建 hierarchy 并附加 subsystems 到该 hierarchy 上。 作为 root 为 hierarchy 创建一个 mount point。并且在 mount point 中包含 cgrou 的名字。



例如:



接下来使用 mount 命令去挂载 hierarchy 并附加一个或多个 subsystem 到该 hierarchy 上。



例如:



如果想在已有的 hierarchy 上 attch 或 detach subsystem,可以使用 remount 操作,例如我们想 detach 掉 memory subsystem。


Unmounting a Hierarchy

可以直接用 umount 命令来 unmount 一个已有的 Hierarchy:



例如:


Creating Control Groups

直接使用 shell 命令 mkdir 创建一个子 cgroup:



例如:


Setting Control Cgroup Parameters

在 group1 中使用 echo 命令插入 0-1 到 cpuset.cpus,来限制该 cgroup 中的 tasks 只能跑在 0 和 1 的 cpu core 上。如下:


Moving a Process to a Control Group

只要将想要限制的进程 PID,追加到想要的 cgroup 的 tasks 文件中就可以了。例如:将 PID=1701 的进程放到“/cgroup/cpu_and_mem/group1/”的 cgroup 中。


5 Subsystem 介绍

  • blkio: blkio 子系统控制并监控 cgroup 中的 task 对块设备的 I/O 的访问。如:限制访问及带宽等。

  • cpu: 主要限制进程的 cpu 使用率。

  • cpuacct: 可以统计 cgroup 中进程的 cpu 使用报告。

  • cpuset: 可以为 cgroup 中的进程分配独立的 cpu 和内存节点。

  • memory: 自动生成 cgroup 中 task 使用的内存资源报告,并对该 cgroup 的 task 进行内存使用限制。

  • devices: 可以控制进程能否访问某些设备。

  • net_cls: 使用等级标识符(clssid)标记网络数据包,可允许 Linux 流量控制程序(tc)识别从具体 cgroup 中生成的数据包。

  • freezer: 可以挂起或回复 cgroup 中的进程。

  • ns: 可以使不同 cgroup 中的进程使用不同的 namespace。

6 容器使用 Cgroups 进行资源限制

无论是使用 docker run 方式直接创建容器,还是通过各类容器编排工具(如:Kubernetes)创建容器,对于容器的限制本质都是通过 Cgroups。我们分别使用这两种方式来创建容器并观察 cgroups:


测试环境:


使用 docker run 方式创建容器

1、限制 CPU share,创建两个容器,则会在运行该容器宿主的/sys/fs/cgroup/cpu/docker/ 下分别创建两个子 cgroup,格式如下。



2、创建一个容器,并设置–cpu-shares 参数为:1024*10。



查看该容器 cgroup 的 cpu.shares 文件内容如下。



3、创建一个容器,并设置–cpu-shares 参数为: 1024*14。



查看该容器 cgroup 的 cpu.shares 文件内容如下。



4、两个容器使用 cpu 的 stats,一个容器分到 14 核的相对 cpu 计算时间,另一个容器分到 10 核的相对 cpu 计算时间:


限制容器内存使用量

1、创建一个容器,限制容器能使用的内存上限为 1024M。



2、查看容器 memory 的 stats,内存使用率 100%。



3、当容器使用的内存量超过 1024M,则容器会被 kill -9 掉。


使用 Kubenetes 容器编排工具创建容器

使用 kubernetes 编排工具创建的容器,则与容器关联的 cgroup 均在运行该容器宿主机的/sys/fs/cgroup/cpu/kubepods/下,具体的格式如下所示:



使用 Pod 创建一个容器,对应的 yaml 文件内容如下:



在运行该容器的宿主机上查看该容器的 cgroup 信息,会观察到 cpu.shares 为 1 核,memory.limit_in_bytes 为 2G。



本文转载自公众号 360 云计算(ID:hulktalk)。


原文链接:


https://mp.weixin.qq.com/s/3a5k3YA6ALri3BrQWQbOpw


2019-11-18 16:441978

评论

发布
暂无评论
发现更多内容

价值连城 人工智能的通识课 - 吴恩达Andrew Ng AI For Everyone John 易筋 ARTS 打卡 Week 59

John(易筋)

ARTS 打卡计划

从外卖员到程序员,自学3年终于转行成功,三面“拿下”拼多多

Java~~~

Java spring 面试 微服务 JVM

前端性能优化|什么是防抖和节流?

青云技术社区

JavaScript 大前端 防抖节流 函数防抖

Alibaba开发十年,写出这本“MQ技术手册”,看完我愣住了

Java~~~

Java kafka 面试 MQ 架构师

快速发展的互联网通信,站在开发者背后的融云

融云 RongCloud

堡垒机价格与什么有关?价格差别大吗?

行云管家

云计算 堡垒机

企业上云之前选择服务器类型的几点建议

九河云安全

c++ list 详解

若尘

c++ List 8月日更

黑科技解密!实现socket进程间迁移

Java 程序员 架构 面试 架构师

Alibaba内部出品“Java初学者宝典”,让你就业没压力

Java~~~

Java 面试 JVM 多线程 架构师

教你如何使用FusionInsight SqoopShell

华为云开发者联盟

sqoop Shell FusionInsight 脚本 Loader

模型训练语料少?知识蒸馏解决烦恼

LigaAI

人工智能 神经网络 深度学习 模型训练 nlp

Java书单-比较全的一篇

汤圆学Java

程序员

【等保测评】江西等保测评机构只有3家吗?都在哪里?

行云管家

等保 等级保护 等保测评 等保评测

保险=诈骗?区块链赋予保险的“四个机会”

旺链科技

区块链 保险业 信任构建

趁着课余时间学点Python(九)函数的进阶 生成器 装饰器的理解

ベ布小禅

8月日更

完美!腾讯技术官发布Java零基础就业宝典,不用再怀疑人生了

Java~~~

Java spring 面试 微服务 架构师

限量!Alibaba首发“Java成长笔记”,差距不止一点点

Java~~~

Java spring 面试 微服务 架构师

从平台到生态,钉钉、飞书和企业微信的巨头之争

ToB行业头条

钉钉 企业微信 飞书

耗时三年才总结出了这份Alibaba(P5-P9)学习进阶路线图

Java架构追梦

Java 阿里巴巴 架构 面试 架构成长路线

如何利用FL Studio进行听湿录干的声音录制

懒得勤快

市场战略再升级 解析融云的生态平台+纵深发展

融云 RongCloud

网络攻防学习笔记 Day101

穿过生命散发芬芳

态势感知 网络攻防 8月日更

FastApi-09-模型嵌套

Python研究所

FastApi 8月日更

如果用柔性屏做雨伞,那雨伞就不仅仅是雨伞了

船医特拉法尔加

开发者工具

卷向字节码-Java异常到底是怎么被处理的?

why技术

Java JVM

爱了!Alibaba技术官甩出的SpringCloud笔记,GitHub已标星81.6k

Java~~~

Java 面试 微服务 Spring Cloud 架构师

史上最全的服务器选择指南,这六点你必须知道!

九河云安全

OAuth2.0授权码模式实战

码农参上

OAuth 2.0 8月日更

Qunar 大讲堂问题排查

Qunar技术沙龙

问题处理 问题排查 管理系统 开发管理 问题总结

不安全的服务器和云服务器:远程工作如何增加了黑客可以攻击的攻击面

九河云安全

浅谈Cgroups_文化 & 方法_王希刚_InfoQ精选文章