Linux Cgroups技術概述_第1頁
Linux Cgroups技術概述_第2頁
Linux Cgroups技術概述_第3頁
Linux Cgroups技術概述_第4頁
免費預覽已結束,剩余1頁可下載查看

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、Linux Cgroups 技術概述Cgroups 是什么?cgroups 全稱為 Control Groups(控制組), 是 Linux 內核提供的一種機制,可以根據需求把一個系列的任務以及其子任務整合 / 或者分割到按資源分等級的不同組內,從而給系統資源管理器提供一個統一的框架。簡單來說,就是 cgroups 可以記錄、限制任務組所使用的物理資源。本質上,其實就是內核附加到程序上的 hook(鉤子)腳本,通過運行程序時,觸發相應的鉤子腳本以達到資源追蹤、限制資源的目的。為什么要了解 Cgroups ?現在容器技術(docker 等)使用的較為頻繁, 但是我們并不了解容器中可以使用的 CP

2、U、內存等資源是怎么進行限制的,其中的原理又是如何實現的呢?也不太清楚,不過,通過學習 cgroups 技術, 我覺得可以幫助我們窺探到其中的一點點門道,而且還能更好的助我們理解和使用 linux 系統。Cgroups 有什么作用 ?cgroups 的主要作用 實現 cgroups 的主要目的是為不同用戶層面的資源管理提供一個統一化的接口。 從單個任 務的資源控制到操作系統層面的虛擬化,cgroups 提供了四大功能:資源限制:cgroups 可以對任務是要的資源總額進行限制。優先級分配:通過控制分配的 CPU 時間片數量和磁盤 IO 帶寬,實際上就等同于控制了任務運行的優先級了。資源統計:c

3、groups 可以統計系統的資源使用量, cpu 使用時間、內存用量等。這個功能適用于云端按照使用量計費的方式。任務控制:cgroups 可以對任務執行掛起、恢復等操作。基本概念Cgroups 中的資源控制一 cgroup 為單位實現。Cgroup 表示按某種資源控制標準劃分而成的任務組,包含一個或多個子系統。一個任務可以加入某個 cgroup,也可以從某個 cgroup 遷移到另一個cgroup。Subsystem( 子系統 ) cgroups 中的子系統就是一個資源調度控制器 ( 又叫 controllers)。比如 CPU 子系統可以控制 CPU 的時間分配周期,內存子系統可以限制內存的

4、使用量。我以本地環境為例子,支持的 subsystem 如下 ( cat /proc/cgroups):blkio 641cpuacct 421cpu 421cpuset 1111ed#subsys_name hierarchynum_cgroupsenablliuxinliuxin-PC cat /proc/cgroupsmemory 12711 1devices 8104 1freezer 7587 1net_cls 911perf_event211net_prio911hugetlb 511pids 3114 1rdma 1011d,nodev,noexec,relatime,rdma)

5、cgroup on /sys/fs/cgroup/rdma type cgroup (rw,nosuicls,net_prio)cgroup (rw,nosuid,nodev,noexec,relatime,net_cgroup on /sys/fs/cgroup/net_cls,net_prio typeuid,nodev,noexec,relatime,devices)cgroup on /sys/fs/cgroup/devices type cgroup (rw,nosuid,nodev,noexec,relatime,freezer)cgroup on /sys/fs/cgroup/f

6、reezer type cgroup (rw,nosd,nodev,noexec,relatime,blkio)cgroup on /sys/fs/cgroup/blkio type cgroup (rw,nosuiuid,nodev,noexec,relatime,hugetlb)cgroup on /sys/fs/cgroup/hugetlb type cgroup (rw,nos(rw,nosuid,nodev,noexec,relatime,cpu,cpuacct)cgroup on /sys/fs/cgroup/cpu,cpuacct type cgroup,nodev,noexec

7、,relatime,pids)cgroup on /sys/fs/cgroup/pids type cgroup (rw,nosuidnosuid,nodev,noexec,relatime,perf_event)cgroup on /sys/fs/cgroup/perf_event type cgroup (rw,suid,nodev,noexec,relatime,xattr,name=systemd)cgroup on /sys/fs/cgroup/systemd type cgroup (rw,noosuid,nodev,noexec,relatime,nsdelegate)cgrou

