五分鐘技術趣談 | 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層級規則
#結合cgroup層級(hierarchy)可以理解為一顆樹,樹的每個節點就是一個進程組,每棵樹都會與一到多個子系統關聯。在一棵樹裡,會包含Linux系統中的所有進程,但每個進程只能屬於一個節點(進程組)。系統中可以有許多cgroup樹,每棵樹都和不同的subsystem關聯,一個進程可以屬於多棵樹,即一個進程可以屬於多個進程組,只是這些進程組和不同的子系統關聯。目前Linux最多可以建造十二顆cgroup樹,每棵樹關聯一個子系統,當然也可以只建造一棵樹,然後讓這棵樹關聯到所有的子系統。當一顆cgroup樹不和任何子系統關聯的時候,意味著這棵樹只是將進程進行分組,至於要在分組的基礎上做些什麼,將由應用程式自己決定,systemd就是這樣一個例子。
層級的組成規則有四個,描述如下:
##規則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所示。
#圖3 cgroup層級規則3
規則4:系統上衍生的任何行程都會建立一個子行程(或執行緒)。子進程自動繼承其父級的cgroup成員資格,但可以根據需要移動到其他cgroup中,移動後父子進程完全獨立,如圖4所示。
#圖4 cgroup層級規則4
Part 04 #cgroup層級關係分析
我們從進程的角度出發,結合原始碼中的資料結構來解析cgroups相關資料之間的關係。首先在Linux中,管理流程的資料結構是task_struct,其中與cgroups有關的成員如下:
- 其中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結構體情況:##########結構體中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一致。
#為了理清楚css_set和cgroup的關係,我們還要對中間層的cg_cgroup_link結構進行分析,結構體資料如下:
#結構體中的資料說明如下:
cgrp_link_list連結到cgroup- >css_sets指向的鍊錶。
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中文網其他相關文章!

熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

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

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

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

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

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

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

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

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

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

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