1、Docker、LXC、Cgroup的結構關係html
根據Docker佈道師Jerome Petazzoni的說法,Docker約等於LXC+AUFS(以前只支持ubuntu時)(做者2015-10-22更新:Docker0.9.0版本開始引入libcontainer,能夠視做LXC的替代品)。其中LXC負責資源管理,AUFS負責鏡像管理;而LXC包括cgroup、namespace、chroot等組件,並經過cgroup進行資源管理。因此只從資源管理這條線來看的話,Docker、LXC、Cgroup三者的關係是:Cgroup在最底層落實資源管理,LXC在cgroup上封裝了一層,Docker又在LXC封裝了一層,關係圖如圖1(b)所示。所以,要想玩轉Docker,有必要了解負責資源管理的CGroup和LXC。linux
(a) (b)
ubuntu
圖1 Docker-LXC-CGroup結構圖centos
2、Cgroup網絡
1、Cgroup基本概念框架
1)Cgroup是什麼ide
Cgroups是control groups的縮寫,是Linux內核提供的一種能夠限制、記錄、隔離進程組(process groups)所使用的物理資源(如:CPU, Memory, IO等)的機制。最初由Google的工程師提出,後來被整合進Linux內核。Cgroups也是LXC爲實現虛擬化所使用的資源管理手段,能夠說沒有Cgroups就沒有LXC,也就沒有Docker。性能
Cgroups最初的目標是爲資源管理提供的一個統一的框架,既整合現有的Cpuset等子系統,也爲將來開發新的子系統提供接口。如今的Cgroups適用於多種應用場景,從單個進程的資源控制,到實現操做系統層次的虛擬化(OS Level Virtualization)。Cgroups提供如下功能:測試
a)限制進程組可使用的資源數量(Resource limiting )。好比:Memory子系統能夠爲進程組設定一個Memory使用上限,一旦進程組使用的內存達到限額再申請內存,就會出發OOM(out of memory)。spa
b)進程組的優先級控制(Prioritization)。好比:可使用CPU子系統爲某個進程組分配特定CPUshare。
c)進程組隔離(Isolation)。好比:使用ns子系統可使不一樣的進程組使用不一樣的namespace,以達到隔離的目的,不一樣的進程組有各自的進程、網絡、文件系統掛載空間。
d)記錄進程組使用的資源數量(Accounting)。好比:可使用Cpuacct子系統記錄某個進程組使用的CPU時間
e)進程組控制(Control)。好比:使用freezer子系統能夠將進程組掛起和恢復。
2)Cgroup基本概念與術語
任務(task)
在Cgroups中,任務就是系統的一個進程。
控制族羣(control group)
控制族羣就是一組按照某種標準劃分的進程,控制族羣一般按照應用劃分,即與某應用相關的一組進程,被劃分爲一個進程組,即控制族羣(control group)。Cgroups中的資源控制都是以控制族羣爲單位實現。一個進程能夠加入到某個控制族羣,也能夠從一個進程組遷移到另外一個控制族羣。一個進程組的進程可使用Cgroups以控制族羣爲單位分配的資源,同時受到Cgroups以控制族羣爲單位設定的限制。
層級(hierarchy)
控制族羣能夠組織成hierarchical的形式,既一顆控制族羣樹。控制族羣樹上的子節點控制族羣是父節點控制族羣的孩子,繼承父控制族羣的特定的屬性。控制族羣樹的示意圖如圖2所示。
圖2 控制族羣樹結構示意圖
子系統(subsystem)
一個子系統就是一個資源控制器,好比CPU子系統就是控制CPU時間分配的一個控制器。子系統必須附加(attach)到一個層級上才能起做用,一個子系統附加到某個層級之後,這個層級上的全部控制族羣都受到這個子系統的控制。
3)Cgroup子系統介紹
a)blkio -- 這個子系統爲塊設備設定輸入/輸出限制,好比物理設備(磁盤,固態硬盤,USB等等)。
b)cpu -- 這個子系統使用調度程序提供對CPU 的 Cgroup 任務訪問。
c)cpuacct -- 這個子系統自動生成Cgroup中任務所使用的 CPU 報告。
d)cpuset-- 這個子系統爲 Cgroup中的任務分配獨立CPU(在多核系統)和內存節點。
e)devices -- 這個子系統可容許或者拒絕Cgroup中的任務訪問設備。
f)freezer -- 這個子系統掛起或者恢復Cgroup中的任務。
g)memory -- 這個子系統設定Cgroup中任務使用的內存限制,並自動生成由那些任務使用的內存資源報告。
h)net_cls -- 這個子系統使用等級識別符(classid)標記網絡數據包,可容許Linux 流量控制程序(tc)識別從具體cgroup 中生成的數據包。
i)ns -- 名稱空間子系統。
Cgroup具備不一樣的掛載方法——「多掛載點」和「單掛載點」。子系統「多掛載點」掛載就是指不一樣子系統的文件掛載在不一樣的目錄下,每一個子系統各有一個掛載點,目錄結構如圖3(a)所示。cgroup對應服務cgconfig默認使用的就是「多掛載點」的方法。「單掛載點」則是指全部子系統的文件都掛載在同一個目錄下,全部子系統都統一掛載在一個掛載點,目錄結構如圖3(b)所示。
圖3(a)cgroup多掛載點目錄結構示意圖
圖3(b)cgroup單掛載點目錄結構示意圖
2、Cgroup安裝配置
1)Cgroup安裝
安裝Cgroups須要libcap-devel和libcgroup兩個相關的包,CentOS上能夠經過yum的方式下載安裝,具體的命令爲:
yum install gcc, libcap-devel,libcgroup, bridge-utils |
2)Cgroup掛載配置
Cgroup對應服務名稱爲cgconfig,cgconfig默認採用「多掛載點」掛載。通過實際測試,發如今CentOS環境中應採用「單掛載點」進行掛載,所以應當卸載原有cgroup文件系統,並禁用cgconfig。
cgclear或者sudo service cgconfig stop # 中止cgconfig,卸載cgroup目錄 sudo chkconfig cgconfig off # 禁用cgconfig服務,避免其開機啓動 |
而後採用「單掛載點」方式從新掛載cgroup。
能夠直接手動掛載,這樣僅當次掛載成功。
mount -t cgroup none /cgroup |
而後編輯/etc/fstab/,輸入下列內容。這樣每次開機後都會自動掛載。
none /cgroup cgroup defaults 0 0 |
3)經常使用的Cgroup相關命令和配置文件
service cgconfig status|start|stop|restart #查看已存在子系統 lssubsys –am #查看已存在子系統 cgclear # 清除全部掛載點內部文件,至關於service cgconfig stop cgconfigparser -l /etc/cgconfig.conf #從新掛載 Cgroup默認掛載點(CentOS):/cgroup cgconfig配置文件:/etc/cgconfig.conf |
4)libcgroup Man Page簡介
man 1 cgclassify -- cgclassify命令是用來將運行的任務移動到一個或者多個cgroup。 man 1 cgclear -- cgclear 命令是用來刪除層級中的全部cgroup。 man 5 cgconfig.conf -- 在cgconfig.conf文件中定義cgroup。 man 8 cgconfigparser -- cgconfigparser命令解析cgconfig.conf文件和並掛載層級。 man 1 cgcreate -- cgcreate在層級中建立新cgroup。 man 1 cgdelete -- cgdelete命令刪除指定的cgroup。 man 1 cgexec -- cgexec命令在指定的cgroup中運行任務。 man 1 cgget -- cgget命令顯示cgroup參數。 man 5 cgred.conf -- cgred.conf是cgred服務的配置文件。 man 5 cgrules.conf -- cgrules.conf 包含用來決定什麼時候任務術語某些 cgroup的規則。 man 8 cgrulesengd -- cgrulesengd 在 cgroup 中發佈任務。 man 1 cgset -- cgset 命令爲 cgroup 設定參數。 man 1 lscgroup -- lscgroup 命令列出層級中的 cgroup。 man 1 lssubsys -- lssubsys 命令列出包含指定子系統的層級。 |
3、Linux Container(LXC)
1、LXC基本概念
1)LXC是什麼
LinuxContainer容器能夠提供輕量級的虛擬化,以便隔離進程和資源,並且不須要提供指令解釋機制以及全虛擬化的其餘複雜性。容器有效地將由單個操做系統管理的資源劃分到孤立的組中,以更好地在孤立的組之間平衡有衝突的資源使用需求。
LXC創建在CGroup基礎上,咱們能夠粗略的認爲LXC = Cgroup+ namespace + Chroot + veth +用戶態控制腳本。LXC利用內核的新特性(CGroup)來提供用戶空間的對象,用來保證資源的隔離和對於應用或者系統的資源控制。
根據LXC官網(http://linuxcontainers.org/)的描述,LXC具備如下特性:
Current LXC uses the following kernel features to contain processes: Kernel namespaces (ipc, uts, mount, pid, network and user) Apparmor and SELinux profiles Seccomp policies Chroots (using pivot_root) Kernel capabilities Control groups (cgroups) |
1)LXC的優點
與虛擬化相比,它的優點在於:
a)不須要指令級模擬;
b)不須要即時(Just-in-time)編譯;
c)容器能夠在CPU核心的本地運行指令,而不須要任何專門的解釋機制;
d)避免了準虛擬化和系統調用替換中的複雜性。
總結來講,就是LXC更加輕量級,具備更小的性能開銷、更快的相應時間。
2、LXC安裝與使用
1)LXC安裝
從sourceforge.net/projects/lxc/files/lxc下載lxc源碼
解壓後進入目錄,執行如下命令:
./configure make sudo make install |
2)LXC經常使用命令
參考:http://www.cnblogs.com/lisperl/archive/2012/04/13/2446179.html
lxc-checkconfig # 查看內核支持 lxc-create -n name -f config lxc-start -n name -f config cmd lxc-execute -n name -f config cmd # 備註:lxc-start只啓動一個進程,即cmd;lxc-execute 啓動兩個進程,lxc-init和cmd lxc-kill -n name #給SIGNUM信號 lxc-stop -n name # 中止lxc內全部進程 lxc-destroy -n name # 銷燬進程 lxc-cgroup -n name subsys value # 控制資源,例如 lxc-cgroup -n name cpuset.cpus 「0,3」 |
3)資源控制
Cores lxc.cgroup.cpuset.cpus=1,2,3 CPU share lxc.cgroup.cpu.shares=1024 # default Memory usage (!Debian) lxc.cgroup.memory.limit_in_bytes = 256M lxc.cgroup.memory.memsw.limit_in_bytes = 1G Disk (blkio) Disk space – standard LVM, quota... echo 100 > /cgroup/disk1/blkio.weight # XXX < 1000 ! echo "3:0 1048576" >/cgroup/disk1/blkio.throttle.read_bps_device lxc.cgroup.blkio.weight = 100 |
4)配置文件樣例
lxc.utsname = host_name lxc.tty = 1 lxc.network.type = veth lxc.network.flags = up lxc.network.link = br0 lxc.network.ipv4 = 192.168.120.105/16 lxc.network.name = eth0 #lxc.mount = ./fstab #lxc.rootfs = /rootfs lxc.cgroup.cpuset.cpus = 0 lxc.cgroup.cpu.shares = 80 |
5)使用中的一些小問題
lxc-ls #列出全部lxc,可是在centos下時常很差用。備註:lxc-create以後,lxc-ls才能看到。可是隻lxc-create,而不execute,則並未實際啓動congtainer,相應cgroup並未實際掛載。 lxc-ps # 列出指定container內的全部進程。備註:lxc-ps –n name或者lxc-ps –n name -- -ef |