首頁 > 運維 > Nginx > 主體

五分鐘技術趣談 | Linux Cgroup層級規則簡析

WBOY
發布: 2023-06-09 14:18:48
轉載
2029 人瀏覽過

五分钟技术趣谈 | Linux Cgroup层级规则简析

Part 01 cgroup概述  

cgroup是Control Groups的縮寫,是Linux核心提供的一種可以對進程或進程組進行物理資源(如:CPU,內存,設備IO等)限制、隔離和統計的機制。 cgroup的使用者空間管理是透過cgroup檔案系統來實現,得益於Linux的虛擬檔案系統,其檔案系統的細節被隱藏,使用者透過相關的控製檔案來實現該功能的使用。

cgroup於2.6核心時期由Google公司主導引入,它是Linux核心實作資源虛擬化的技術基礎,是LXC(Linux Containers)和Docker容器的技術基石。 cgroup中有以下相關概念:

  • #任務(task):
  • # #進程的別稱;
  • 控制組(control group):依照某種標準劃分的進程集合。 Cgroup中的資源控制都是以控制群組為單位來實現。進程可以加入到某個控制組,也可以從一個進程組遷移到另一個控制組。一個進程組的進程可以使用cgroups以控制組為單位分配的資源,同時受到cgroup以控制組為單位設定的資源限制。

層級(hierarchy):控制群組的層級關係,採用樹的結構方式組織,子節點的控制組繼承父節點的資源設定屬性。 子系統(subsystem):一個子系統就是一種資源控制器,例如cpu子系統可以控制進程CPU使用時間分配,如圖1所示。子系統必須附件到一個層級才能運作,一個子系統附加到某個層級以後,這個層級上的所有控制組都受到這個子系統的控制。

Part 02

   cgroup子系統  

#cgroup子系統和核心版本有關,隨著核心的迭代,能限制的資源也越來越多,一般包括下列子系統。  #blkio:

##blkio:對輸入/輸出存取存取區塊設備設定限制,例如實體設備(磁碟,固態硬碟,USB等等)。

➤ #cpu:# #限制進程的cpu使用,涉及cpu調度時間片分配。

######➤ ################cpuacct:################################ #自動產生cgroup中任務所使用的cpu報表。 ##################➤ ################cpuset:###############################cpuset:############# #為cgroup中的任務分配獨立cpu(多核心系統)和記憶體節點。 ##########

➤ devices:允許或拒絕cgroup中的任務訪問裝置.

➤ #freezer:# #掛起或恢復cgroup中的任務。

#memory:

#memory:# #設定cgroup中任務使用的記憶體限制,並自動產生由那些任務使用的記憶體資源報告。  

#net_cls:

使用等級識別符標記網路封包,可允許Linux流浪控製程式識別從特定cgroup中產生的封包。

➤ #ns:

# #namespace子系統。

Part 03

  

cgroup層級規則五分钟技术趣谈 | Linux Cgroup层级规则简析

 

#結合cgroup層級(hierarchy)可以理解為一顆樹,樹的每個節點就是一個進程組,每棵樹都會與一到多個子系統關聯。在一棵樹裡,會包含Linux系統中的所有進程,但每個進程只能屬於一個節點(進程組)。系統中可以有許多cgroup樹,每棵樹都和不同的subsystem關聯,一個進程可以屬於多棵樹,即一個進程可以屬於多個進程組,只是這些進程組和不同的子系統關聯。目前Linux最多可以建造十二顆cgroup樹,每棵樹關聯一個子系統,當然也可以只建造一棵樹,然後讓這棵樹關聯到所有的子系統。當一顆cgroup樹不和任何子系統關聯的時候,意味著這棵樹只是將進程進行分組,至於要在分組的基礎上做些什麼,將由應用程式自己決定,systemd就是這樣一個例子。

層級的組成規則有四個,描述如下:

五分钟技术趣谈 | Linux Cgroup层级规则简析##規則1:單一層次結構可以有一個或多個子系統。如圖1所示,/cpu_memory_cg這個層級對cgroup1,cgroup2設定了cpu和memory兩個子系統。

##########圖1 層級規則1############ ######規則2:如果任何一個子系統已經附加到了一個層次,則不能將他們附加到另一個層次的結構中。如圖2所示,層級A的cpu_cg先管理cpu子系統,那麼層級B的cpu_mem_cg就無法管理cpu子系統。 ##################################圖2 cgroup層級規則2##########

規則3:每次在系統上建立新的層次結構時,系統上的所有任務最初都是該層次結構的預設cgroup(稱為根cgroup)成員。對於所建立的任何單一層次結構,系統上的每個任務都可以是該層次結構中的一個cgroup成員。一個任務可以位於多個cgroup中,只要這些cgroup中的每個處於不同的子系統層次結構中即可。一旦任務成為同一層次結構中的第二個cgroup成員,就會將其從該層次結構中的第一個cgroup中刪除,即在同一層次結構中的兩個不通cgroup,絕不會有同一任務,也即是對某進程某類cgroup子系統的限制方式只能有一種。在建立第一個層次結構時,系統上的每個任務都是至少一個cgroup(根cgroup)的成員,因此,在使用cgroup時,每個系統任務總是至少位於一個cgroup中,如圖3所示。

五分钟技术趣谈 | Linux Cgroup层级规则简析

#圖3 cgroup層級規則3

規則4:系統上衍生的任何行程都會建立一個子行程(或執行緒)。子進程自動繼承其父級的cgroup成員資格,但可以根據需要移動到其他cgroup中,移動後父子進程完全獨立,如圖4所示。

五分钟技术趣谈 | Linux Cgroup层级规则简析

#圖4 cgroup層級規則4


Part 04 #cgroup層級關係分析 

我們從進程的角度出發,結合原始碼中的資料結構來解析cgroups相關資料之間的關係。首先在Linux中,管理流程的資料結構是task_struct,其中與cgroups有關的成員如下:

五分钟技术趣谈 | Linux Cgroup层级规则简析

五分钟技术趣谈 | Linux Cgroup层级规则简析

  • 其中cgroup指向一個css_set結構,其儲存了與進程相關的cgroups資訊。 cg_list為使用同一個css_set的進程鍊錶。 css_set架構如下:
  • 結構體的元素資訊解釋如下:
  • refcount是css_set的參考計數,其可以被多個進程共用,只要這些進程的cgroups資訊相同。例如,在所有已經建立的層級裡面都在同一個cgroup裡的進程。

hlist用來把所有css_set建構成一個hash表,核心能快速找到特定的css_set。

######tasks將所有引用此css_set的進程連結成鍊錶。 ##################cg_links指向一個由struct cg_group_link組成的鍊錶##################subsys為一個指標數組,儲存一組指向cgroup_subsys_state的指標。一個cgroup_subsys_state就是一個行程與一個特定的子系統相關的資訊。透過這個指針,進程就可以得到對應的cgroups控制資訊。 #####################接下來我們來看看cgroup_subsys_state結構體情況:#########

五分钟技术趣谈 | Linux Cgroup层级规则简析

#結構體中cgroup指標指向一個cgroup結構,進程受到子系統的資源控制,實際上是透過加入特定的cgroup子系統來實現,因為cgroup在特定的層級上,而子系統又是附加到層級上的。

我們來看看cgroup的結構,

  • sibling,children和parent三個鍊錶負責將同一層級的cgroup連接成一棵樹。
  • susys為先前描述過的子系統指標陣列。
  • root指向了一個cgroupfs_root的結構,就是cgroup所在的層級對應的結構體。
  • root->top_cgroup指向所在層級的根cgroup,也就是幻劍層級時自動建立的那個cgroup。取得層級的根cgroup可以透過cgroup->root->top_cgroup。
  • css_sets指向一個由cg_cgroup_link的鍊錶,和css_set中cg_links一致。

五分钟技术趣谈 | Linux Cgroup层级规则简析

#為了理清楚css_set和cgroup的關係,我們還要對中間層的cg_cgroup_link結構進行分析,結構體資料如下:

五分钟技术趣谈 | Linux Cgroup层级规则简析

#結構體中的資料說明如下:

cgrp_link_list連結到cgroup- >css_sets指向的鍊錶。

五分钟技术趣谈 | Linux Cgroup层级规则简析cgrp則指向此cg_cgroup_link相關的group。

######cg_link_list則連結到css_set->cg_links指向的鍊錶。 ##################cg則指向cg_cgroup_link相關的css_set。 ##################可以看出cgroup和css_set其實是多對多的關係,需要加入一個中間結構將兩者結合,cg_group_link中的cgrp和cg元素就是結合部,cgrp_link_list和cg_link_list兩個鍊錶即為掛接的cgroup和css_set實體,方便輪詢。 ##################從cgroup的層級規則可以看出,一組進程可以同屬於不在同一層級的cgroup,結合理解,一個css_set儲存了一組進程根各個子系統相關的訊息,子系統來自不通的cgroup層級,因此一個css_set儲存的cgroup_subsys_state可以對應多個cgroup。另一方面,cgroup層級也儲存了一組cgroup_subsys_state,其從cgroup所在的層級附加的子系統中獲得,一個cgroup可以有多個進程,進程的css_set不一定相同,因為進程可能使用了多個層級,所以一個cgroup也需要對應多個css_set。圖5詳細描述了多對多的掛接關係。 ##################################圖5 進程與cgroup多對多關係圖####### ##

Part 05  結論 

本文在cgroup概念基礎上,對其和進程之間多對多的關係進行了拆解,從相關結構體中變量的掛接分析其具體代碼實現方式,希望能幫助讀者對cgroup層級關係和使用方式有更好的理解。

#

以上是五分鐘技術趣談 | Linux Cgroup層級規則簡析的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:51cto.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板