8、p2 on /sys/fs/cgroup/unified type cgroup2 (rw,nnoexec,mode=755)tmpfs on /sys/fs/cgroup type tmpfs (ro,nosuid,nodev,liuxinliuxin-PC mount | grep cgroupcpuset 給 cgroup 中的任務分配獨立的 CPU( 多處理器系統 ) 和內存節點。cpu 限制 CPU 時間片的分配,與 cpuacct 掛載在同一目錄。cpuacct 生成 cgroup 中的任務占用 CPU 資源的報告,與 cpu 掛載在同一目錄。blkio 對塊設備的 IO 進行限制

9、。memory 對 cgroup 中的任務的可用內存進行限制,并自動生成資源占用報告。devices 允許或禁止 cgroup 中的任務訪問設備。freezer 暫停 / 恢復 cgroup 中的任務。net_cls 使用等級識別符(classid)標記網絡數據包,這讓 Linux 流量控制器(tc 指令)可以識別來自特定 cgroup 任務的數據包,并進行網絡限制。 perf_event 允許使用 perf 工具來監控 cgroup。 net_prio 允 許 基 于 cgroup 設 置 網 絡 流 量(netowork traffic) 的優先級。hugetlb 限制使用的內存頁數量。p

10、ids 限制任務的數量。RDMA 是一種 host-offload, host-bypass 技術, 允許應用程序 ( 包括存儲 ) 在它們的內存空間之間直接做數據傳輸。Hierarchy( 層級 ) 層級有一系列 cgroup 以一個樹狀結構排列而成,每個層級通過綁定對應的子系統進行資源控制。層級中的 cgroup 節點可以包含零個或多個子節點,子節點繼承父節點掛載的子系統。一個操作系統中可以有多個層級。cgroup 的文件系統接口cgroup 以文件的方式提供應用接口,我們可以通過 mount 來查看 cgroups 默認的掛載點:suid,nodev,noexec,relatime,me

11、mory)cgroup on /sys/fs/cgroup/memory type cgroup (rw,nouid,nodev,noexec,relatime,cpuset)cgroup on /sys/fs/cgroup/cpuset type cgroup (rw,nos第一行的 tmpfs 說明 /sys/fs/cgroup 目錄下的文件都是存在于內存中的臨時文件。第三行的掛載點 /sys/fs/cgroup/systemd 用于systemd 系統對 cgroups 的支持,相關內容筆者今后會做專門的介紹。其余的掛載點則是內核支持的各個子系統的根級層級結構。接下來進入 /sys/fs

12、/cgroup 看看目錄及其子目錄下的都是什么內容限制進程的可用的 cpu在我們使用 cgroups 時,最好不要隨便直接在子系統的根目錄下直接修改其配置文件,容易造成不必要的麻煩。所以我們可以在子系統樹中定義其他的節點,然后我們在其他的節點任意操作不影響系統的子系統,那我們就直接在 /sys/fs/cgroup/cpu 目錄下新建一個名稱為 nick_cpu 的目錄 :cfs_quota_us cpu.uclamp.mincpuacct.usagecpuacct.usage_percpu_user cpu.cpuacct.usage_percpu_sys cpu.cfs_period_us

13、cpu.uclamp.maxcpuacct.statusage_user cscpuacct.usage_percpucpuacct.cpuacct.usage_sys cpu.sharesnotify_on_releasec gr oup . clone_childr en cpuacc t .usag e_all liuxinliuxin-PC /s/f/c/cpu ls nick_cpu/驗證成功sudo liuxin 的密碼:請輸入密碼liuxinliuxin-PC /s/f/c/cpu sudo mkdir nick_cpu/創建結束之后

14、,我們進入此目錄,會發現多了好多配置文件,有點神奇吧,其實 cgroups 的文件系統會在創建目錄的時候自動創建這些配置文件。net_priopids/systemd/cpucpu,cpuacct/ devices/ hugetlb/ net_clscls,net_prio/ perf_event/ rdma/ unified/blkio/ cpuacctcpuset/ freezer/ memory/ net_liuxinliuxin-PC ls /sys/fs/cgroup/sys/fs/cgroup 目錄下是各個子系統的根目錄, 直接描述可能沒有個清晰的認識,所以下面以demo 來演示,

15、如何用 cgroups 限制進程可以使用的資源。demo在開始 demo 的演示之前,需要先安裝一個工具,它對于 demo 指定控制組等操作非常方便。默認在咱們 uos 的倉庫中就有這個包。sudo apt install cgroup-bin等待安裝成功,開始 demo 的演示。新創建的目錄的配置文件很多,就不一一講解了,cfs_period_us 用來配置時間周期長度,cfs_ quota_us 用來配置當前 cgroup 在設置的周期長度內所能使用的 CPU 時間數,兩個文件配合起來設置 CPU 的使用上限。我們演示的 demo 就是以此為例子:50000 cpu.cfs_quota_u

16、srootliuxin-PC:/sys/fs/cgroup/cpu/nick_cpu# echo100000 cpu.cfs_period_usrootliuxin-PC:/sys/fs/cgroup/cpu/nick_cpu# echo首先切換 root 用戶,然后將時間周期的長度設置為 100000, 將當前 cgroup 的周期長度設置為50000,相當于將 cpu 周期限制為總量的一半:創建一個累加計時程序:上圖顯 示,默認執行只需要 2s 多,而通過cgroups 限制 CPU 資源后需要運行 4s 多。正好是兩倍左右。限制進程可用的內存像上面一樣,我們到 /sys/fs/cgrou

17、p/memory 下創建 nick_memory: for(i=0;i suliuxinliuxin-PC /c/src gcc -o cputime cputime.cmemory.numa_stattasksmemory.kmem.slabinfocharge_at_immigrate notify_on_releasememory.kmem.max_usage_in_bytes memory.move_usage_in_bytesmemory.use_hierarchymemory.kmem.limit_in_bytesmemory.max_memory.limit_in_bytesme

18、mory.usage_in_bytesmemory.kmem.failcntmemory.kmem.usage_in_bytesmemory.swappinessmemory.force_emptymemory.kmem.tcp.usage_in_bytesmemory.statmemory.failcntmemory.kmem.tcp.max_usage_in_bytes memory.soft_limit_in_csmemory.kmem.tcp.limit_in_bytesmemory.pressure_levelcgroup.event_controlme

19、mory.kmem.tcp.failcntmemory.oom_controlcgroup.clone_childrenmemory/liuxinliuxin-PC /s/f/c/memory ls nick_驗證成功sudo liuxin 的密碼:請輸入密碼nick_memoryliuxinliuxin-PC /s/f/c/memory sudo mkdir對用戶內存的限制主要是 memory.limit_in_ bytes 和 memory.memsw.limit_in_bytes, 然 后已殺死malloc memory 300 MBmalloc memory 200 MBmalloc

20、memory 100 MBmemory:nick_memory ./memoryrootliuxin-PC:/home/liuxin/c-work/src# cgexec -gmalloc memory 500 MBmalloc memory 400 MBmalloc memory 300 MBmalloc memory 200 MBmalloc memory 100 MBrootliuxin-PC:/home/liuxin/c-work/src# ./memory驗證成功Password:請輸入密碼liuxinliuxin-PC /c/src gcc -o memory memory.cliuxinliuxin-PC /c/src su通過設置 memory.swappiness, 來設置是否使用swap,我們的 demo 也是以此為例子。下面的設置把進程的可用內存限制在最大 400M,并且不使用swap:0memory# cat memory.swappinessrootliuxin-PC:/sys/fs/cgroup/memor y/nick_ memory

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論