国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

初探 Linux Cgroups:資源控制的奇妙世界

這篇具有很好參考價值的文章主要介紹了初探 Linux Cgroups:資源控制的奇妙世界。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

Cgroups 是 linux 內(nèi)核提供的功能,由于牽涉的概念比較多,所以不太容易理解。本文試圖通過簡單的描述和 Demo 幫助大家理解 Cgroups 。


如果你對云原生技術充滿好奇,想要深入了解更多相關的文章和資訊,歡迎關注微信公眾號。

搜索公眾號【探索云原生】即可訂閱


1. 什么是 Cgroups

Cgroups 是 Linux 下的一種將進程按組進行管理的機制,它提供了對一組進程及將來子進程的資源限制控制和統(tǒng)計的能力

這些資源包括 CPU、內(nèi)存、存儲、網(wǎng)絡等。通過 Cgroups 可以方便地限制某個進程的資源占用,并且可以實時地監(jiān)控進程的監(jiān)控與統(tǒng)計信息

Cgroups 分 v1 和 v2 兩個版本:

  • v1 實現(xiàn)較早,功能比較多,但是由于它里面的功能都是零零散散的實現(xiàn)的,所以規(guī)劃的不是很好,導致了一些使用和維護上的不便。

  • v2 的出現(xiàn)就是為了解決 v1 的問題,在最新的 4.5 內(nèi)核中,Cgroups v2 聲稱已經(jīng)可以用于生產(chǎn)環(huán)境了,但它所支持的功能還很有限。

v1 和 v2 可以混合使用,但是這樣會更復雜,所以一般沒人會這樣用。

1. 三部分組件

