Docker基础 Linux内核之Cgroups
Posted firsttry
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Docker基础 Linux内核之Cgroups相关的知识,希望对你有一定的参考价值。
作为开源Container技术代表的Docker,它跟Linux内核的Namespace和Cgroup两大特性密不可分。物有本末,事有终始。知所先后,则近道矣。理解Linux的这两大特性将有助于我们更深入的理解Docker。
在本文中我们将会简要介绍一下如何在CentOS上利用Cgroups限制CPU的使用率。
Cgroups的历史
Cgroups是Control Groups的缩写, 它是Linux 内核的一个特征,在2.6.24被引入. Cgroups用于提供对Linux的进程组进行资源上的限制/统计/隔离等操作的这样一种功能.
时间 | 具体发展 |
---|---|
2006 | Google的工程师(Paul Menage and Rohit Seth等)发起的Process containers |
2007 | 由于术语container容易引起理解上的混乱,改名为Control Groups |
2007 | 合并入Linux内核2.6.24 |
2007以后 | 诸如防火墙的支持,hierarchy的引入等不断完善和增强功能 |
Centos版本
虽然Cgroups是Linux内核,但是不同的发型版在使用上还有细小的区别。由于RHEL或者CentOS使用Systemd进行服务的管理,而Systemd本身就是使用了Cgroups的特性,所以我们将会使用CentOS来简单介绍一下Cgroups的使用。
[root@liumiaocn ~]# uname -a
Linux liumiaocn 3.10.0-327.el7.x86_64 #1 SMP Thu Nov 19 22:10:57 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
[root@liumiaocn ~]#
- 1
- 2
- 3
事前准备
CentOS上为了支持cgroups,需要安装libcgroups,不同的linux发型版稍有不同,CentOS下可以使用如下进行安装。不过default一般都是会安装。
命令:yum install libcgroup
确认cgroups的cpu subsystem
[[email protected] ~]# mount -t cgroup
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/hugetlb type cgroup (rw,nosuid,nodev,noexec,relatime,hugetlb)
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/freezer type cgroup (rw,nosuid,nodev,noexec,relatime,freezer)
cgroup on /sys/fs/cgroup/cpu,cpuacct type cgroup (rw,nosuid,nodev,noexec,relatime,cpuacct,cpu)
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/net_cls type cgroup (rw,nosuid,nodev,noexec,relatime,net_cls)
cgroup on /sys/fs/cgroup/perf_event type cgroup (rw,nosuid,nodev,noexec,relatime,perf_event)
[[email protected] ~]#
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
确认到cpu控制的cgroup为/sys/fs/cgroup/cpu
创建用于测试的cpu下的control group
[[email protected] ~]# mkdir /sys/fs/cgroup/cpu/testcpu
创建后结果确认
创建testcpu之后,该目录下会自动创建出很多文件
[[email protected] ~]# ll /sys/fs/cgroup/cpu/testcpu
total 0
-rw-r--r--. 1 root root 0 Sep 19 21:35 cgroup.clone_children
--w--w--w-. 1 root root 0 Sep 19 21:35 cgroup.event_control
-rw-r--r--. 1 root root 0 Sep 19 21:35 cgroup.procs
-r--r--r--. 1 root root 0 Sep 19 21:35 cpuacct.stat
-rw-r--r--. 1 root root 0 Sep 19 21:35 cpuacct.usage
-r--r--r--. 1 root root 0 Sep 19 21:35 cpuacct.usage_percpu
-rw-r--r--. 1 root root 0 Sep 19 21:35 cpu.cfs_period_us
-rw-r--r--. 1 root root 0 Sep 19 21:35 cpu.cfs_quota_us
-rw-r--r--. 1 root root 0 Sep 19 21:35 cpu.rt_period_us
-rw-r--r--. 1 root root 0 Sep 19 21:35 cpu.rt_runtime_us
-rw-r--r--. 1 root root 0 Sep 19 21:35 cpu.shares
-r--r--r--. 1 root root 0 Sep 19 21:35 cpu.stat
-rw-r--r--. 1 root root 0 Sep 19 21:35 notify_on_release
-rw-r--r--. 1 root root 0 Sep 19 21:35 tasks
[[email protected] ~]#
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
接下来我们会介绍如何修改这些文件已达到控制CPU使用率的作用。
准备提高CPU使用率的死循环
打开一个终端,执行以下死循环,没有控制的时候,CPU会迅速上升至100%
CPU已经上升到100%
从这里可以确认到此进程PID为7345
设定CPU配额
设定进程组CPU使用配额为30%, 这个值需要调整/sys/fs/cgroup/cpu/testcpu/cpu.cfs_quota_us来实现
[[email protected] ~]# echo 30000 > /sys/fs/cgroup/cpu/testcpu/cpu.cfs_quota_us
[[email protected] ~]# ll /sys/fs/cgroup/cpu/testcpu/
total 0
-rw-r--r--. 1 root root 0 Sep 19 21:35 cgroup.clone_children
--w--w--w-. 1 root root 0 Sep 19 21:35 cgroup.event_control
-rw-r--r--. 1 root root 0 Sep 19 21:35 cgroup.procs
-r--r--r--. 1 root root 0 Sep 19 21:35 cpuacct.stat
-rw-r--r--. 1 root root 0 Sep 19 21:35 cpuacct.usage
-r--r--r--. 1 root root 0 Sep 19 21:35 cpuacct.usage_percpu
-rw-r--r--. 1 root root 0 Sep 19 21:35 cpu.cfs_period_us
-rw-r--r--. 1 root root 0 Sep 19 21:42 cpu.cfs_quota_us
-rw-r--r--. 1 root root 0 Sep 19 21:35 cpu.rt_period_us
-rw-r--r--. 1 root root 0 Sep 19 21:35 cpu.rt_runtime_us
-rw-r--r--. 1 root root 0 Sep 19 21:35 cpu.shares
-r--r--r--. 1 root root 0 Sep 19 21:35 cpu.stat
-rw-r--r--. 1 root root 0 Sep 19 21:35 notify_on_release
-rw-r--r--. 1 root root 0 Sep 19 21:35 tasks
[[email protected] ~]# cat /sys/fs/cgroup/cpu/testcpu/cpu.cfs_quota_us
30000
[[email protected] ~]#
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
设定所限制的进程对象
设定死循环所在进程7345为限制对象,通过调整tasks的内容来实现,只需要将PID写入该文件即可。
[root@liumiaocn ~]# cat /sys/fs/cgroup/cpu/testcpu/tasks
[root@liumiaocn ~]# echo 7345 >/sys/fs/cgroup/cpu/testcpu/tasks
[root@liumiaocn ~]#
- 1
- 2
- 3
设定后确认
设定之后,片刻Cgroups的控制作用就会显现,如下图所示,CPU使用率迅速降到了30%,这是因为该进程所能使用到的最大CPU配额为30%的缘故。
虽然这个例子非常简单,早期的ulimit也可以实现类似的功能,但是cgroup的控制粒度要精细地多,功能也要强大很多,这里就不再一一列举,但是我们还是可以看到如何便利地使用cgroups来进行资源的限制控制。
其他相关
内容 | URL |
---|---|
在CentOS7上使用LXC管理容器 | http://blog.csdn.net/liumiaocn/article/details/52348219 |
如何使用RHEL/CentOS 7安装创建和管理LXC (Linux Containers) | http://blog.csdn.net/liumiaocn/article/details/52337479 |
Docker基础: Linux内核命名空间之(1) mnt namespace | http://blog.csdn.net/liumiaocn/article/details/52549196 |
参考内容 | https://www.kernel.org/doc/Documentation/cgroup-v1/ |
再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow
以上是关于Docker基础 Linux内核之Cgroups的主要内容,如果未能解决你的问题,请参考以下文章