0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

什么是cgroups?有什么作用?

Linux愛(ài)好者 ? 來(lái)源:未知 ? 作者:工程師郭婷 ? 2018-08-27 11:35 ? 次閱讀

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

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

為什么要了解 cgroups

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

cgroups 的主要作用

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

資源限制:cgroups 可以對(duì)任務(wù)是要的資源總額進(jìn)行限制。比如設(shè)定任務(wù)運(yùn)行時(shí)使用的內(nèi)存上限,一旦超出就發(fā) OOM。

優(yōu)先級(jí)分配:通過(guò)分配的 CPU 時(shí)間片數(shù)量和磁盤 IO 帶寬,實(shí)際上就等同于控制了任務(wù)運(yùn)行的優(yōu)先級(jí)。

資源統(tǒng)計(jì):cgoups 可以統(tǒng)計(jì)系統(tǒng)的資源使用量,比如 CPU 使用時(shí)長(zhǎng)、內(nèi)存用量等。這個(gè)功能非常適合當(dāng)前云端產(chǎn)品按使用量計(jì)費(fèi)的方式。

任務(wù)控制:cgroups 可以對(duì)任務(wù)執(zhí)行掛起、恢復(fù)等操作。

相關(guān)概念

Task(任務(wù))

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

Cgroup(控制組)

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

Subsystem(子系統(tǒng))

cgroups 中的子系統(tǒng)就是一個(gè)資源調(diào)度控制器(又叫 controllers)。比如 CPU 子系統(tǒng)可以控制 CPU 的時(shí)間分配,內(nèi)存子系統(tǒng)可以限制內(nèi)存的使用量。以筆者使用的 Ubuntu 16.04.3 為例,其內(nèi)核版本為 4.10.0,支持的 subsystem 如下( cat /proc/cgroups):

Hierarchy(層級(jí))

層級(jí)有一系列 cgroup 以一個(gè)樹(shù)狀結(jié)構(gòu)排列而成,每個(gè)層級(jí)通過(guò)綁定對(duì)應(yīng)的子系統(tǒng)進(jìn)行資源控制。層級(jí)中的 cgroup 節(jié)點(diǎn)可以包含零個(gè)或多個(gè)子節(jié)點(diǎn),子節(jié)點(diǎn)繼承父節(jié)點(diǎn)掛載的子系統(tǒng)。一個(gè)操作系統(tǒng)中可以有多個(gè)層級(jí)。

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

cgroups 以文件的方式提供應(yīng)用接口,我們可以通過(guò) mount 命令來(lái)查看 cgroups 默認(rèn)的掛載點(diǎn):

$ mount | grep cgroup

第一行的 tmpfs 說(shuō)明 /sys/fs/cgroup 目錄下的文件都是存在于內(nèi)存中的臨時(shí)文件。

第二行的掛載點(diǎn) /sys/fs/cgroup/systemd 用于 systemd 系統(tǒng)對(duì) cgroups 的支持,相關(guān)內(nèi)容筆者今后會(huì)做專門的介紹。

其余的掛載點(diǎn)則是內(nèi)核支持的各個(gè)子系統(tǒng)的根級(jí)層級(jí)結(jié)構(gòu)。

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

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

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

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

既然 cgroups 是以這些文件作為 API 的,那么我就可以通過(guò)創(chuàng)建或者是修改這些文件的內(nèi)容來(lái)應(yīng)用 cgroups。具體該怎么做呢?比如我們?cè)趺床拍芟拗颇硞€(gè)進(jìn)程可以使用的資源呢?接下來(lái)我們就通過(guò)簡(jiǎn)單的 demo 來(lái)演示如何使用 cgroups 限制進(jìn)程可以使用的資源。

查看進(jìn)程所屬的 cgroups

可以通過(guò) /proc/[pid]/cgroup 來(lái)查看指定進(jìn)程屬于哪些 cgroup:

每一行包含用冒號(hào)隔開(kāi)的三列,他們的含義分別是:

cgroup 樹(shù)的 ID, 和 /proc/cgroups 文件中的 ID 一一對(duì)應(yīng)。

和 cgroup 樹(shù)綁定的所有 subsystem,多個(gè) subsystem 之間用逗號(hào)隔開(kāi)。這里 name=systemd 表示沒(méi)有和任何 subsystem 綁定,只是給他起了個(gè)名字叫 systemd。