Cgroups 主要包括下面幾部分:

  • cgroups 本身:cgroup 是對進程分組管理的一種機制,一個 cgroup 包含一組進程,并可以在這個 cgroup 上增加 Linux subsystem 的各種參數(shù)配置,將一組進程和一組 subsystem 的系統(tǒng)參數(shù)關聯(lián)起來。
  • subsystem: 一個 subsystem 就是一個內(nèi)核模塊,他被關聯(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 關聯(lián)。在一顆樹里面,會包含 Linux 系統(tǒng)中的所有進程,但每個進程只能屬于一個節(jié)點(進程組)。系統(tǒng)中可以有很多顆 cgroup 樹,每棵樹都和不同的 subsystem 關聯(lián),一個進程可以屬于多顆樹,即一個進程可以屬于多個進程組,只是這些進程組和不同的 subsystem 關聯(lián)。目前 Linux 支持 12 種 subsystem,如果不考慮不與任何 subsystem 關聯(lián)的情況(systemd 就屬于這種情況),Linux 里面最多可以建 12 顆 cgroup 樹,每棵樹關聯(lián)一個 subsystem,當然也可以只建一棵樹,然后讓這棵樹關聯(lián)所有的 subsystem。當一顆 cgroup 樹不和任何 subsystem 關聯(lián)的時候,意味著這棵樹只是將進程進行分組,至于要在分組的基礎上做些什么,將由應用程序自己決定,systemd 就是一個這樣的例子。

3 個部分間的關系

  • 系統(tǒng)在創(chuàng)建了新的 hierarchy 之后,系統(tǒng)中所有的進程都會加入這個 hierarchy 的 cgroup 根節(jié)點,這個 cgroup 根節(jié)點是 hierarchy 默認創(chuàng)建的。
  • 一個 subsystem 只能附加到 一 個 hierarchy 上面。
  • 一個 hierarchy 可以附加多個 subsystem 。
  • 一個進程可以作為多個 cgroup 的成員,但是這些 cgroup 必須在不同的 hierarchy 中。
  • 一個進程 fork 出子進程時,子進程是和父進程在同一個 cgroup 中的,也可以根據(jù)需要將其移動到其他 cgroup 中。

個人理解:

  • cgroup 用于對進程進行分組。
  • hierarchy 則根據(jù)繼承關系,將多個 cgroup 組成一棵樹。
  • subsystem 則負責資源限制的工作,將 subsystem 和 hierarchy 綁定后,該 hierarchy 上的所有 cgroup 下的進程都會被 subsystem 給限制。
    • 子 cgroup 會繼承父 cgroup 的 subsystem,但是子 cgroup 卻可以自定義自己的配置
  • 因此:使用時可以直接在某個已存在的 hierarchy 下創(chuàng)建子 cgroup 或者直接創(chuàng)建一個新的 hierarchy 。

注:后續(xù)的 cgroup 樹就指的是 hierarchy,cgroup 則指 hierarchy 上的節(jié)點。

2. 具體架構(gòu)

看完上面的描述,可能還是搞不清具體的關系,下面幾幅圖比較清晰的展示了 cgroup 中幾部分組件的關系。

這部分內(nèi)容參考:美團技術團隊

hierarchy、cgroup、subsystem 3 者的關系:

比如上圖表示兩個 hierarchiy,每一個 hierarchiy 中是一顆樹形結(jié)構(gòu),樹的每一個節(jié)點是一個 cgroup (比如 cpu_cgrp, memory_cgrp)。

  • 第一個 hierarchiy attach 了 cpu 子系統(tǒng)和 cpuacct 子系統(tǒng), 因此當前 hierarchiy 中的 cgroup 就可以對 cpu 的資源進行限制,并且對進程的 cpu 使用情況進行統(tǒng)計。

  • 第二個 hierarchiy attach 了 memory 子系統(tǒng),因此當前 hierarchiy 中的 cgroup 就可以對 memory 的資源進行限制。

在每一個 hierarchiy 中,每一個節(jié)點(cgroup)可以設置對資源不同的限制權(quán)重(即自定義配置)。比如上圖中 cgrp1 組中的進程可以使用 60%的 cpu 時間片,而 cgrp2 組中的進程可以使用 20%的 cpu 時間片。

cgroups 和 進程間的關系:

上面這個圖從整體結(jié)構(gòu)上描述了進程與 cgroups 之間的關系。最下面的P代表一個進程。

  • 每一個進程的描述符中有一個指針指向了一個輔助數(shù)據(jù)結(jié)構(gòu)css_set(cgroups subsystem set)。 指向某一個css_set的進程會被加入到當前css_set的進程鏈表中。一個進程只能隸屬于一個css_set,一個css_set可以包含多個進程,隸屬于同一css_set的進程受到同一個css_set所關聯(lián)的資源限制。

  • 上圖中的”M×N Linkage”說明的是css_set通過輔助數(shù)據(jù)結(jié)構(gòu)可以與 cgroups 節(jié)點進行多對多的關聯(lián)。但是 cgroups 的實現(xiàn)不允許css_set同時關聯(lián)同一個 cgroups 層級結(jié)構(gòu)下多個節(jié)點。 這是因為 cgroups 對同一種資源不允許有多個限制配置。

  • 一個css_set關聯(lián)多個 cgroups 層級結(jié)構(gòu)的節(jié)點時,表明需要對當前css_set下的進程進行多種資源的控制。而一個 cgroups 節(jié)點關聯(lián)多個css_set時,表明多個css_set下的進程列表受到同一份資源的相同限制。

一個節(jié)點的控制列表中的所有進程都會受到當前節(jié)點的資源限制。同時某一個進程也可以被加入到不同的 cgroups 層級結(jié)構(gòu)的節(jié)點中,因為不同的 cgroups 層級結(jié)構(gòu)可以負責不同的系統(tǒng)資源。所以說進程和 cgroup 結(jié)構(gòu)體是一個多對多的關系。

2. 如何使用 Cgroups

注:本文所有操作在 Ubuntu20.04 下進行。

cgroup 相關的所有操作都是基于內(nèi)核中的 cgroup virtual filesystem,使用 cgroup 很簡單,掛載這個文件系統(tǒng)就可以了。

一般情況下都是掛載到/sys/fs/cgroup 目錄下,當然掛載到其它任何目錄都沒關系。

cgroups 以文件的方式提供應用接口,我們可以通過 mount 命令來查看 cgroups 默認的掛載點:

[root@iZ2zefmrr626i66omb40ryZ ~]# mount | grep cgroup
tmpfs on /sys/fs/cgroup type tmpfs (ro,nosuid,nodev,noexec,mode=755)
cgroup on /sys/fs/cgroup/systemd type cgroup (rw,nosuid,nodev,noexec,relatime,xattr,release_agent=/usr/lib/systemd/systemd-cgroups-agent,name=systemd)
cgroup on /sys/fs/cgroup/perf_event type cgroup (rw,nosuid,nodev,noexec,relatime,perf_event)
cgroup on /sys/fs/cgroup/net_cls,net_prio type cgroup (rw,nosuid,nodev,noexec,relatime,net_cls,net_prio)
cgroup on /sys/fs/cgroup/cpu,cpuacct type cgroup (rw,nosuid,nodev,noexec,relatime,cpu,cpuacct)
cgroup on /sys/fs/cgroup/pids type cgroup (rw,nosuid,nodev,noexec,relatime,pids)
cgroup on /sys/fs/cgroup/rdma type cgroup (rw,nosuid,nodev,noexec,relatime,rdma)
cgroup on /sys/fs/cgroup/memory type cgroup (rw,nosuid,nodev,noexec,relatime,memory)
cgroup on /sys/fs/cgroup/cpuset type cgroup (rw,nosuid,nodev,noexec,relatime,cpuset)
cgroup on /sys/fs/cgroup/blkio type cgroup (rw,nosuid,nodev,noexec,relatime,blkio)
cgroup on /sys/fs/cgroup/devices type cgroup (rw,nosuid,nodev,noexec,relatime,devices)
cgroup on /sys/fs/cgroup/hugetlb type cgroup (rw,nosuid,nodev,noexec,relatime,hugetlb)
cgroup on /sys/fs/cgroup/freezer type cgroup (rw,nosuid,nodev,noexec,relatime,freezer)
  • 第一行的 tmpfs 說明 /sys/fs/cgroup 目錄下的文件都是存在于內(nèi)存中的臨時文件。
  • 第二行的掛載點 /sys/fs/cgroup/systemd 用于 systemd 系統(tǒng)對 cgroups 的支持。
  • 其余的掛載點則是內(nèi)核支持的各個子系統(tǒng)的根級層級結(jié)構(gòu)。

需要注意的是,在使用 systemd 系統(tǒng)的操作系統(tǒng)中,/sys/fs/cgroup 目錄都是由 systemd 在系統(tǒng)啟動的過程中掛載的,并且掛載為只讀的類型。換句話說,系統(tǒng)是不建議我們在 /sys/fs/cgroup 目錄下創(chuàng)建新的目錄并掛載其它子系統(tǒng)的。這一點與之前的操作系統(tǒng)不太一樣。

查看 subsystem 列表

可以通過查看/proc/cgroups(since Linux 2.6.24)知道當前系統(tǒng)支持哪些 subsystem,下面是一個例子:

DESKTOP-9K4GB6E# cat /proc/cgroups
#subsys_name    hierarchy       num_cgroups     enabled
cpuset          11              1               1
cpu             3               64              1
cpuacct         3               64              1
blkio           8               64              1
memory          9               104             1
devices         5               64              1
freezer         10              4               1
net_cls         6               1               1
perf_event      7               1               1
net_prio        6               1               1
hugetlb         4               1               1
pids            2               68              1

從左到右,字段的含義分別是:

  1. subsys_name:subsystem 的名字
  2. hierarchy:subsystem 所關聯(lián)到的 cgroup 樹的 ID,如果多個 subsystem 關聯(lián)到同一顆 cgroup 樹,那么他們的這個字段將一樣,比如這里的 cpu 和 cpuacct 就一樣,表示他們綁定到了同一顆樹。如果出現(xiàn)下面的情況,這個字段將為 0:
    • 當前 subsystem 沒有和任何 cgroup 樹綁定
    • 當前 subsystem 已經(jīng)和 cgroup v2 的樹綁定
    • 當前 subsystem 沒有被內(nèi)核開啟
  3. num_cgroups:subsystem 所關聯(lián)的 cgroup 樹中進程組的個數(shù),也即樹上節(jié)點的個數(shù)
  4. enabled:1 表示開啟,0 表示沒有被開啟(可以通過設置內(nèi)核的啟動參數(shù)“cgroup_disable”來控制 subsystem 的開啟).

hierarchy 相關操作

掛載

Linux 中,用戶可以使用 mount 命令掛載 cgroups 文件系統(tǒng):

語法為: mount -t cgroup -o subsystems name /cgroup/name

  • 其中 subsystems 表示需要掛載的 cgroups 子系統(tǒng)
  • /cgroup/name 表示掛載點

這條命令同在內(nèi)核中創(chuàng)建了一個 hierarchy 以及一個默認的 root cgroup。

示例:

掛載一個和 cpuset subsystem 關聯(lián)的 hierarchy 到 ./cg1 目錄

# 首先肯定是創(chuàng)建對應目錄
mkdir cg1
# 具體掛載操作--參數(shù)含義如下
# -t cgroup 表示操作的是 cgroup 類型,
# -o cpuset 表示要關聯(lián) cpuset subsystem,可以寫0個或多個,0個則是關聯(lián)全部subsystem,
# cg1 為 cgroup 的名字,
# ./cg1 為掛載目標目錄。
mount -t cgroup -o cpuset cg1 ./cg1
# 掛載一顆和所有subsystem關聯(lián)的cgroup樹到cg1目錄
mkdir cg1
mount -t cgroup cg1 ./cg1

#掛載一顆與cpu和cpuacct subsystem關聯(lián)的cgroup樹到 cg1 目錄
mkdir cg1
mount -t cgroup -o cpu,cpuacct cg1 ./cg1

# 掛載一棵cgroup樹,但不關聯(lián)任何subsystem,這systemd所用到的方式
mkdir cg1
mount -t cgroup -o none,name=cg1 cg1 ./cg1

卸載

作為文件系統(tǒng),同樣是使用umount 命令卸載。

# 指定路徑來卸載,而不是名字。
$ umount /path/to/your/hierarchy

例如

umount /sys/fs/cgroup/hierarchy

cgroup 相關操作

創(chuàng)建 cgroup 比較簡單,直接在 hierarchy 或 cgroup 目錄下創(chuàng)建子目錄(mkdir)即可。

刪除則是刪除對應目錄(rmdir)。

注:不能直接遞歸刪除對應目錄,因為目錄中的文件是虛擬的,遞歸刪除時會報錯。

也可以借助 libcgroup 工具來創(chuàng)建或刪除。

使用 libcgroup 工具前,請先安裝 libcgroup 和 libcgroup-tools 數(shù)據(jù)包

redhat 系統(tǒng)安裝:

$ yum install libcgroup
$ yum install libcgroup-tools

ubuntu 系統(tǒng)安裝:

$ apt-get install cgroup-bin
# 如果提示cgroup-bin找不到,可以用 cgroup-tools 替換
$ apt-get install cgroup-tools

具體語法:

# controllers就是subsystem
# path可以用相對路徑或者絕對路徑
$ cgdelete controllers:path

例如:

cgdelete cpu:./mycgroup

3. 演示

分別演示以下直接在某個已存在的 hierarchy 下創(chuàng)建子 cgroup 或者直接創(chuàng)建一個新的 hierarchy 兩種方式。

1. 新 hierarchy 方式

創(chuàng)建 hierarchy

首先,要創(chuàng)建并掛載一個 hierarchy。

# 創(chuàng)建一個目錄作為掛載點
lixd  ~ $ mkdir cgroup-test
# 創(chuàng)建一個不掛載任何subsystem的hierarchy,由于 name=cgroup-test 的 cgroup 不存在,所以這里會由hierarchy默認創(chuàng)建出來
 ? lixd  ~ $ sudo mount -t cgroup -o none,name=cgroup-test cgroup-test ./cgroup-test
 lixd  ~ $ cd cgroup-test
 lixd  ~/cgroup-test $ ls
 # 可以發(fā)現(xiàn)多了幾個文件
cgroup.clone_children  cgroup.procs  cgroup.sane_behavior  notify_on_release  release_agent  tasks

這些文件就是 hierarchy 中 cgroup 根節(jié)點的配置項。具體含義如下:

  • cgroup.clone_ children, cpuset 的 subsystem 會讀取這個配置文件,如果這個值是 1 (默認是 0),子 cgroup 才會繼承父 cgroup 的 cpuset 的配置。

  • cgroup.procs 是樹中當前節(jié)點 cgroup 中的進程組 ID,現(xiàn)在的位置是在根節(jié)點,這個文件中會有現(xiàn)在系統(tǒng)中所有進程組的 ID。

  • notify_on_release 和 release agent 會一起使用。 notify_on_release 標識當這個 cgroup 最后一個進程退出的時候是否執(zhí)行了 release_agent; release_agent 則是一個路徑,通常用作進程退出之后自動清理掉不再使用的 cgroup。

  • tasks 標識該 cgroup 下面的進程 ID,如果把一個進程 ID 寫到 tasks 文件中,便會將相應的進程加入到這個 cgroup 中。

創(chuàng)建子 cgroup

然后,從剛創(chuàng)建好的 hierarchy 上 cgroup 根節(jié)點中擴展出兩個子 cgroup:

 # 創(chuàng)建子cgroup cgroup-1
 lixd  ~/cgroup-test $ sudo mkdir cgroup-1
  # 創(chuàng)建子cgroup cgroup-1
 lixd  ~/cgroup-test $ sudo mkdir cgroup-2
 lixd  ~/cgroup-test $ tree
.
├── cgroup-1
│   ├── cgroup.clone_children
│   ├── cgroup.procs
│   ├── notify_on_release
│   └── tasks
├── cgroup-2
│   ├── cgroup.clone_children
│   ├── cgroup.procs
│   ├── notify_on_release
│   └── tasks
├── cgroup.clone_children
├── cgroup.procs
├── cgroup.sane_behavior
├── notify_on_release
├── release_agent
└── tasks

可以看到,在一個 cgroup 的目錄下創(chuàng)建文件夾時,Kernel 會把文件夾標記為這個 cgroup 的子 cgroup,它們會繼承父 cgroup 的屬性。

在 cgroup 中添加和移動進程

一個進程在一個 Cgroups 的 hierarchy 中,只能在一個 cgroup 節(jié)點上存在,系統(tǒng)的所有進程都會默認在根節(jié)點上存在。

想要將進程移動到其他 cgroup 節(jié)點,只需要將進程 ID 寫到目標 cgroup 節(jié)點的 tasks 文件中即可。

將當前 shell 所在進程添加到 tasks:

cgroup-test#cd cgroup-1
# 需要 root 權(quán)限
cgroup-1# echo $$ >> tasks
cgroup-1# cat tasks
7575
cgroup-1# cat /proc/7575/cgroup
14:name=cgroup-test:/cgroup-1 # 可以看到該進程已經(jīng)被加入到cgroup中了
13:rdma:/
12:pids:/
11:hugetlb:/
10:net_prio:/
9:perf_event:/
8:net_cls:/
7:freezer:/
6:devices:/
5:blkio:/a
4:cpuacct:/
3:cpu:/
2:cpuset:/
1:memory:/
0::/

通過 subsystem 限制 cgroup 中的進程

在上面創(chuàng)建 hierarchy 的時候,這個 hierarchy 并沒有關聯(lián)到任何的 subsystem ,所以沒辦法通過那個 hierarchy 中的 cgroup 節(jié)點限制進程的資源占用。

即 只能在創(chuàng)建 hierarchy 時指定要關聯(lián)哪些 subsystem,創(chuàng)建后就無法修改。

其實系統(tǒng)默認已經(jīng)為每個 subsystem 創(chuàng)建了一個默認的 hierarchy,比如 memory 的 hierarchy。

2. 子 cgroup 方式

在很多使用 systemd 的系統(tǒng)中,systemd 已經(jīng)幫我們將各個 subsystem 和 cgroup 樹關聯(lián)并掛載好了:

DESKTOP-9K4GB6E# mount |grep cgroup
tmpfs on /sys/fs/cgroup type tmpfs (rw,nosuid,nodev,noexec,relatime,mode=755)
cgroup2 on /sys/fs/cgroup/unified type cgroup2 (rw,nosuid,nodev,noexec,relatime,nsdelegate)
cgroup on /sys/fs/cgroup/cpuset type cgroup (rw,nosuid,nodev,noexec,relatime,cpuset)
cgroup on /sys/fs/cgroup/cpu type cgroup (rw,nosuid,nodev,noexec,relatime,cpu)
cgroup on /sys/fs/cgroup/cpuacct type cgroup (rw,nosuid,nodev,noexec,relatime,cpuacct)
cgroup on /sys/fs/cgroup/blkio type cgroup (rw,nosuid,nodev,noexec,relatime,blkio)
cgroup on /sys/fs/cgroup/memory type cgroup (rw,nosuid,nodev,noexec,relatime,memory)
cgroup on /sys/fs/cgroup/devices type cgroup (rw,nosuid,nodev,noexec,relatime,devices)
cgroup on /sys/fs/cgroup/freezer type cgroup (rw,nosuid,nodev,noexec,relatime,freezer)
cgroup on /sys/fs/cgroup/net_cls type cgroup (rw,nosuid,nodev,noexec,relatime,net_cls)
cgroup on /sys/fs/cgroup/perf_event type cgroup (rw,nosuid,nodev,noexec,relatime,perf_event)
cgroup on /sys/fs/cgroup/net_prio type cgroup (rw,nosuid,nodev,noexec,relatime,net_prio)
cgroup on /sys/fs/cgroup/hugetlb type cgroup (rw,nosuid,nodev,noexec,relatime,hugetlb)
cgroup on /sys/fs/cgroup/pids type cgroup (rw,nosuid,nodev,noexec,relatime,pids)
cgroup on /sys/fs/cgroup/rdma type cgroup (rw,nosuid,nodev,noexec,relatime,rdma)
cgroup-test on /home/lixd/cgroup-test type cgroup (rw,relatime,name=cgroup-test)

因此我們可以直接在對應 cgroup 樹下創(chuàng)建子 cgroup 即可。

直接進到 /sys/fs/cgroup/cpu 目錄創(chuàng)建 cgroup-cpu 子目錄即可:

DESKTOP-9K4GB6E# cd /sys/fs/cgroup/cpu
DESKTOP-9K4GB6E# mkdir cgroup-cpu
DESKTOP-9K4GB6E# cd cgroup-cpu
DESKTOP-9K4GB6E# ls
cgroup.clone_children  cpu.cfs_period_us  cpu.rt_period_us   cpu.shares  notify_on_release
cgroup.procs           cpu.cfs_quota_us   cpu.rt_runtime_us  cpu.stat    tasks

簡單跑個程序測試一下,執(zhí)行下面這條命令

DESKTOP-9K4GB6E# while : ; do : ; done &
[1] 12887

顯然,它執(zhí)行了一個死循環(huán),可以把計算機的 CPU 吃到 100%,根據(jù)它的輸出,我們可以看到這個腳本在后臺運行的進程號(PID)是 12887。

查看一下 CPU 占用:

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
12887 root      25   5   14912   1912      0 R 100.0   0.0   0:33.31 zsh

果然這個 PID=12887 的進程占用了差不多 100% 的 CPU。

結(jié)下來我們就通過 Cgroups 對其進行限制,這里就用前面創(chuàng)建的 cgroup-cpu 控制組。

我們可以通過查看 container 目錄下的文件,看到 container 控制組里的 CPU quota 還沒有任何限制(即:-1),CPU period 則是默認的 100 ms(100000 us):

DESKTOP-9K4GB6E# cat /sys/fs/cgroup/cpu/cgroup-cpu/cpu.cfs_quota_us
-1
DESKTOP-9K4GB6E# cat /sys/fs/cgroup/cpu/cgroup-cpu/cpu.cfs_period_us
100000

接下來,我們可以通過修改這些文件的內(nèi)容來設置限制。比如,向 container 組里的 cfs_quota 文件寫入 20 ms(20000 us):

$ echo 20000 > /sys/fs/cgroup/cpu/cgroup-cpu/cpu.cfs_quota_us

這樣意味著在每 100 ms 的時間里,被該控制組限制的進程只能使用 20 ms 的 CPU 時間,也就是說這個進程只能使用到 20% 的 CPU 帶寬。

接下來,我們把被限制的進程的 PID 寫入 container 組里的 tasks 文件,上面的設置就會對該進程生效了:

$ echo 12887 > /sys/fs/cgroup/cpu/cgroup-cpu/tasks

使用 top 指令查看一下

PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
12887 root      25   5   14912   1912      0 R  20.3   0.0   2:51.05 zsh

果然 CPU 被限制到了 20%。

4. 小結(jié)

Cgroups 是 Linux 下的一種將進程按組進行管理的機制,它提供了對一組進程及將來子進程的資源限制控制和統(tǒng)計的能力。

cgroups 分為以下三個部分:

  • cgroup 本身:對進程進行分組

  • hierarchy:將 cgroup 形成樹形結(jié)構(gòu)

  • subsystem:真正起到限制作用的部組件

使用步驟:

  • 1)創(chuàng)建 cgroup
  • 2)配置 subsystem 參數(shù)
  • 3)將進程加入到該 cgroup

