LINUX CGROUP總結

簡介:

    Linux CGroup全稱Linux Control Group, 是Linux內核的一個功能,用來限制,控制與分離一個進程組羣的資源(如CPU、內存、磁盤輸入輸出等)。這個項目最先是由Google的工程師在2006年發起(主要是Paul Menage和Rohit Seth),最先的名稱爲進程容器(process containers)。在2007年時,由於在Linux內核中,容器(container)這個名詞太過普遍,爲避免混亂,被重命名爲cgroup,而且被合併到2.6.24版的內核中去。而後,其它開始了他的發展。  css

   Linux CGroupCgroup 可​​​讓​​​您​​​爲​​​系​​​統​​​中​​​所​​​運​​​行​​​任​​​務​​​(進​​​程​​​)的​​​用​​​戶​​​定​​​義​​​組​​​羣​​​分​​​配​​​資​​​源​​​ — 比​​​如​​​ CPU 時​​​間​​​、​​​系​​​統​​​內​​​存​​​、​​​網​​​絡​​​帶​​​寬​​​或​​​者​​​這​​​些​​​資​​​源​​​的​​​組​​​合​​​。​​​您​​​可​​​以​​​監​​​控​​​您​​​配​​​置​​​的​​​ cgroup,拒​​​絕​​​ cgroup 訪​​​問​​​某​​​些​​​資​​​源​​​,甚​​​至​​​在​​​運​​​行​​​的​​​系​​​統​​​中​​​動​​​態​​​配​​​置​​​您​​​的​​​ cgroup。node


主要功能:centos

  1. 限制資源使用,好比內存使用上限以及文件系統的緩存限制。
  2. 優先級控制,CPU利用和磁盤IO吞吐。
  3. 一些審計或一些統計,主要目的是爲了計費。
  4. 掛起進程,恢復執行進程。


cgroups子系統


  1. cpu 子系統,主要限制進程的 cpu 使用率。
  2. cpuacct 子系統,能夠統計 cgroups 中的進程的 cpu 使用報告。
  3. cpuset 子系統,能夠爲 cgroups 中的進程分配單獨的 cpu 節點或者內存節點。
  4. memory 子系統,能夠限制進程的 memory 使用量。
  5. blkio 子系統,能夠限制進程的塊設備 io。
  6. devices 子系統,能夠控制進程可以訪問某些設備。
  7. net_cls 子系統,能夠標記 cgroups 中進程的網絡數據包,而後可使用 tc 模塊(traffic control)對數據包進行控制。
  8. net_prio — 這個子系統用來設計網絡流量的優先級
  9. freezer 子系統,能夠掛起或者恢復 cgroups 中的進程。
  10. ns 子系統,可使不一樣 cgroups 下面的進程使用不一樣的 namespace
  11. hugetlb — 這個子系統主要針對於HugeTLB系統進行限制,這是一個大頁文件系統。


cgroups 層級結構(Hierarchy)

       內核使用 cgroup 結構體來表示一個 control group 對某一個或者某幾個 cgroups 子系統的資源限制。cgroup 結構體能夠組織成一顆樹的形式,每一棵cgroup 結構體組成的樹稱之爲一個 cgroups 層級結構。緩存

      cgroups層級結構能夠 attach 一個或者幾個 cgroups 子系統,當前層級結構能夠對其 attach 的 cgroups 子系統進行資源的限制。每個 cgroups 子系統只能被 attach 到一個 cpu 層級結構中。網絡

好好理解下這個圖便可:數據結構


cgroups层级ç»「构示意图


      建立了 cgroups 層級結構中的節點(cgroup 結構體)以後,能夠把進程加入到某一個節點的控制任務列表中,一個節點的控制列表中的全部進程都會受到當前節點的資源限制。同時某一個進程也能夠被加入到不一樣的 cgroups 層級結構的節點中,由於不一樣的 cgroups 層級結構能夠負責不一樣的系統資源。因此說進程和 cgroup 結構體是一個多對多的關係。測試

