1. 程式人生 > >Docker基礎 Linux內核之Cgroups(2)

Docker基礎 Linux內核之Cgroups(2)

com alt 統計 mar 區別 接下來 lin 進行 pau

作為開源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)