Docker基础 Linux内核之Cgroups(2)

作为开源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

[root@liumiaocn ~]# 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)
[root@liumiaocn ~]#
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

确认到cpu控制的cgroup为/sys/fs/cgroup/cpu

创建用于测试的cpu下的control group

[root@liumiaocn ~]# mkdir /sys/fs/cgroup/cpu/testcpu

创建后结果确认

创建testcpu之后,该目录下会自动创建出很多文件

[root@liumiaocn ~]# 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
[root@liumiaocn ~]#
  • 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来实现

[root@liumiaocn ~]# echo 30000 > /sys/fs/cgroup/cpu/testcpu/cpu.cfs_quota_us
[root@liumiaocn ~]# 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
[root@liumiaocn ~]# cat /sys/fs/cgroup/cpu/testcpu/cpu.cfs_quota_us
30000
[root@liumiaocn ~]#
  • 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

猜你喜欢

转载自www.cnblogs.com/firsttry/p/10294898.html