進(jìn)程在 cgroup 樹(shù)中的路徑,即進(jìn)程所屬的 cgroup,這個(gè)路徑是相對(duì)于掛載點(diǎn)的相對(duì)路徑。

既然 cgroups 是以這些文件作為 API 的,那么我就可以通過(guò)創(chuàng)建或者是修改這些文件的內(nèi)容來(lái)應(yīng)用 cgroups。具體該怎么做呢?比如我們?cè)趺床拍芟拗颇硞€(gè)進(jìn)程可以使用的資源呢?接下來(lái)我們就通過(guò)簡(jiǎn)單的 demo 來(lái)演示如何使用 cgroups 限制進(jìn)程可以使用的資源。

cgroups 工具

在介紹通過(guò) systemd 應(yīng)用 cgroups 之前,我們先使用 cgroup-bin 工具包中的 cgexec 來(lái)演示 demo。Ubuntu 默認(rèn)沒(méi)有安裝 cgroup-bin 工具包,請(qǐng)通過(guò)下面的命令安裝:

$ sudo apt install cgroup-bin

demo:限制進(jìn)程可用的 CPU

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

$cd/sys/fs/cgroup/cpu

$sudo mkdirnick_cpu

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

是不是有點(diǎn)吃驚,cgroups 的文件系統(tǒng)會(huì)在創(chuàng)建文件目錄的時(shí)候自動(dòng)創(chuàng)建這些配置文件!

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

$sudosu

$echo100000>nick_cpu/cpu.cfs_period_us

$echo10000>nick_cpu/cpu.cfs_quota_us

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

voidmain()

