Linux namespace 和 cgroups,一次性搞清楚~

語言: CN / TW / HK

先放結論,namespace 是用來做資源隔離, cgroup 是用來做資源限制。

Namespace

先說Namespace,虛擬技術基本要求就是資源隔離,簡單的說就是我獨佔當前所有的資源。比如我在 8080 埠起 web 伺服器,不用擔心其他程序端口占用。Linux 自帶 namespace 就能達到這個目的。namespace 從2002 開始開發到現在已經快20年的歷史了,到現在一共有6種 namespace:

  • mnt, 檔案系統

  • pid, 程序

  • net, 網路

  • ipc, 系統程序通訊

  • uts, hostname

  • user, 使用者

可以通過三個系統呼叫的方式

  • clone,建立新的程序和新的namespace,新建立的程序 attach 到新建立的 namespace

  • unshare,不建立新的程序,建立新的 namespace 並把當前程序 attach 上

  • setns, attach 程序到已有的 namespace 上

shell 也提供了一個和系統呼叫同名的 unshare 命令可以非常簡單的建立 namespace。

sudo unshare --fork --pid --mount-proc bash

這樣建立了一個新的 PID namespace 並在裡面運行了 bash。我們看看當前 namespace 的程序

在這個 namespace 裡,就只有兩個程序了。

Cgroups

cgroups 是 control groups 控制組的意思, 可以通過檔案系統來訪問這些資訊。一般cgroups 掛載在 /sys/fs/cgroup

核心會讀取這些資訊來排程資源分配給每個程序。比如我要限制程序佔用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\n", i, IsPrime(i))
}
}

我建立兩個 CPU 的 cgroups

sudo cgcreate -g cpu:/cpulimited
sudo cgcreate -g cpu:/lesscpulimited

cpu.shares 是給核心為每個程序決定 CPU 計算資源,預設值是1024。給 cpulimited 設定為 512,lesscpulimited 保留預設值,那麼在這兩個組的程序會以1 :2的比例佔用CPU。

sudo cgset -r cpu.shares=512 cpulimited

我們來驗證一下。

在 cpulimited 起一個程序

sudo cgexec -g cpu:cpulimited ./main > /dev/null &

可以看到獨佔了 100% 的 CPU,在 cpulimited 再起一個程序

兩個程序都在 cpulimited,各佔50%的 CPU。在 lesscpulimited 起一個程序

sudo cgexec -g cpu:lesscpulimited ./main > /dev/null &

兩個 cpulimited 程序的 CPU 之和 與 一個 lesscpulimited 程序的 CPU 差不多就是 1:2的關係。

來源:https://zhuanlan.zhihu.com/p/55099839

DevOps 國際峰會 2022 · 北京站正在來臨,敬請期待~

掃碼搶先看精彩內容

近期好文:

記一次 Kubernetes 叢集被入侵,伺服器變礦機

“高效運維”公眾號誠邀廣大技術人員投稿,

投稿郵箱:[email protected],或新增聯絡人微信:greatops1118.

點個“在看”,一年不宕機