溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Linux Cgroup基本概念是什么

發(fā)布時間:2021-12-13 15:12:00 來源:億速云 閱讀:142 作者:iii 欄目:云計算

這篇文章主要介紹“ Linux Cgroup基本概念是什么”,在日常操作中,相信很多人在 Linux Cgroup基本概念是什么問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答” Linux Cgroup基本概念是什么”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

Cgroup 是 Linux kernel 的一項功能:它是在一個系統(tǒng)中運行的層級制進程組,你可對其進行資源分配(如 CPU 時間、系統(tǒng)內(nèi)存、網(wǎng)絡帶寬或者這些資源的組合)。通過使用 cgroup,系統(tǒng)管理員在分配、排序、拒絕、管理和監(jiān)控系統(tǒng)資源等方面,可以進行精細化控制。硬件資源可以在應用程序和用戶間智能分配,從而增加整體效率。

cgroup 和 namespace 類似,也是將進程進行分組,但它的目的和 namespace 不一樣,namespace 是為了隔離進程組之間的資源,而 cgroup 是為了對一組進程進行統(tǒng)一的資源監(jiān)控和限制。

cgroup 分 v1 和 v2 兩個版本,v1 實現(xiàn)較早,功能比較多,但是由于它里面的功能都是零零散散的實現(xiàn)的,所以規(guī)劃的不是很好,導致了一些使用和維護上的不便,v2 的出現(xiàn)就是為了解決 v1 中這方面的問題,在最新的 4.5 內(nèi)核中,cgroup v2 聲稱已經(jīng)可以用于生產(chǎn)環(huán)境了,但它所支持的功能還很有限,隨著 v2 一起引入內(nèi)核的還有 cgroup namespace。v1 和 v2 可以混合使用,但是這樣會更復雜,所以一般沒人會這樣用。

1. 為什么需要 cgroup


在 Linux 里,一直以來就有對進程進行分組的概念和需求,比如 session group, progress group 等,后來隨著人們對這方面的需求越來越多,比如需要追蹤一組進程的內(nèi)存和 IO 使用情況等,于是出現(xiàn)了 cgroup,用來統(tǒng)一將進程進行分組,并在分組的基礎(chǔ)上對進程進行監(jiān)控和資源控制管理等。

2. 什么是 cgroup


術(shù)語 cgroup 在不同的上下文中代表不同的意思,可以指整個 Linux 的 cgroup 技術(shù),也可以指一個具體進程組。

cgroup 是 Linux 下的一種將進程按組進行管理的機制,在用戶層看來,cgroup 技術(shù)就是把系統(tǒng)中的所有進程組織成一顆一顆獨立的樹,每棵樹都包含系統(tǒng)的所有進程,樹的每個節(jié)點是一個進程組,而每顆樹又和一個或者多個 subsystem 關(guān)聯(lián),樹的作用是將進程分組,而 subsystem 的作用就是對這些組進行操作。cgroup 主要包括下面兩部分:

  • subsystem : 一個 subsystem 就是一個內(nèi)核模塊,他被關(guān)聯(lián)到一顆 cgroup 樹之后,就會在樹的每個節(jié)點(進程組)上做具體的操作。subsystem 經(jīng)常被稱作 resource controller,因為它主要被用來調(diào)度或者限制每個進程組的資源,但是這個說法不完全準確,因為有時我們將進程分組只是為了做一些監(jiān)控,觀察一下他們的狀態(tài),比如 perf_event subsystem。到目前為止,Linux 支持 12 種 subsystem,比如限制 CPU 的使用時間,限制使用的內(nèi)存,統(tǒng)計 CPU 的使用情況,凍結(jié)和恢復一組進程等,后續(xù)會對它們一一進行介紹。

  • hierarchy : 一個 hierarchy 可以理解為一棵 cgroup 樹,樹的每個節(jié)點就是一個進程組,每棵樹都會與零到多個 subsystem 關(guān)聯(lián)。在一顆樹里面,會包含 Linux 系統(tǒng)中的所有進程,但每個進程只能屬于一個節(jié)點(進程組)。系統(tǒng)中可以有很多顆 cgroup 樹,每棵樹都和不同的 subsystem 關(guān)聯(lián),一個進程可以屬于多顆樹,即一個進程可以屬于多個進程組,只是這些進程組和不同的 subsystem 關(guān)聯(lián)。目前 Linux 支持 12 種 subsystem,如果不考慮不與任何 subsystem 關(guān)聯(lián)的情況(systemd 就屬于這種情況),Linux 里面最多可以建 12 顆 cgroup 樹,每棵樹關(guān)聯(lián)一個 subsystem,當然也可以只建一棵樹,然后讓這棵樹關(guān)聯(lián)所有的 subsystem。當一顆 cgroup 樹不和任何 subsystem 關(guān)聯(lián)的時候,意味著這棵樹只是將進程進行分組,至于要在分組的基礎(chǔ)上做些什么,將由應用程序自己決定,systemd 就是一個這樣的例子。

