| 什么是Cgroups
簡(jiǎn)單一句話描述Cgroups:Cgroups是Linux內(nèi)核提供的一種可以限制單個(gè)進(jìn)程或者多個(gè)進(jìn)程所使用資源的機(jī)制,可以對(duì) cpu,內(nèi)存等資源實(shí)現(xiàn)精細(xì)化的控制。
Cgroups全稱是Control Groups,Cgroup為每種可以控制的資源都定義了一個(gè)子系統(tǒng)。它的子系統(tǒng)有:
cpu子系統(tǒng):限制進(jìn)程的cpu使用率;
cpuacct子系統(tǒng):統(tǒng)計(jì)Cgroups中進(jìn)程cpu使用報(bào)告;
cpuset子系統(tǒng):為Cgroups中的進(jìn)程分配單獨(dú)的cpu節(jié)點(diǎn)或者內(nèi)存節(jié)點(diǎn);
memory子系統(tǒng):限制進(jìn)程的memory使用量;
blkio子系統(tǒng):限制進(jìn)程的塊設(shè)備io;
devices子系統(tǒng):控制進(jìn)程能夠訪問(wèn)某些設(shè)備;
net_cls子系統(tǒng):標(biāo)記cgroups中進(jìn)程的網(wǎng)絡(luò)數(shù)據(jù)包,然后可以使用tc模塊(traffic control)對(duì)數(shù)據(jù)包進(jìn)行控制;
freezer子系統(tǒng):掛起或者恢復(fù)cgroups中的進(jìn)程;
其它的具體可以通過(guò)這個(gè)命令查看:
ls /sys/fs/cgroup/| 理解Cgroups如何限制資源
在cpu子系統(tǒng)下創(chuàng)建目錄
cd /sys/fs/cgroup/cpu mkdir container ls container #下面會(huì)自動(dòng)生成諸多文件,這些文件就是資源限制文件 cgroup.clone_children cpuacct.usage cpuacct.usage_percpu_sys cpuacct.usage_user cpu.rt_period_us cpu.stat cgroup.procs cpuacct.usage_all cpuacct.usage_percpu_user cpu.cfs_period_us cpu.rt_runtime_us notify_on_release cpuacct.stat cpuacct.usage_percpu cpuacct.usage_sys cpu.cfs_quota_us cpu.shares tasks執(zhí)行一個(gè)耗費(fèi)cpu資源的進(jìn)程
while : ; do : ; done & #這樣會(huì)做一個(gè)死循環(huán)進(jìn)程,會(huì)導(dǎo)致cpu達(dá)到100% [1] 39963查看quota_us和period_us
[root@localhost container]# cat cpu.cfs_quota_us ##-1表示未做任何限制 -1 [root@localhost container]# cat cpu.cfs_period_us ##這里的100000為us,也就是100ms 100000兩個(gè)值組合在一起,就達(dá)到了一個(gè)限制的作用,修改上面兩個(gè)值
echo 30000 > cpu.cfs_quota_us ##改為30ms,意思是100ms內(nèi),將cpu的限額最多給到30ms,也就是30%再將上面的死循環(huán)進(jìn)程id,做一下限制
echo 39963 > tasks再次用top查看cpu使用率,會(huì)發(fā)現(xiàn)最終會(huì)使用30%,這就是Cgoups的限制。
| 總結(jié)Cgroups
Linux Cgroups的設(shè)計(jì)還是比較易用的,簡(jiǎn)單粗暴地理解呢,它就是一個(gè)子系統(tǒng)目錄加上一組資源限制文件的組合。
而對(duì)于Docker等Linux容器項(xiàng)目來(lái)說(shuō),它們只需要在每個(gè)子系統(tǒng)下面,為每個(gè)容器創(chuàng)建一個(gè)控制組(即創(chuàng)建一個(gè)新目錄),然后在啟動(dòng)容器進(jìn)程之后,把這個(gè)進(jìn)程的PID填寫到對(duì)應(yīng)控制組的tasks文件中就可以了。
而至于在這些控制組下面的資源文件里填上什么值,就靠用戶啟動(dòng)容器時(shí)的參數(shù)指定了。
| 什么是Namespace
Namespace(命名空間)是一種隔離機(jī)制,用于將全局系統(tǒng)資源劃分為多個(gè)獨(dú)立的邏輯部分,以便不同的進(jìn)程或應(yīng)用程序之間能夠使用不同的資源名稱或標(biāo)識(shí)符,避免沖突和混淆。
Linux的Namespace是一種由內(nèi)核直接提供的全局資源封裝,它是內(nèi)核針對(duì)進(jìn)程設(shè)計(jì)的訪問(wèn)隔離機(jī)制。
進(jìn)程在一個(gè)獨(dú)立的 Linux Namespace中會(huì)認(rèn)為它擁有這臺(tái) Linux 主機(jī)上的一切資源,不僅文件系統(tǒng)是獨(dú)立的,還有著獨(dú)立的 PID 編號(hào)(比如擁有自己的 0 號(hào)進(jìn)程,即系統(tǒng)初始化的進(jìn)程)、UID/GID 編號(hào)(比如擁有自己獨(dú)立的 root 用戶)、網(wǎng)絡(luò)(比如完全獨(dú)立的 IP 地址、網(wǎng)絡(luò)棧、防火墻等設(shè)置),等等。
| Namespace分類
事實(shí)上,Linux的Namespace設(shè)計(jì)最早只針對(duì)文件系統(tǒng),但到了后來(lái),要求系統(tǒng)隔離其他訪問(wèn)操作的呼聲就愈發(fā)強(qiáng)烈,從 2006 年起,內(nèi)核陸續(xù)添加了UTS、IPC等命名空間隔離,后續(xù)Linux命名空間支持了以下八種資源的隔離(內(nèi)核的官網(wǎng)Kernel.org上仍然只列出了前六種,從 Linux 的 Man 命令能查到全部八種):
命名空間 | 說(shuō)明 | 內(nèi)核版本 |
Mount | 文件系統(tǒng)隔離 | 2.4.19 |
UTS | 主機(jī)的Hostname、Domain names | 2.6.19 |
IPC | 隔離進(jìn)程間通信的渠道 | 2.6.19 |
PID | 隔離進(jìn)程編號(hào),無(wú)法看到其它命名空間的PID | 2.6.24 |
Network | 隔離網(wǎng)絡(luò)資源,如網(wǎng)卡、網(wǎng)絡(luò)棧、IP地址、端口 | 2.6.29 |
User | 隔離用戶和用戶組 | 3.8 |
Cgroup | 隔離Cgroup信息,進(jìn)程有自己的Cgroup的根目錄視圖 | 4.6 |
Time | 隔離系統(tǒng)時(shí)間 | 5.6 |
容器技術(shù)的產(chǎn)生就是因?yàn)長(zhǎng)inux的Namespace的存在,在Linux系統(tǒng)里要想運(yùn)行多個(gè)容器,那么容器與宿主機(jī)之間、容器與容器之間必須要做到相互隔離,它們會(huì)認(rèn)為自己擁有了整個(gè)硬件以及軟件資源。可以說(shuō)如果沒(méi)有Namespace技術(shù),就不會(huì)有容器技術(shù)。
審核編輯 :李倩
-
Linux
+關(guān)注
關(guān)注
87文章
11293瀏覽量
209338 -
容器
+關(guān)注
關(guān)注
0文章
495瀏覽量
22060
原文標(biāo)題:容器核心技術(shù)Cgroups和Namespace
文章出處:【微信號(hào):aming_linux,微信公眾號(hào):阿銘linux】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論