如果你對云原生技術充滿好奇,想要深入了解更多相關的文章和資訊,歡迎關注微信公眾號。

搜索公眾號【探索云原生】即可訂閱


5. 參考

cgroups(7) — Linux manual page

Control groups series by Neil Brown

美團技術團隊---Linux 資源管理之 cgroups 簡介

Red Hat---資源管理指南

Linux Cgroup 系列(01):Cgroup 概述文章來源地址http://www.zghlxwxcb.cn/news/detail-777033.html

到了這里,關于初探 Linux Cgroups:資源控制的奇妙世界的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權(quán),不承擔相關法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 深入剖析 Linux Cgroups 子系統(tǒng):資源精細管理

    本章主要演示以下 cgroups 下各個 subsystem 的作用。 根據(jù)難易程度,依次演示了 pids 、cpu 和 memory 3 個 subsystem 的使用。 注:本文所有操作在 Ubuntu20.04 下進行。 如果你對云原生技術充滿好奇,想要深入了解更多相關的文章和資訊,歡迎關注微信公眾號。 搜索公眾號【 探索云原

    2024年02月02日
    瀏覽(20)
  • linux 內(nèi)核資源配置--cgroups詳解以及在docker中的應用

    linux 內(nèi)核資源配置--cgroups詳解以及在docker中的應用

    1.1、cgroups 是什么 Linux cgroup (Control Groups)是 Linux 內(nèi)核提供的一種機制, 用于限制進程組使用的資源(如 CPU、內(nèi)存、磁盤 I/O 等) 。通過將進程組劃分為層次結(jié)構(gòu),并將資源限制應用于不同層次的組,可以實現(xiàn)對系統(tǒng)資源的統(tǒng)一管理和限制。 cgroup 提供了一套 API,用于創(chuàng)建

    2024年02月16日
    瀏覽(25)
  • Hadoop YARN Cgroups 資源隔離講解

    Hadoop YARN Cgroups 資源隔離講解

    Hadoop YARN (Yet Another Resource Negotiator) 使用 Cgroups (Control Groups)來進行資源管理和隔離。 Cgroups 是 Linux 內(nèi)核提供的一種機制,用于限制、賬戶和隔離進程組(process groups)的資源(例如 CPU、內(nèi)存、磁盤 I/O 等)。 以下是 Hadoop YARN Cgroups 的主要講解: 資源隔離和管理: Cgroups 允

    2024年02月01日
    瀏覽(46)
  • 500行代碼手寫docker-實現(xiàn)硬件資源限制cgroups

    本系列教程主要是為了弄清楚容器化的原理,紙上得來終覺淺,絕知此事要躬行,理論始終不及動手實踐來的深刻,所以這個系列會用go語言實現(xiàn)一個類似docker的容器化功能,最終能夠容器化的運行一個進程。 本章的源碼已經(jīng)上傳到github,地址如下: 之前我們對容器的網(wǎng)絡命

    2024年02月06日
    瀏覽(21)
  • 穿越時空:未來云計算的奇妙世界

    穿越時空:未來云計算的奇妙世界

    ??歡迎來到云計算技術應用專欄~穿越時空:未來云計算的奇妙世界 ☆* o(≧▽≦)o *☆嗨~我是IT·陳寒?? ?博客主頁:IT·陳寒的博客 ??該系列文章專欄:云計算技術應用 ??其他專欄:Java學習路線 Java面試技巧 Java實戰(zhàn)項目 AIGC人工智能 數(shù)據(jù)結(jié)構(gòu)學習 云計算技術應用 ??文章

    2024年02月05日
    瀏覽(22)
  • 探索stable diffusion的奇妙世界--01

    探索stable diffusion的奇妙世界--01

    目錄 1. 理解prompt提示詞: 2. Prompt中的技術參數(shù): 3. Prompt中的Negative提示詞: 4. Prompt中的特殊元素: 5. Prompt在stable diffusion中的應用: 6. 作品展示: 在AI藝術領域,stable diffusion模型正以其令人驚嘆的創(chuàng)造力和細節(jié)處理能力,引領著一場革命。在這篇文章中,我們將深入探討一

    2024年03月10日
    瀏覽(21)
  • AI創(chuàng)作之旅:探索提示工程的奇妙世界

    AI創(chuàng)作之旅:探索提示工程的奇妙世界

    ?? 個人網(wǎng)站:【 海擁】【神級代碼資源網(wǎng)站】【辦公神器】 ?? 基于Web端打造的:??輕量化工具創(chuàng)作平臺 ?? 想尋找共同學習交流的小伙伴,請點擊【全棧技術交流群】 在當今信息爆炸的時代,人工智能的發(fā)展為創(chuàng)作者們提供了全新的可能性。本文將引導你從零開始,利用

    2024年01月23日
    瀏覽(21)
  • 解鎖無限可能:深入探索Docker的奇妙世界

    Docker是一個開源的容器化平臺,它以輕量級和可移植的方式打包應用程序及其所有依賴項,并提供了一種標準化的部署方式。通過使用Docker,開發(fā)人員可以將應用程序與其依賴項打包到一個稱為容器的可執(zhí)行單元中,然后在不同的環(huán)境中部署和運行這些容器。 容器化:Docke

    2024年02月01日
    瀏覽(19)
  • Python 探索 Tello 無人機的奇妙世界

    Python 探索 Tello 無人機的奇妙世界

    如果您希望使用 Tello 無人機拍攝照片并將其傳輸?shù)侥?PC,那么您走運了! 只需幾行 Python 代碼,您就可以輕松控制您的 Tello 拍照,然后將 JPEG 圖片傳輸?shù)侥挠嬎銠C。 首先,確保在 Python 環(huán)境中安裝了必要的包。 你需要 djitellopy 包來與你的 Tello 通信,需要 opencv-python 包來

    2024年02月14日
    瀏覽(20)
  • Facebook的魅力魔法:探訪數(shù)字社交的奇妙世界

    Facebook的魅力魔法:探訪數(shù)字社交的奇妙世界

    1. 社交媒體的演變與Facebook的角色 在數(shù)字化時代,社交媒體已經(jīng)成為我們?nèi)粘I钪胁豢苫蛉钡囊徊糠?。而在眾多的社交媒體平臺中,F(xiàn)acebook 以其深厚的歷史和廣泛的影響力,成為了全球數(shù)億用戶溝通、分享和互動的主要場所。從其初創(chuàng)之時起,F(xiàn)acebook 就致力于連接人與人之

    2024年04月27日
    瀏覽(14)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包