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
Docker基礎 Linux內核之Cgroups(2)