好湿?好紧?好多水好爽自慰,久久久噜久噜久久综合,成人做爰A片免费看黄冈,机机对机机30分钟无遮挡

主頁 > 知識庫 > linux cgroups詳細介紹

linux cgroups詳細介紹

熱門標簽:河南省鄭州市地圖標注 昆明外呼系統(tǒng) 福州呼叫中心外呼系統(tǒng)哪家好 七大洲地圖標注 地圖標注w是什么方向 新鄉(xiāng)人工智能電話機器人加盟 400電話申請找哪家公司 地圖標注需要提交啥資料入駐 臨汾電銷機器人費用

Cgroups是什么?

cgroups(Control Groups) 是 linux 內(nèi)核提供的一種機制,這種機制可以根據(jù)需求把一系列系統(tǒng)任務及其子任務整合(或分隔)到按資源劃分等級的不同組內(nèi),從而為系統(tǒng)資源管理提供一個統(tǒng)一的框架。簡單說,cgroups 可以限制、記錄任務組所使用的物理資源。本質(zhì)上來說,cgroups 是內(nèi)核附加在程序上的一系列鉤子(hook),通過程序運行時對資源的調(diào)度觸發(fā)相應的鉤子以達到資源追蹤和限制的目的。

本文以 Ubuntu 16.04 系統(tǒng)為例介紹 cgroups,所有的 demo 均在該系統(tǒng)中演示。

為什么要了解 cgroups

在以容器技術為代表的虛擬化技術大行其道的時代了解 cgroups 技術是非常必要的!比如我們可以很方便的限制某個容器可以使用的 CPU、內(nèi)存等資源,這究竟是如何實現(xiàn)的呢?通過了解 cgroups 技術,我們可以窺探到 linux 系統(tǒng)中整個資源限制系統(tǒng)的脈絡。從而幫助我們更好的理解和使用 linux 系統(tǒng)。

cgroups 的主要作用

實現(xiàn) cgroups 的主要目的是為不同用戶層面的資源管理提供一個統(tǒng)一化的接口。從單個任務的資源控制到操作系統(tǒng)層面的虛擬化,cgroups 提供了四大功能:

  • 資源限制:cgroups 可以對任務是要的資源總額進行限制。
  • 比如設定任務運行時使用的內(nèi)存上限,一旦超出就發(fā) OOM。
  • 優(yōu)先級分配:通過分配的 CPU 時間片數(shù)量和磁盤 IO 帶寬,實際上就等同于控制了任務運行的優(yōu)先級。
  • 資源統(tǒng)計:cgoups 可以統(tǒng)計系統(tǒng)的資源使用量,比如 CPU 使用時長、內(nèi)存用量等。這個功能非常適合當前云端產(chǎn)品按使用量計費的方式。
  • 任務控制:cgroups 可以對任務執(zhí)行掛起、恢復等操作。

相關概念

Task(任務) 在 linux 系統(tǒng)中,內(nèi)核本身的調(diào)度和管理并不對進程和線程進行區(qū)分,只是根據(jù) clone 時傳入的參數(shù)的不同來從概念上區(qū)分進程和線程。這里使用 task 來表示系統(tǒng)的一個進程或線程。

Cgroup(控制組) cgroups 中的資源控制以 cgroup 為單位實現(xiàn)。Cgroup 表示按某種資源控制標準劃分而成的任務組,包含一個或多個子系統(tǒng)。一個任務可以加入某個 cgroup,也可以從某個 cgroup 遷移到另一個 cgroup。

Subsystem(子系統(tǒng)) cgroups 中的子系統(tǒng)就是一個資源調(diào)度控制器(又叫 controllers)。比如 CPU 子系統(tǒng)可以控制 CPU 的時間分配,內(nèi)存子系統(tǒng)可以限制內(nèi)存的使用量。以筆者使用的 Ubuntu 16.04.3 為例,其內(nèi)核版本為 4.10.0,支持的 subsystem 如下( cat /proc/cgroups):
blkio 對塊設備的 IO 進行限制。
cpu 限制 CPU 時間片的分配,與 cpuacct 掛載在同一目錄。
cpuacct 生成 cgroup 中的任務占用 CPU 資源的報告,與 cpu 掛載在同一目錄。
cpuset 給 cgroup 中的任務分配獨立的 CPU(多處理器系統(tǒng)) 和內(nèi)存節(jié)點。
devices 允許或禁止 cgroup 中的任務訪問設備。
freezer 暫停/恢復 cgroup 中的任務。
hugetlb 限制使用的內(nèi)存頁數(shù)量。
memory 對 cgroup 中的任務的可用內(nèi)存進行限制,并自動生成資源占用報告。
net_cls 使用等級識別符(classid)標記網(wǎng)絡數(shù)據(jù)包,這讓 Linux 流量控制器(tc 指令)可以識別來自特定 cgroup 任務的數(shù)據(jù)包,并進行網(wǎng)絡限制。
net_prio 允許基于 cgroup 設置網(wǎng)絡流量(netowork traffic)的優(yōu)先級。
perf_event 允許使用 perf 工具來監(jiān)控 cgroup。
pids 限制任務的數(shù)量。

Hierarchy(層級) 層級有一系列 cgroup 以一個樹狀結構排列而成,每個層級通過綁定對應的子系統(tǒng)進行資源控制。層級中的 cgroup 節(jié)點可以包含零個或多個子節(jié)點,子節(jié)點繼承父節(jié)點掛載的子系統(tǒng)。一個操作系統(tǒng)中可以有多個層級。

cgroups 的文件系統(tǒng)接口

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

復制代碼 代碼如下:
$ mount | grep cgroup

第一行的 tmpfs 說明 /sys/fs/cgroup 目錄下的文件都是存在于內(nèi)存中的臨時文件。
第二行的掛載點 /sys/fs/cgroup/systemd 用于 systemd 系統(tǒng)對 cgroups 的支持,相關內(nèi)容筆者今后會做專門的介紹。
其余的掛載點則是內(nèi)核支持的各個子系統(tǒng)的根級層級結構。

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

下面讓我們來探索一下 /sys/fs/cgroup 目錄及其子目錄下都是些什么:

/sys/fs/cgroup 目錄下是各個子系統(tǒng)的根目錄。我們以 memory 子系統(tǒng)為例,看看 memory 目錄下都有什么?

這些文件就是 cgroups 的 memory 子系統(tǒng)中的根級設置。比如 memory.limit_in_bytes 中的數(shù)字用來限制進程的最大可用內(nèi)存,memory.swappiness 中保存著使用 swap 的權重等等。

既然 cgroups 是以這些文件作為 API 的,那么我就可以通過創(chuàng)建或者是修改這些文件的內(nèi)容來應用 cgroups。具體該怎么做呢?比如我們怎么才能限制某個進程可以使用的資源呢?接下來我們就通過簡單的 demo 來演示如何使用 cgroups 限制進程可以使用的資源。

查看進程所屬的 cgroups

可以通過 /proc/[pid]/cgroup 來查看指定進程屬于哪些 cgroup:

每一行包含用冒號隔開的三列,他們的含義分別是:

  • cgroup 樹的 ID, 和 /proc/cgroups 文件中的 ID 一一對應。
  • 和 cgroup 樹綁定的所有 subsystem,多個 subsystem 之間用逗號隔開。這里 name=systemd 表示沒有和任何 subsystem 綁定,只是給他起了個名字叫 systemd。
  • 進程在 cgroup 樹中的路徑,即進程所屬的 cgroup,這個路徑是相對于掛載點的相對路徑。

既然 cgroups 是以這些文件作為 API 的,那么我就可以通過創(chuàng)建或者是修改這些文件的內(nèi)容來應用 cgroups。具體該怎么做呢?比如我們怎么才能限制某個進程可以使用的資源呢?接下來我們就通過簡單的 demo 來演示如何使用 cgroups 限制進程可以使用的資源。

cgroups 工具

在介紹通過 systemd 應用 cgroups 之前,我們先使用 cgroup-bin 工具包中的 cgexec 來演示 demo。Ubuntu 默認沒有安裝 cgroup-bin 工具包,請通過下面的命令安裝:

復制代碼 代碼如下:
$ sudo apt install cgroup-bin

demo:限制進程可用的 CPU

在我們使用 cgroups 時,最好不要直接在各個子系統(tǒng)的根目錄下直接修改其配置文件。推薦的方式是為不同的需求在子系統(tǒng)樹中定義不同的節(jié)點。比如我們可以在 /sys/fs/cgroup/cpu 目錄下新建一個名稱為 nick_cpu 的目錄:

$ cd /sys/fs/cgroup/cpu
$ sudo mkdir nick_cpu

然后查看新建的目錄下的內(nèi)容:

是不是有點吃驚,cgroups 的文件系統(tǒng)會在創(chuàng)建文件目錄的時候自動創(chuàng)建這些配置文件!

讓我們通過下面的設置把 CPU 周期限制為總量的十分之一:

$ sudo su$ echo 100000 > nick_cpu/cpu.cfs_period_us
$ echo 10000 > nick_cpu/cpu.cfs_quota_us

上面的兩個參數(shù)眼熟嗎?沒錯,筆者在《Docker: 限制容器可用的 CPU》一文中介紹的 "--cpu-period=100000 --cpu-quota=200000" 就是由它們實現(xiàn)的。

然后創(chuàng)建一個 CPU 密集型的程序:

void main()
{ unsigned int i, end;
 end = 1024 * 1024 * 1024; 
for(i = 0; i < end; 
) { i ++; }}

保存為文件 cputime.c 編譯并通過不同的方式執(zhí)行:

$ gcc cputime.c -o cputime
$ sudo su$ time ./cputime
$ time cgexec -g cpu:nick_cpu ./cputime

time 命令可以為我們報告程序執(zhí)行消耗的時間,其中的 real 就是我們真實感受到的時間。使用 cgexec 能夠把我們添加的 cgroup 配置 nick_cpu 應用到運行 cputime 程序的進程上。 上圖顯示,默認的執(zhí)行只需要 2s 左右。通過 cgroups 限制 CPU 資源后需要運行 23s。

demo:限制進程可用的內(nèi)存

這次我們來限制進程可用的最大內(nèi)存,在 /sys/fs/cgroup/memory 下創(chuàng)建目錄nick_memory:

$ cd /sys/fs/cgroup/memory
$ sudo mkdir nick_memory

下面的設置把進程的可用內(nèi)存限制在最大 300M,并且不使用 swap:

# 物理內(nèi)存 + SWAP <= 300 MB;1024*1024*300 = 314572800$ sudo su$ echo 314572800 > nick_memory/memory.limit_in_bytes$ echo 0 > nick_memory/memory.swappiness

然后創(chuàng)建一個不斷分配內(nèi)存的程序,它分五次分配內(nèi)存,每次申請 100M:

#include<stdio.h>#include<stdlib.h>#include<string.h>#define CHUNK_SIZE 1024 * 1024 * 100void main(){ char *p; int i; for(i = 0; i < 5; i ++) { p = malloc(sizeof(char) * CHUNK_SIZE); if(p == NULL) { printf("fail to malloc!"); return ; } // memset() 函數(shù)用來將指定內(nèi)存的前 n 個字節(jié)設置為特定的值 memset(p, 0, CHUNK_SIZE); printf("malloc memory %d MB\n", (i + 1) * 100); }}

把上面的代碼保存為 mem.c 文件,然后編譯:

$ gcc mem.c -o mem

執(zhí)行生成的 mem 程序:

$ ./mem

此時一切順利,然后加上剛才的約束試試:

$ cgexec -g memory:nick_memory ./mem

由于內(nèi)存不足且禁止使用 swap,所以被限制資源的進程在申請內(nèi)存時被強制殺死了。

下面再使用 stress 程序測試一個類似的場景(通過 stress 程序申請 500M 的內(nèi)存):

$ sudo cgexec -g memory:nick_memory stress --vm 1 --vm-bytes 500000000 --vm-keep --verbose

stress 程序能夠提供比較詳細的信息,進程被殺掉的方式是收到了 SIGKILL(signal 9) 信號。

實際應用中往往要同時限制多種的資源,比如既限制 CPU 資源又限制內(nèi)存資源。使用 cgexec 實現(xiàn)這樣的用例其實很簡單,直接指定多個 -g 選項就可以了:

$ cgexec -g cpu:nick_cpu -g memory:nick_memory ./cpumem

總結

cgroups 是 linux 內(nèi)核提供的功能,由于牽涉的概念比較多,所以不太容易理解。本文試圖在介紹概念性內(nèi)容的同時,用最簡單的 demo 演示 cgroups 的用法。希望直觀的 demo 能夠幫助大家理解 cgroups。

標簽:臨沂 岳陽 海口 股票 鎮(zhèn)江 紅河 烏海 四川

巨人網(wǎng)絡通訊聲明:本文標題《linux cgroups詳細介紹》,本文關鍵詞  linux,cgroups,詳細,介紹,linux,;如發(fā)現(xiàn)本文內(nèi)容存在版權問題,煩請?zhí)峁┫嚓P信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《linux cgroups詳細介紹》相關的同類信息!
  • 本頁收集關于linux cgroups詳細介紹的相關信息資訊供網(wǎng)民參考!
  • 推薦文章