5分钟了解Docker原理(2),最简单的cgroups介绍!
点击上方蓝色“方志朋”,选择“设为星标”
回复“666”获取独家整理的学习资料!
很多接触Docker的同学,都接触过cgroup这个名词。它是Linux上的一项古老的技术,用来实现资源限制,比如CPU、内存等。但有很多同学反映,这项技术有点晦涩,不太好懂。
这就是本篇文章存在的目的,会让你以最简单直观的方式,了解cgroups到底是个什么东西。
cgroups,是实现docker功能的重要底层设施。如上图,使用cgroups,能够把操作系统的各项资源变成池子,然后通过配置获取相应的资源。
那它是怎么实现的呢?
要注意cgroups
这个名词,它有两个特性。首先是c
,就是Control
的意思,是个动词;第二部分,就是groups
,证明它是个组
。
1. 动词的目标
control,用来限制什么呢?除了CPU、内存,还有啥?
使用mount命令,查看当前系统支持的限制目标,它有个专用的名词,叫做子系统
。
# mount | grep cgroup
tmpfs on /sys/fs/cgroup type tmpfs (ro,nosuid,nodev,noexec,mode=755)
cgroup on /sys/fs/cgroup/systemd type cgroup (rw,nosuid,nodev,noexec,relatime,xattr,release_agent=/usr/lib/systemd/systemd-cgroups-agent,name=systemd)
cgroup on /sys/fs/cgroup/blkio type cgroup (rw,nosuid,nodev,noexec,relatime,blkio)
cgroup on /sys/fs/cgroup/devices type cgroup (rw,nosuid,nodev,noexec,relatime,devices)
cgroup on /sys/fs/cgroup/cpu,cpuacct type cgroup (rw,nosuid,nodev,noexec,relatime,cpuacct,cpu)
cgroup on /sys/fs/cgroup/net_cls,net_prio type cgroup (rw,nosuid,nodev,noexec,relatime,net_prio,net_cls)
cgroup on /sys/fs/cgroup/cpuset type cgroup (rw,nosuid,nodev,noexec,relatime,cpuset)
cgroup on /sys/fs/cgroup/memory type cgroup (rw,nosuid,nodev,noexec,relatime,memory)
cgroup on /sys/fs/cgroup/freezer type cgroup (rw,nosuid,nodev,noexec,relatime,freezer)
cgroup on /sys/fs/cgroup/pids type cgroup (rw,nosuid,nodev,noexec,relatime,pids)
cgroup on /sys/fs/cgroup/hugetlb type cgroup (rw,nosuid,nodev,noexec,relatime,hugetlb)
cgroup on /sys/fs/cgroup/perf_event type cgroup (rw,nosuid,nodev,noexec,relatime,perf_event)
不同的系统版本,会有一些细微的区别,大体上,子系统的分类包含下面这些:
cpu,cpuacct
cpu
主要限制进程的 cpu 使用率,cpuacct
可以统计 cgroups 中的进程的 cpu 使用报告cpuset
可以为 cgroups 中的进程分配单独的 cpu节点
或者内存节点
,就像Numa做的那些事情一样blkio
可以限制进程的块设备 io,比如物理设备(磁盘,固态硬盘,USB 等等)devices
控制进程能够访问某些设备net_cls
标记 cgroups 中进程的网络数据包,然后可以使用 tc 模块(traffic control)对数据包进行控制net_prio
— 这个子系统用来设计网络流量的优先级freezer
可以挂起或者恢复 cgroups 中的进程。ns
可以使不同 cgroups 下面的进程使用不同的 namespacehugetlb
主要针对于HugeTLB系统进行限制,这是一个大页文件系统。
内容很多,但我们平常关注的大多数就是内存和CPU,这些繁杂的细节,不影响我们理解它的设计原则。
下面就以CPU为例,来看一下子系统的实际表现。
2. CPU使用限制的例子
首先,我们进入cpu子系统目录。
cd /sys/fs/cgroup/cpu
然后,创建一个组名为xjjdog
的cgroups,这个名字,就叫做控制组
。
mkdir xjjdog
这时候,神奇的事情发生了。我们使用ll
命令,查看xjjdog
目录中的内容,发现系统已经为我们默认生成了一堆文件。
# ll xjjdog/
total 0
-rw-r--r-- 1 root root 0 Jan 28 21:09 cgroup.clone_children
--w--w--w- 1 root root 0 Jan 28 21:09 cgroup.event_control
-rw-r--r-- 1 root root 0 Jan 28 21:09 cgroup.procs
-r--r--r-- 1 root root 0 Jan 28 21:09 cpuacct.stat
-rw-r--r-- 1 root root 0 Jan 28 21:09 cpuacct.usage
-r--r--r-- 1 root root 0 Jan 28 21:09 cpuacct.usage_percpu
-rw-r--r-- 1 root root 0 Jan 28 21:09 cpu.cfs_period_us
-rw-r--r-- 1 root root 0 Jan 28 21:09 cpu.cfs_quota_us
-rw-r--r-- 1 root root 0 Jan 28 21:09 cpu.rt_period_us
-rw-r--r-- 1 root root 0 Jan 28 21:09 cpu.rt_runtime_us
-rw-r--r-- 1 root root 0 Jan 28 21:09 cpu.shares
-r--r--r-- 1 root root 0 Jan 28 21:09 cpu.stat
-rw-r--r-- 1 root root 0 Jan 28 21:09 notify_on_release
-rw-r--r-- 1 root root 0 Jan 28 21:09 tasks
通过控制这些文件里面的数值,就可以对资源进行限制。比如cpu.cfs_quota_us
文件,如果我们往里写入100000
(十万),那么就证明使用了xjjdog
的cgroup,最多
能够使用1核
的CPU。写入20000
,证明最多使用使用1/5
核的CPU。
这是因为,cpu.cfs_period_us
这个配置文件,默认把1核cpu分成了10万份。
那我们就写入20000
试一下。
sudo echo 20000 > xjjdog/cpu.cfs_quota_us
我们把当前shell的pid,加入被受控进程列表。
echo $$ > xjjdog/tasks
执行完毕之后,再启动一个死循环。
while true;do ;done;
重新打开一个shell,使用top观察CPU的使用率。可以发现,我们的死循环,最多只使用了20%的CPU。us
保持在20%以下,且不间断的在各个cpu之间切换。
依次试验以下的命令,可以发现CPU的使用,会逐步增加,大体上和我们的限额是相等的。
sudo echo 40000 > xjjdog/cpu.cfs_quota_us
sudo echo 60000 > xjjdog/cpu.cfs_quota_us
sudo echo 100000 > xjjdog/cpu.cfs_quota_us
其他的资源限制,都是类似的思路。那么最重要的工作,就是需要知道cpu.cfs_quota_us
这样的字眼,代表的是什么意思,这些对着手册来看是很容易掌握的。比如quota
是配额的意思,很明显就是限制资源的使用。
如上图,子系统可以控制多个tasks,把它纳入到控制组之内。我们上篇文章讲到,可以将bash进程,作为docker系统的1号进程,那么同样的,这个1号进程的子进程,都会共享同样的限额配置。
3. group的意思
浅显的来讲,group就是指的对各种资源进行分组。不同名字的资源,有不同的隔离配置。但它有更多的特性。
比较重要的,是它的层级关系(hierarchy)。这个也比较好理解,它主要是为了简化配置而存在的。
比如我上面的xjjdog目录,对cpu的限制限制在0.5核。这时候,我想要有另外一个应用,对cpu的使用限制在0.5核,同时限制内存1gb,那么就可以直接在xjjdog目录下创建xjjdog0目录,在xjjdog0目录下只配置内存方面的就可以了。
另外,如果你在外层的cpu限额限制了2core,然后在继承的目录里限制了1/5核,那它就只能使用操作系统的2/5核。这也是继承的一个特性。
End
cgroups是2006年诞生的,发起人是Google 的工程师(Rohit Seth
和 Paul Menage
)。在 2008 年成功合入 Linux 2.6.24 版本中,可以说这项技术是很古老的。cgroups目前已经成为 systemd、Docker、Linux Containers(LXC) 等技术的基础。
像Windows平台的WSL,是没有cgroups功能的,使用mount命令可以验证,这证明了它是不能把docker跑起来的,因为缺乏基础。不过,WSL2已经可以了。
有些同学对docker目前的发展现状有些担心,但当你熟悉了这几个常见的底层原理,读完容器的标准之后,就会发现,上层的实现无论是换成docker也好,换成containerd也罢,都一样!
热门内容:
徒手撸了一个API网关,理解更透彻了,代码已上传github,自取~
写了个牛逼的日志切面,甩锅更方便了!
绝了!这款工具让SpringBoot不再需要Controller、Service、DAO、Mapper!
一个注解搞定 SpringBoot 接口防刷,还有谁不会?
最近面试BAT,整理一份面试资料《Java面试BAT通关手册》,覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。
明天见(。・ω・。)ノ♡
5分钟了解Docker原理(2),最简单的cgroups介绍!相关推荐
- 面试官:说一说 Docker 原理
开发人员开发完一个电商项目,该 Jar 项目包含 Redis.MySQL.ES.Haddop等若干组件.开发人员自测无误后提交给测试进行预生产测试了. 测试:你的这个服务,我在进行单元测试跟数据核对的 ...
- Docker的RUN流程和Docker原理、Docker的常用命令、其他命令
Docker的RUN流程和Docker原理 Run流程 底层原理 Docker是怎么工作的 Docker为什么比VM快 Docker的常用命令 帮助命令 镜像命令 查看镜像 搜索镜像 下载镜像 指定版 ...
- Docker原理(图解+秒懂+史上最全)
文章很长,建议收藏起来,慢慢读! Java 高并发 发烧友社群:疯狂创客圈 奉上以下珍贵的学习资源: 免费赠送 经典图书:<Java高并发核心编程(卷1)> 面试必备 + 大厂必备 +涨薪 ...
- 一篇不一样的docker原理解析 提高篇
在上一篇 一篇不一样的docker原理解析 - uncle creepy的文章 - 知乎专栏 中,主要讨论了容器和虚拟机的区别,在实现细节上并没有深入,只是点到即止,在这篇提高篇中,将详细讨论容器的实 ...
- 一篇不一样的docker原理解析
0 引言 在学习docker的过程中,我发现目前docker学习最大的障碍,不是网上的资源太少,而是网上的资源太多,资源太多带来的噪声让学习效率降低不少.而在讲解docker原理上,所有的讲解都是关于 ...
- Docker 原理、学习教程
From:https://blog.csdn.net/dataiyangu/article/details/82260586 Docker 常用命令总结:https://blog.csdn.net/i ...
- 面试官留步!听我跟你侃会儿Docker原理
1 Docker 简介 1.1 Docker 由来 Docker 是基于 Go 语言开发的一个容器引擎,Docker是应用程序与系统之间的隔离层.通常应用程序对安装的系统环境会有各种严格要求,当服务器 ...
- docker原理及基本概念
Docker技术原理介绍 前言 玩docker有阵子,随着使用的频繁,学习的深入,愈发有了不不少的困惑,于是又回过头复习这些理论知识.还是那句话,温故而知新,每一次阅读都会有不一样的收获. 简介 Do ...
- 深入理解Docker原理
本文参考转载至:<深入剖析Kubernetes - 张磊> 更过优秀博文请关注:https://blog.bigcoder.cn 容器技术的核心功能,就是通过约束和修改进程的动态表现,从而 ...
最新文章
- 八大排序算法合集 (归并排序、交换排序、插入排序、选择排序......)
- 低代码、无代码?深度解读硅谷新趋势(上)
- 对抗攻击层出不穷?神经科学带来新突破、导出智能统一框架,Hinton:我早有洞见
- Opencv 学习笔记之——鼠标操作画出感兴趣区域
- Python 基础篇:介绍
- 在Win2003、Win7、XP中配置IIS搭建ASP.NET Web网站或应用程序(1)
- c语言将水仙花数放入一维数组a中,C语言考试题库及答案(1)
- Python内置函数(28)——hash
- 基于汽车运动学模型的LQR控制
- IIS 部署的网站无法启动
- 如何用es6 set实现交差并集
- java编程马拉松比赛_腾讯编程马拉松
- 宝塔linux 云锁安装卸载,Centos宝塔安装云锁带自编译好模块Nginx
- 回顾15个月的工作经历
- ABC-Endless Walk-(缩点+拓扑dp)
- flyway 实现 java 自动升级 SQL 脚本
- [V5] self的resend,JS实现
- greenplum的主机名更改导致无法启动问题解决
- 【SQL Server】模糊查询
- UOS下使用HHDESK文本编辑功能
热门文章
- 阅读Book: MultiObjective using Evolutionary Algorithms (5) ---- Non-Dominated Sorting of a Population
- 2018-3-5(论文——网络中非结构信息的表示与应用)笔记二 (歧义词,未登录词,禁用词)
- http status 汇总
- 彻底解决Linux索引节点(inode)占用率高的告警
- 西门子smart200以太网通讯协议
- redis事物命令示例
- 为python安装numpy和scipy(federo)
- 成为软件高手的几个忌讳
- 不改文件名的情况下上传突破
- 水晶报表导出数据并实现打印