先放結(jié)論,namespace 是用來(lái)做資源隔離, cgroup 是用來(lái)做資源限制。
Namespace
先說(shuō)Namespace,虛擬技術(shù)基本要求就是資源隔離,簡(jiǎn)單的說(shuō)就是我獨(dú)占當(dāng)前所有的資源。比如我在 8080 端口起 web 服務(wù)器,不用擔(dān)心其他進(jìn)程端口占用。Linux 自帶 namespace 就能達(dá)到這個(gè)目的。namespace 從2002 開始開發(fā)到現(xiàn)在已經(jīng)快20年的歷史了,到現(xiàn)在一共有6種 namespace:
可以通過(guò)三個(gè)系統(tǒng)調(diào)用的方式
-
clone,創(chuàng)建新的進(jìn)程和新的namespace,新創(chuàng)建的進(jìn)程 attach 到新創(chuàng)建的 namespace
-
unshare,不創(chuàng)建新的進(jìn)程,創(chuàng)建新的 namespace 并把當(dāng)前進(jìn)程 attach 上
-
setns, attach 進(jìn)程到已有的 namespace 上
shell 也提供了一個(gè)和系統(tǒng)調(diào)用同名的 unshare 命令可以非常簡(jiǎn)單的創(chuàng)建 namespace。
sudo unshare --fork --pid --mount-proc bash
這樣創(chuàng)建了一個(gè)新的 PID namespace 并在里面運(yùn)行了 bash。我們看看當(dāng)前 namespace 的進(jìn)程
在這個(gè) namespace 里,就只有兩個(gè)進(jìn)程了。
Cgroups
cgroups 是 control groups 控制組的意思, 可以通過(guò)文件系統(tǒng)來(lái)訪問(wèn)這些信息。一般cgroups 掛載在/sys/fs/cgroup
內(nèi)核會(huì)讀取這些信息來(lái)調(diào)度資源分配給每個(gè)進(jìn)程。比如我要限制進(jìn)程占用CPU的時(shí)間。我用 Go 寫了一個(gè)模擬高 CPU 的代碼。
func IsPrime(value int) bool {
for i := 2; i <= int(math.Floor(float64(value)/2)); i++ {
if value%2 == 0 {
return false
}
}
return true
}
func main() {
for i := 0; i < 999999999; i++ {
fmt.Printf("%v is prime: %v ", i, IsPrime(i))
}
}
我創(chuàng)建兩個(gè) CPU 的 cgroups
sudo cgcreate -g cpu:/cpulimited
sudo cgcreate -g cpu:/lesscpulimited
cpu.shares 是給內(nèi)核為每個(gè)進(jìn)程決定 CPU 計(jì)算資源,默認(rèn)值是1024。給 cpulimited 設(shè)置為 512,lesscpulimited 保留默認(rèn)值,那么在這兩個(gè)組的進(jìn)程會(huì)以1 :2的比例占用CPU。
sudo cgset -r cpu.shares=512 cpulimited
我們來(lái)驗(yàn)證一下。
在 cpulimited 起一個(gè)進(jìn)程
sudo cgexec -g cpu:cpulimited ./main > /dev/null &
可以看到獨(dú)占了 100% 的 CPU,在 cpulimited 再起一個(gè)進(jìn)程
兩個(gè)進(jìn)程都在 cpulimited,各占50%的 CPU。在 lesscpulimited 起一個(gè)進(jìn)程
sudo cgexec -g cpu:lesscpulimited ./main > /dev/null &
兩個(gè) cpulimited 進(jìn)程的 CPU 之和 與 一個(gè) lesscpulimited 進(jìn)程的 CPU 差不多就是 1:2的關(guān)系。
原文標(biāo)題:容器技術(shù)基石:Linux namespace 和 cgroups,運(yùn)維了解一下
文章出處:【微信公眾號(hào):馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
審核編輯:湯梓紅
-
Linux
+關(guān)注
關(guān)注
87文章
11511瀏覽量
213756 -
服務(wù)器
+關(guān)注
關(guān)注
13文章
9793瀏覽量
87957 -
資源
+關(guān)注
關(guān)注
0文章
59瀏覽量
18172
原文標(biāo)題:容器技術(shù)基石:Linux namespace 和 cgroups,運(yùn)維了解一下
文章出處:【微信號(hào):magedu-Linux,微信公眾號(hào):馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
一文帶你搞懂Docker容器的核心基石Cgroups
嵌入式Linux的啟動(dòng)流程簡(jiǎn)介
嵌入式Linux開發(fā)簡(jiǎn)介
Linux簡(jiǎn)介
Linux源代碼簡(jiǎn)介
Linux 2.6 中斷處理原理簡(jiǎn)介
一文讀懂如何選取 Linux 容器鏡像
簡(jiǎn)要介紹了操作系統(tǒng)虛擬化的概念,以及實(shí)現(xiàn)操作系統(tǒng)虛擬化的技術(shù)

什么是cgroups?有什么作用?
ADM1266 Linux API和Python庫(kù)簡(jiǎn)介

簡(jiǎn)述Docker的底層技術(shù)原理之Namespace
容器核心技術(shù)Cgroups和Namespace
Arch Linux RISC-V 端口及相關(guān)作品簡(jiǎn)介
ArmSoM-W3應(yīng)用開發(fā)之安裝docker

評(píng)論