3. 將資源看作一塊餅


CentOS 7 系統(tǒng)中(包括 Red Hat Enterprise Linux 7),通過將 cgroup 層級系統(tǒng)與 systemd 單位樹捆綁,可以把資源管理設(shè)置從進程級別移至應用程序級別。默認情況下,systemd 會自動創(chuàng)建 slice、scopeservice 單位的層級(具體的意思稍后再解釋),來為 cgroup 樹提供統(tǒng)一結(jié)構(gòu)??梢酝ㄟ^ systemctl 命令創(chuàng)建自定義 slice 進一步修改此結(jié)構(gòu)。

如果我們將系統(tǒng)的資源看成一塊餡餅,那么所有資源默認會被劃分為 3 個 cgroup:System, UserMachine。每一個 cgroup 都是一個 slice,每個 slice 都可以有自己的子 slice,如下圖所示:

Linux Cgroup基本概念是什么

下面我們以 CPU 資源為例,來解釋一下上圖中出現(xiàn)的一些關(guān)鍵詞。

如上圖所示,系統(tǒng)默認創(chuàng)建了 3 個頂級 sliceSystem, UserMachine),每個 slice 都會獲得相同的 CPU 使用時間(僅在 CPU 繁忙時生效),如果 user.slice 想獲得 100% 的 CPU 使用時間,而此時 CPU 比較空閑,那么 user.slice 就能夠如愿以償。這三種頂級 slice 的含義如下:

  • system.slice —— 所有系統(tǒng) service 的默認位置

  • user.slice —— 所有用戶會話的默認位置。每個用戶會話都會在該 slice 下面創(chuàng)建一個子 slice,如果同一個用戶多次登錄該系統(tǒng),仍然會使用相同的子 slice。

  • machine.slice —— 所有虛擬機和 Linux 容器的默認位置

控制 CPU 資源使用的其中一種方法是 shares。shares 用來設(shè)置 CPU 的相對值(你可以理解為權(quán)重),并且是針對所有的 CPU(內(nèi)核),默認值是 1024。因此在上圖中,httpd, sshd, crond 和 gdm 的 CPU shares 均為 1024,System, User 和 Machine 的 CPU shares 也是 1024。

假設(shè)該系統(tǒng)上運行了 4 個 service,登錄了兩個用戶,還運行了一個虛擬機。同時假設(shè)每個進程都要求使用盡可能多的 CPU 資源(每個進程都很繁忙)。

  • system.slice 會獲得 33.333% 的 CPU 使用時間,其中每個 service 都會從 system.slice 分配的資源中獲得 1/4 的 CPU 使用時間,即 8.25% 的 CPU 使用時間。

  • user.slice 會獲得 33.333% 的 CPU 使用時間,其中每個登錄的用戶都會獲得 16.5% 的 CPU 使用時間。假設(shè)有兩個用戶:tomjack,如果 tom 注銷登錄或者殺死該用戶會話下的所有進程,jack 就能夠使用 33.333% 的 CPU 使用時間。

  • machine.slice 會獲得 33.333% 的 CPU 使用時間,如果虛擬機被關(guān)閉或處于 idle 狀態(tài),那么 system.slice 和 user.slice 就會從這 33.333% 的 CPU 資源里分別獲得 50% 的 CPU 資源,然后均分給它們的子 slice。

