先放結(jié)論,namespace 是用來做資源隔離, cgroup 是用來做資源限制。
Namespace
先說Namespace,虛擬技術(shù)基本要求就是資源隔離,簡單的說就是我獨(dú)占當(dāng)前所有的資源。比如我在 8080 端口起 web 服務(wù)器,不用擔(dān)心其他進(jìn)程端口占用。Linux 自帶 namespace 就能達(dá)到這個目的。namespace 從2002 開始開發(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, 用戶
可以通過三個系統(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 也提供了一個和系統(tǒng)調(diào)用同名的 unshare 命令可以非常簡單的創(chuàng)建 namespace。
sudo unshare --fork --pid --mount-proc bash
這樣創(chuàng)建了一個新的 PID namespace 并在里面運(yùn)行了 bash。我們看看當(dāng)前 namespace 的進(jìn)程
在這個 namespace 里,就只有兩個進(jìn)程了。
Cgroups
cgroups 是 control groups 控制組的意思, 可以通過文件系統(tǒng)來訪問這些信息。一般cgroups 掛載在/sys/fs/cgroup
內(nèi)核會讀取這些信息來調(diào)度資源分配給每個進(jìn)程。比如我要限制進(jìn)程占用CPU的時間。我用 Go 寫了一個模擬高 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)建兩個 CPU 的 cgroups
sudo cgcreate -g cpu:/cpulimited
sudo cgcreate -g cpu:/lesscpulimited
cpu.shares 是給內(nèi)核為每個進(jìn)程決定 CPU 計算資源,默認(rèn)值是1024。給 cpulimited 設(shè)置為 512,lesscpulimited 保留默認(rèn)值,那么在這兩個組的進(jìn)程會以1 :2的比例占用CPU。
sudo cgset -r cpu.shares=512 cpulimited
我們來驗(yàn)證一下。
在 cpulimited 起一個進(jìn)程
sudo cgexec -g cpu:cpulimited ./main > /dev/null &
可以看到獨(dú)占了 100% 的 CPU,在 cpulimited 再起一個進(jìn)程
兩個進(jìn)程都在 cpulimited,各占50%的 CPU。在 lesscpulimited 起一個進(jìn)程
sudo cgexec -g cpu:lesscpulimited ./main > /dev/null &
兩個 cpulimited 進(jìn)程的 CPU 之和 與 一個 lesscpulimited 進(jìn)程的 CPU 差不多就是 1:2的關(guān)系。
原文標(biāo)題:容器技術(shù)基石:Linux namespace 和 cgroups,運(yùn)維了解一下
文章出處:【微信公眾號:馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
審核編輯:湯梓紅
-
Linux
+關(guān)注
關(guān)注
87文章
11123瀏覽量
207921 -
服務(wù)器
+關(guān)注
關(guān)注
12文章
8701瀏覽量
84566 -
資源
+關(guān)注
關(guān)注
0文章
59瀏覽量
17732
原文標(biāo)題:容器技術(shù)基石:Linux namespace 和 cgroups,運(yùn)維了解一下
文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論