{

unsignedinti,end;

end=1024*1024*1024;

for(i=0;i

{

i++;

}

}

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

$gcccputime.c-ocputime

$sudosu

$time./cputime

$timecgexec-gcpu:nick_cpu./cputime

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

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

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

$cd/sys/fs/cgroup/memory

$sudo mkdirnick_memory

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

# 物理內(nèi)存 + SWAP <= 300 MB;1024*1024*300 = 314572800

$sudosu

$echo314572800>nick_memory/memory.limit_in_bytes

$echo0>nick_memory/memory.swappiness

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

#include

#include

#include

#define CHUNK_SIZE 1024 * 1024 * 100

voidmain()

{

char*p;

inti;

for(i=0;i<5;i++)

{

p=malloc(sizeof(char)*CHUNK_SIZE);

if(p==NULL)

{

printf("fail to malloc!");

return;

}

// memset() 函數(shù)用來(lái)將指定內(nèi)存的前 n 個(gè)字節(jié)設(shè)置為特定的值

memset(p,0,CHUNK_SIZE);

printf("malloc memory %d MB ",(i+1)*100);

}

}

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

$ gcc mem.c -o mem

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

$ ./mem

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

$ cgexec -g memory:nick_memory ./mem

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

下面再使用 stress 程序測(cè)試一個(gè)類似的場(chǎng)景(通過(guò) stress 程序申請(qǐng) 500M 的內(nèi)存):

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

stress 程序能夠提供比較詳細(xì)的信息,進(jìn)程被殺掉的方式是收到了 SIGKILL(signal 9) 信號(hào)

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

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

總結(jié)

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

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • cpu
    cpu
    +關(guān)注

    關(guān)注

    68

    文章

    10702

    瀏覽量

    209417
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11123

    瀏覽量

    207921
  • 虛擬化
    +關(guān)注

    關(guān)注

    1

    文章

    355

    瀏覽量

    29673

原文標(biāo)題:Linux cgroups 命令簡(jiǎn)介

文章出處:【微信號(hào):LinuxHub,微信公眾號(hào):Linux愛(ài)好者】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    一文帶你搞懂Docker容器的核心基石Cgroups

    Cgroups 是 Linux 系統(tǒng)內(nèi)核提供的一種機(jī)制,這種機(jī)制可以根據(jù)需求將一些列系統(tǒng)任務(wù)機(jī)器子任務(wù)整合或分離到按資源劃分登記的不同組內(nèi),從而為系統(tǒng)資源管理提供一個(gè)的框架。簡(jiǎn)單地說(shuō),cgroups
    發(fā)表于 11-24 09:54 ?541次閱讀

    三極管的作用哪些?

    三極管的作用哪些?
    發(fā)表于 03-06 09:51 ?5104次閱讀
    三極管的<b class='flag-5'>作用</b><b class='flag-5'>有</b>哪些?

    LED顯示屏的作用和特點(diǎn)哪些

    LED顯示屏的作用和特點(diǎn)哪些 LED顯示屏的作用   1、起到商品宣傳,吸引顧客的作用?! ED廣
    發(fā)表于 03-10 10:57 ?1215次閱讀

    波峰焊其熱作用的過(guò)程區(qū)域作用哪些

    波峰焊中,PCB通過(guò)波峰時(shí)其熱作用過(guò)程大致可分為三個(gè)區(qū)域,分別是助焊劑潤(rùn)濕區(qū)、焊料潤(rùn)濕區(qū)、合金層形成區(qū)。以下分享三點(diǎn)的區(qū)域作用哪些?
    的頭像 發(fā)表于 10-21 09:20 ?4364次閱讀

    電阻器哪些作用

    電阻器大家應(yīng)該是不陌生的,在初中階段,就對(duì)電阻一些性質(zhì)和特點(diǎn)的學(xué)習(xí),但在電阻的學(xué)習(xí)中沒(méi)有包括電阻的作用,而今天就來(lái)講講關(guān)于電阻作用的知識(shí)。
    的頭像 發(fā)表于 02-14 19:41 ?3.3w次閱讀

    藍(lán)牙模塊什么作用 藍(lán)牙芯片的作用 藍(lán)牙芯片什么作用 具體哪些應(yīng)用場(chǎng)景

    在如今生活中,每個(gè)人都接觸了無(wú)線連接、藍(lán)牙傳輸。但是藍(lán)牙模塊還是很少見(jiàn)的。那么藍(lán)牙模塊什么作用呢?具體又有哪些應(yīng)用場(chǎng)景呢?本篇將為大家簡(jiǎn)單介紹藍(lán)牙模塊的作用以及常見(jiàn)的應(yīng)用場(chǎng)景。 藍(lán)牙模塊按照標(biāo)準(zhǔn)分
    發(fā)表于 12-09 11:45 ?7715次閱讀

    減速器的作用是什么,哪些類型

    減速器的作用是什么,哪些類型?
    的頭像 發(fā)表于 09-19 09:02 ?9459次閱讀

    電容器什么作用

    電容器什么作用?
    的頭像 發(fā)表于 03-09 15:16 ?2899次閱讀
    電容器<b class='flag-5'>有</b>什么<b class='flag-5'>作用</b>?

    彈簧彈片測(cè)試儀什么作用

    彈簧彈片測(cè)試儀什么作用?|深圳市磐石測(cè)控儀器有限公司
    的頭像 發(fā)表于 08-23 09:22 ?694次閱讀
    彈簧彈片測(cè)試儀<b class='flag-5'>有</b>什么<b class='flag-5'>作用</b>

    共模電感什么作用與選型技巧?

    共模電感什么作用與選型技巧?|深圳比創(chuàng)達(dá)EMC
    的頭像 發(fā)表于 10-10 11:06 ?3081次閱讀
    共模電感<b class='flag-5'>有</b>什么<b class='flag-5'>作用</b>與選型技巧?

    VTT電源對(duì)DDR什么作用?

    VTT電源對(duì)DDR什么作用?
    的頭像 發(fā)表于 11-27 16:20 ?1533次閱讀
    VTT電源對(duì)DDR<b class='flag-5'>有</b>什么<b class='flag-5'>作用</b>?

    激光切割設(shè)備中模組的作用哪些?

    激光切割設(shè)備中模組的作用哪些?
    的頭像 發(fā)表于 11-23 17:44 ?535次閱讀
    激光切割設(shè)備中模組的<b class='flag-5'>作用</b><b class='flag-5'>有</b>哪些?

    電感哪些特性?電感常見(jiàn)的作用哪些?

    電感哪些特性?電感常見(jiàn)的作用哪些? 電感是一種重要的電子元器件,具有許多特性和廣泛的應(yīng)用。在本文中,我將詳細(xì)介紹電感的特性及其常見(jiàn)的作用。 電感的特性: 1. 自感性:電感器具有自
    的頭像 發(fā)表于 11-29 17:45 ?3146次閱讀

    印制電路板哪些作用

    印制電路板哪些作用
    的頭像 發(fā)表于 12-14 10:28 ?1818次閱讀

    電感對(duì)干擾信號(hào)什么作用?

    電感對(duì)干擾信號(hào)抑制作用。
    的頭像 發(fā)表于 12-22 18:08 ?529次閱讀