如果想嚴格控制 CPU 資源,設(shè)置 CPU 資源的使用上限,即不管 CPU 是否繁忙,對 CPU 資源的使用都不能超過這個上限。可以通過以下兩個參數(shù)來設(shè)置:

cpu.cfs_period_us = 統(tǒng)計CPU使用時間的周期,單位是微秒(us) 
cpu.cfs_quota_us = 周期內(nèi)允許占用的CPU時間(指單核的時間,多核則需要在設(shè)置時累加)

systemctl 可以通過 CPUQuota 參數(shù)來設(shè)置 CPU 資源的使用上限。例如,如果你想將用戶 tom 的 CPU 資源使用上限設(shè)置為 20%,可以執(zhí)行以下命令:

$ systemctl set-property user-1000.slice CPUQuota=20%

在使用命令 systemctl set-property 時,可以使用 tab 補全:

$ systemctl set-property user-1000.slice
AccuracySec=            CPUAccounting=          Environment=            LimitCPU=               LimitNICE=              LimitSIGPENDING=        SendSIGKILL=
BlockIOAccounting=      CPUQuota=               Group=                  LimitDATA=              LimitNOFILE=            LimitSTACK=             User=
BlockIODeviceWeight=    CPUShares=              KillMode=               LimitFSIZE=             LimitNPROC=             MemoryAccounting=       WakeSystem=
BlockIOReadBandwidth=   DefaultDependencies=    KillSignal=             LimitLOCKS=             LimitRSS=               MemoryLimit=
BlockIOWeight=          DeviceAllow=            LimitAS=                LimitMEMLOCK=           LimitRTPRIO=            Nice=
BlockIOWriteBandwidth=  DevicePolicy=           LimitCORE=              LimitMSGQUEUE=          LimitRTTIME=            SendSIGHUP=

這里有很多屬性可以設(shè)置,但并不是所有的屬性都是用來設(shè)置 cgroup 的,我們只需要關(guān)注 Block, CPUMemory。

如果你想通過配置文件來設(shè)置 cgroup,service 可以直接在 /etc/systemd/system/xxx.service.d 目錄下面創(chuàng)建相應的配置文件,slice 可以直接在 /run/systemd/system/xxx.slice.d 目錄下面創(chuàng)建相應的配置文件。事實上通過 systemctl 命令行工具設(shè)置 cgroup 也會寫到該目錄下的配置文件中:

$ cat /run/systemd/system/user-1000.slice.d/50-CPUQuota.conf
[Slice]
CPUQuota=20%

查看對應的 cgroup 參數(shù):

$ cat /sys/fs/cgroup/cpu,cpuacct/user.slice/user-1000.slice/cpu.cfs_period_us
100000

$ cat /sys/fs/cgroup/cpu,cpuacct/user.slice/user-1000.slice/cpu.cfs_quota_us
20000

這表示用戶 tom 在一個使用周期內(nèi)(100 毫秒)可以使用 20 毫秒的 CPU 時間。不管 CPU 是否空閑,該用戶使用的 CPU 資源都不會超過這個限制。

CPUQuota 的值可以超過 100%,例如:如果系統(tǒng)的 CPU 是多核,且 CPUQuota 的值為 200%,那么該 slice 就能夠使用 2 核的 CPU 時間。

到此,關(guān)于“ Linux Cgroup基本概念是什么”的學習就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續(xù)學習更多相關(guān)知識,請繼續(xù)關(guān)注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI