容器技術(shù)基石:Linux namespace 和 cgroups,運(yùn)維了解一下

先放結(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, 用戶(hù)
可以通過(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\n", i, IsPrime(i))}}
我創(chuàng)建兩個(gè) CPU 的 cgroups
sudo cgcreate -g cpu:/cpulimitedsudo 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)系。
來(lái)源:https://zhuanlan.zhihu.com/p/55099839
文章轉(zhuǎn)載:高效運(yùn)維
(版權(quán)歸原作者所有,侵刪)

點(diǎn)擊下方“閱讀原文”查看更多