cgroups层级ç»「构示意图


      上面這個圖從總體結構上描述了進程與 cgroups 之間的關係。最下面的P表明一個進程。每個進程的描述符中有一個指針指向了一個輔助數據結構css_set(cgroups subsystem set)。 指向某一個css_set的進程會被加入到當前css_set的進程鏈表中。一個進程只能隸屬於一個css_set,一個css_set能夠包含多個進程,隸屬於同一css_set的進程受到同一個css_set所關聯的資源限制。ui

     上圖中的」M×N Linkage」說明的是css_set經過輔助數據結構能夠與 cgroups 節點進行多對多的關聯。可是 cgroups 的實現不容許css_set同時關聯同一個cgroups層級結構下多個節點。 這是由於 cgroups 對同一種資源不容許有多個限制配置。centos7

     一個css_set關聯多個 cgroups 層級結構的節點時,代表須要對當前css_set下的進程進行多種資源的控制。而一個 cgroups 節點關聯多個css_set時,代表多個css_set下的進程列表受到同一份資源的相同限制。spa


實踐操做

查看cgroup掛載點(centos7.5):

  1 [root@k8s-master ~]# mount -t cgroup
  2 cgroup on /sys/fs/cgroup/systemd type cgroup (rw,nosuid,nodev,noexec,relatime,xattr,release_agent=/usr/lib/systemd/systemd-cgroups-agent,name=systemd)
  3 cgroup on /sys/fs/cgroup/pids type cgroup (rw,nosuid,nodev,noexec,relatime,pids)
  4 cgroup on /sys/fs/cgroup/cpuset type cgroup (rw,nosuid,nodev,noexec,relatime,cpuset)
  5 cgroup on /sys/fs/cgroup/memory type cgroup (rw,nosuid,nodev,noexec,relatime,memory)
  6 cgroup on /sys/fs/cgroup/cpu,cpuacct type cgroup (rw,nosuid,nodev,noexec,relatime,cpuacct,cpu)
  7 cgroup on /sys/fs/cgroup/blkio type cgroup (rw,nosuid,nodev,noexec,relatime,blkio)
  8 cgroup on /sys/fs/cgroup/freezer type cgroup (rw,nosuid,nodev,noexec,relatime,freezer)
  9 cgroup on /sys/fs/cgroup/hugetlb type cgroup (rw,nosuid,nodev,noexec,relatime,hugetlb)
 10 cgroup on /sys/fs/cgroup/perf_event type cgroup (rw,nosuid,nodev,noexec,relatime,perf_event)
 11 cgroup on /sys/fs/cgroup/devices type cgroup (rw,nosuid,nodev,noexec,relatime,devices)
 12 cgroup on /sys/fs/cgroup/net_cls,net_prio type cgroup (rw,nosuid,nodev,noexec,relatime,net_prio,net_cls)


建立隔離組

[root@k8s-master ~]# cd /sys/fs/cgroup/cpu

[root@k8s-master cpu]# mkdir cpu_test

目錄建立完成會自動生成如下文件
[root@k8s-master cpu]# ls cpu_test/
   1559033413(1)


寫個死循環測試程序增長cpu使用率

  1 int main(void)
  2 {
  3     int i = 0;
  4     for(;;) i++;
  5     return 0;
  6 }

啓動程序後cpu使用100%

image

默認-1不限制,如今改爲20000,能夠理解使用率限制在20%

[root@k8s-master cpu]# echo 20000 > /sys/fs/cgroup/cpu/cpu_test/cpu.cfs_quota_us

找到進程號增長到cpu tasks裏面,在看top  cpu使用率很快就下來

[root@k8s-master ~]# echo 23732 >> /sys/fs/cgroup/cpu/cpu_test/tasks

image


其它資源限制和cpu基本一致就先寫這麼多了

相關文章
相關標籤/搜索