先放結(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 開(kāi)始開(kāi)發(fā)到現(xiàn)在已經(jīng)快20年的歷史了,到現(xiàn)在一共有6種 namespace:
-
mnt, 文件系統(tǒng)
-
pid, 進(jìn)程
-
net, 網(wǎng)絡(luò)
-
ipc, 系統(tǒng)進(jìn)程通信
-
uts, hostname
-
user, 用戶
可以通過(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 寫(xiě)了一個(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文章
11326瀏覽量
209959 -
服務(wù)器
+關(guān)注
關(guān)注
12文章
9253瀏覽量
85742 -
資源
+關(guān)注
關(guān)注
0文章
59瀏覽量
17808
原文標(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)先 登錄
相關(guān)推薦
評(píng)論