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