成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

深入理解 Linux Cgroup 系列(一):基本概念

yuanzhanghu / 1004人閱讀

摘要:原文鏈接深入理解系列一基本概念是的一項(xiàng)功能它是在一個(gè)系統(tǒng)中運(yùn)行的層級(jí)制進(jìn)程組,你可對(duì)其進(jìn)行資源分配如時(shí)間系統(tǒng)內(nèi)存網(wǎng)絡(luò)帶寬或者這些資源的組合。

原文鏈接:深入理解 Linux Cgroup 系列(一):基本概念

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

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

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

1. 為什么需要 cgroup

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

2. 什么是 cgroup

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

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

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

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

3. 將資源看作一塊餅

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

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

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

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

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

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

machine.slice —— 所有虛擬機(jī)和 Linux 容器的默認(rèn)位置

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

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

system.slice 會(huì)獲得 33.333% 的 CPU 使用時(shí)間,其中每個(gè) service 都會(huì)從 system.slice 分配的資源中獲得 1/4 的 CPU 使用時(shí)間,即 8.25% 的 CPU 使用時(shí)間。

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

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

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

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

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

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

在使用命令 systemctl set-property 時(shí),可以使用 tab 補(bǔ)全:

$ 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è)置,但并不是所有的屬性都是用來(lái)設(shè)置 cgroup 的,我們只需要關(guān)注 Block, CPUMemory。

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

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

查看對(duì)應(yīng)的 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 在一個(gè)使用周期內(nèi)(100 毫秒)可以使用 20 毫秒的 CPU 時(shí)間。不管 CPU 是否空閑,該用戶使用的 CPU 資源都不會(huì)超過(guò)這個(gè)限制。

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

4. 總結(jié)

本文主要介紹了 cgroup 的一些基本概念,包括其在 CentOS 系統(tǒng)中的默認(rèn)設(shè)置和控制工具,以 CPU 為例闡述 cgroup 如何對(duì)資源進(jìn)行控制。下一篇文章將會(huì)通過(guò)具體的示例來(lái)觀察不同的 cgroup 設(shè)置對(duì)性能的影響。

5. 參考資料

Linux Cgroup系列(01):Cgroup概述

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/7207.html

相關(guān)文章

  • Docker核心技術(shù)預(yù)覽【轉(zhuǎn)+改】

    摘要:一般的硬件虛擬化方法給出的方法是,而給出的方法是,更細(xì)一點(diǎn)講就是。在中,并不能像硬件虛擬化方案一樣能夠定義能力,但是能夠定義輪轉(zhuǎn)的優(yōu)先級(jí),因此具有較高優(yōu)先級(jí)的進(jìn)程會(huì)更可能得到運(yùn)算。 本文簡(jiǎn)單介紹docker使用到的部分核心技術(shù),但不做深入探究,因?yàn)槊恳粋€(gè)技術(shù)都是一個(gè)獨(dú)立的項(xiàng)目,有機(jī)會(huì)再分別詳細(xì)介紹。 來(lái)源地址:http://www.infoq.com/cn/articles/docke...

    Batkid 評(píng)論0 收藏0
  • Flux7 Docker 系列教程():Docker 簡(jiǎn)介

    摘要:本系列教程翻譯自,系列共有九篇,本文譯自第一篇。,一種新的容器化技術(shù),因?yàn)檩p量級(jí)和便攜化而受到廣泛關(guān)注。本篇文章是系列教程的第一篇。鏡像只讀的容器模板,簡(jiǎn)言之就是系統(tǒng)鏡像文件。首先,向發(fā)出請(qǐng)求創(chuàng)建一個(gè)鏡像并且指定容器內(nèi)要運(yùn)行的命令。 本系列教程翻譯自 Flux7 Docker Tutorial Series,系列共有九篇,本文譯自第一篇 Part 1: An Introduction。...

    zhaofeihao 評(píng)論0 收藏0
  • Flux7 Docker 系列教程():Docker 簡(jiǎn)介

    摘要:本系列教程翻譯自,系列共有九篇,本文譯自第一篇。,一種新的容器化技術(shù),因?yàn)檩p量級(jí)和便攜化而受到廣泛關(guān)注。本篇文章是系列教程的第一篇。鏡像只讀的容器模板,簡(jiǎn)言之就是系統(tǒng)鏡像文件。首先,向發(fā)出請(qǐng)求創(chuàng)建一個(gè)鏡像并且指定容器內(nèi)要運(yùn)行的命令。 本系列教程翻譯自 Flux7 Docker Tutorial Series,系列共有九篇,本文譯自第一篇 Part 1: An Introduction。...

    yacheng 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<