首頁 運維 Nginx 五分鐘技術趣談 | Linux Cgroup層級規則簡析

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

Jun 09, 2023 pm 02:18 PM
linux

五分钟技术趣谈 | 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中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

vscode需要什麼電腦配置 vscode需要什麼電腦配置 Apr 15, 2025 pm 09:48 PM

VS Code 系統要求:操作系統:Windows 10 及以上、macOS 10.12 及以上、Linux 發行版處理器:最低 1.6 GHz,推薦 2.0 GHz 及以上內存:最低 512 MB,推薦 4 GB 及以上存儲空間:最低 250 MB,推薦 1 GB 及以上其他要求:穩定網絡連接,Xorg/Wayland(Linux)

Linux體系結構:揭示5個基本組件 Linux體系結構:揭示5個基本組件 Apr 20, 2025 am 12:04 AM

Linux系統的五個基本組件是:1.內核,2.系統庫,3.系統實用程序,4.圖形用戶界面,5.應用程序。內核管理硬件資源,系統庫提供預編譯函數,系統實用程序用於系統管理,GUI提供可視化交互,應用程序利用這些組件實現功能。

notepad怎麼運行java代碼 notepad怎麼運行java代碼 Apr 16, 2025 pm 07:39 PM

雖然 Notepad 無法直接運行 Java 代碼,但可以通過借助其他工具實現:使用命令行編譯器 (javac) 編譯代碼,生成字節碼文件 (filename.class)。使用 Java 解釋器 (java) 解釋字節碼,執行代碼並輸出結果。

vscode 無法安裝擴展 vscode 無法安裝擴展 Apr 15, 2025 pm 07:18 PM

VS Code擴展安裝失敗的原因可能包括:網絡不穩定、權限不足、系統兼容性問題、VS Code版本過舊、殺毒軟件或防火牆干擾。通過檢查網絡連接、權限、日誌文件、更新VS Code、禁用安全軟件以及重啟VS Code或計算機,可以逐步排查和解決問題。

vscode終端使用教程 vscode終端使用教程 Apr 15, 2025 pm 10:09 PM

vscode 內置終端是一個開發工具,允許在編輯器內運行命令和腳本,以簡化開發流程。如何使用 vscode 終端:通過快捷鍵 (Ctrl/Cmd ) 打開終端。輸入命令或運行腳本。使用熱鍵 (如 Ctrl L 清除終端)。更改工作目錄 (如 cd 命令)。高級功能包括調試模式、代碼片段自動補全和交互式命令歷史。

git怎麼查看倉庫地址 git怎麼查看倉庫地址 Apr 17, 2025 pm 01:54 PM

要查看 Git 倉庫地址,請執行以下步驟:1. 打開命令行並導航到倉庫目錄;2. 運行 "git remote -v" 命令;3. 查看輸出中的倉庫名稱及其相應的地址。

vscode在哪寫代碼 vscode在哪寫代碼 Apr 15, 2025 pm 09:54 PM

在 Visual Studio Code(VSCode)中編寫代碼簡單易行,只需安裝 VSCode、創建項目、選擇語言、創建文件、編寫代碼、保存並運行即可。 VSCode 的優點包括跨平台、免費開源、強大功能、擴展豐富,以及輕量快速。

vscode 可以用於 mac 嗎 vscode 可以用於 mac 嗎 Apr 15, 2025 pm 07:36 PM

VS Code 可以在 Mac 上使用。它具有強大的擴展功能、Git 集成、終端和調試器,同時還提供了豐富的設置選項。但是,對於特別大型項目或專業性較強的開發,VS Code 可能會有性能或功能限制。

See all articles