淺談Cgroups V2

 王希剛 360雲計算html

女主宣言linux

以前寫過的一篇文章《淺談Cgroups》中對Cgroups v1進行了介紹,Cgroups爲容器實現虛擬化提供了基礎。隨着容器技術不斷髮展,Cgroups v1中管理controller變得複雜起來。Cgroups v2的出現簡化了Hierarchy,並在kernel 4.5.0版本成爲正式特性。本文將從其產生的背景,相比v1具體有哪些變化等方面,對Cgroups v2進行介紹。git

PS:豐富的一線技術、多元化的表現形式,盡在「360雲計算」,點關注哦!github

1ide

背景優化

以前寫過一篇文章對cgroup v1進行了介紹,可是因爲當前k8s使用cephfs進行數據存儲,當多租戶使用時,須要對IO進行限制。當前cgroup v1因爲memcg與blkio沒有協做,致使buffer io的throttle一直沒有實現。而且cgroup v1在內核的實現一直比較混亂,其中主要的緣由在於,cgroup爲了提供靈活性,容許進程能夠屬於多個hierarchy的不一樣的group。但實際上,多個hierarchy並無太大的用處,由於控制器(controller)只能屬於一個hierarchy。 因此在實際使用中,一般是每一個hierarchy一個控制器。雲計算

這種多hierarchy除了增長代碼的複雜度和理解困難外,並無太大的用處。一方面,跟蹤進程全部controller變得複雜;另外,各個controller之間也很難協同工做(由於controller可能屬於不一樣的hierarchy, 因此從3.16開始,內核開始轉向單一層次(unified hierarchy)。而且實現了對buffer io的限制。spa

2.net

Cgroups v2的變化3d

因爲Cgroups v1存在的種種問題,Cgroups v2將多hierarchy的方式變成了unified hierarchy,並將全部的controller掛載到一個unified hierarchy。

當前kernel沒有移除Cgroups v1版本,容許Cgroups v1和v2兩個版本共存。可是相同的controller不能同時mount到這兩個不一樣的Cgroup版本中。

如下是Cgroups v2的五點改進:

  • Cgroups v2 中全部的controller都會被掛載到一個unified hierarchy下,不在存在像v1中容許不一樣的controller掛載到不一樣的hierarchy的狀況

  • Proess只能綁定到cgroup的根(「/「)目錄和cgroup目錄樹中的葉子節點

  • 經過cgroup.controllers和cgroup.subtree_control指定哪些controller能夠被使用

  • v1版本中的task文件和cpuset controller中的cgroup.clone_children文件被移除

  • 當cgroup爲空時的通知機制獲得改進,經過cgroup.events文件通知

3

unified hierarchy

在Cgroups v1容許將不一樣的controller掛載到不一樣的hierarchies雖然很靈活,但實際上這種方式對於使用者來講是沒有必要的。所以在Cgroups v2版本中,將全部的controller都掛載到一個hierarchies。

可使用下面命令將Cgroups v2掛載到文件系統,而且全部可用的controller會自動被掛載進去。

mount -t cgroup2 none $MOUNT_POINT

一個contoller沒法在Cgroups v1和v2中同時使用,若是想在Cgroups v2使用已經被Cgroups v1使用的controller,則須要先將其從Cgroups v1中umount掉。

要注意的是,系統啓動時,systemd默認使用Cgroups v1,並將可使用的controller mount到/sys/fs/cgroup。若是想在系統啓動時,把Cgroups v1關掉,能夠在/etc/default/grub文件下修改kernel參數,增長GRUB_CMDLINE_LINUX_DEFAULT="cgroup_no_v1=all"。(all表示關閉全部的controller,若是想關閉指定的controller,則將all替換成你須要的controller名稱,並已逗號分隔便可)。這樣就能夠在Cgroups v2中使用你想要的controller了。

4

controllers

當前cgroup v2支持如下controller:

  • io (since Linux 4.5)

  • memory (since Linux 4.5)

  • pids (since Linux 4.5)

  • perf_event (since Linux 4.11)

  • rdma (since Linux 4.11)

  • cpu (since Linux 4.15)

5

subtree control

在hierarchy下的每個Cgroup中都會包含以下兩個文件:

  • cgroup.controllers

    這是一個read-only文件。包含了該Cgroup下全部可用的controllers.

  • cgroup.subtree_control

    這個文件中包含了該Cgroup下已經被開啓的controllers。 而且cgroup.subtree_control中包含的controllers是cgroup.controllers文件controller的子集。

cgroup.subtree_control文件內容格式以下,controller之間使用空格間隔,前面用」+」表示啓用,使用」-「表示停用。好比下面的例子:

echo '+pids -memory' > x/y/cgroup.subtree_control

Cgroups v2的具體組織結構以下圖所示:

image.png

6

"no internal processes" rule

與Cgroups v1不一樣, Cgroups v2只能將進程綁定到葉子節點。所以不能綁定進程到任何一個已開啓controller的任何subgroup中。


image.png

7

cgroup.events file

在Cgroups v2的實現中,也對獲取group empty時獲取通知的機制進行了優化。

Cgroups v1使用release_agent和notify_on_release在v2中被移除。替代的是使用了cgroup.events文件。這是一個只讀的文件,每行一個key value對,key和value之間經過空格分割。

當前在這個文件中只含有一個key就是populated,對應的value是0。0表示cgroup中沒有process,1表示cgroup中包含process。

8

cgroup.stat file

在Cgroups v2 hierarchy下的每一個group都會包含一個只讀文件cgroup.stat。它的內容也是key-value的形式。當前這個文件中包含以下兩個key:

  • nr_descendants

    表示cgroup中存活的subgroup的數量

  • nr_dying_descendants

    表示cgroup中已經死亡的cgroup的數量

9

後代Cgroups數量限制

在Cgroups v2 hierarchy中還包含了兩個用於查看和設置該Cgroups下的後代Cgroups數量的限制文件:

  • cgroup.max.depth (since Linux 4.14)

    這個文件定義子cgroup的最大深度。0意味着不能建立cgroup。若是嘗試建立cgroup,會報EAGAIN錯誤;max表示沒有限制,默認值是max。

  • cgroup.max.descendants (since Linux 4.14)

    當前能夠建立的活躍cgroup目錄的最大數量,默認值」max」表示不限制。超過限制,返回EAGAIN。

相關文章

  • http://man7.org/linux/man-pages/man7/cgroups.7.html

  • https://facebookmicrosites.github.io/cgroup2/docs/create-cgroups.html

  • https://events.static.linuxfound.org/sites/events/files/slides/cgroup_and_namespaces.pdf

  • https://lwn.net/Articles/679786/

  • https://www.lijiaocn.com/%E6%8A%80%E5%B7%A7/2019/01/28/linux-tool-cgroup-detail.html

相關文章
相關標籤/搜索