Linux命名空間cgroups 一、cgroups概念 二、cpu子系統 三、cpuset子系統 四、cpuacct子系統 五、memory子系統 六、blkio子系統 七、devices子系統 八、freezer子系統 九、net_cls子系統 十、net_prio子系統 十一、perf_event 十二、hugetlb 總結
一、cgroups概念
cgroup全稱是control groups,被整合在了linux內核當中,把進程(tasks)放到組里面,對組設置權限,對進程進行控制。可以理解為用戶和組的概念,用戶會繼承它所在組的權限。
查看cgroup目錄:
mount -t cgroup
/sys/fs/cgroup下的每個文件夾就是一個子系統。
cgroup on /sys/fs/cgroup/systemd
type cgroup
( rw,nosuid,nodev,noexec,relatime,xattr,release_agent
= /lib/systemd/systemd-cgroups-agent,name
= systemd
)
cgroup on /sys/fs/cgroup/cpuset
type cgroup
( rw,nosuid,nodev,noexec,relatime,cpuset
)
cgroup on /sys/fs/cgroup/blkio
type cgroup
( rw,nosuid,nodev,noexec,relatime,blkio
)
cgroup on /sys/fs/cgroup/hugetlb
type cgroup
( rw,nosuid,nodev,noexec,relatime,hugetlb
)
cgroup on /sys/fs/cgroup/net_cls,net_prio
type cgroup
( rw,nosuid,nodev,noexec,relatime,net_cls,net_prio
)
cgroup on /sys/fs/cgroup/pids
type cgroup
( rw,nosuid,nodev,noexec,relatime,pids
)
cgroup on /sys/fs/cgroup/rdma
type cgroup
( rw,nosuid,nodev,noexec,relatime,rdma
)
cgroup on /sys/fs/cgroup/freezer
type cgroup
( rw,nosuid,nodev,noexec,relatime,freezer
)
cgroup on /sys/fs/cgroup/cpu,cpuacct
type cgroup
( rw,nosuid,nodev,noexec,relatime,cpu,cpuacct
)
cgroup on /sys/fs/cgroup/memory
type cgroup
( rw,nosuid,nodev,noexec,relatime,memory
)
cgroup on /sys/fs/cgroup/perf_event
type cgroup
( rw,nosuid,nodev,noexec,relatime,perf_event
)
cgroup on /sys/fs/cgroup/devices
type cgroup
( rw,nosuid,nodev,noexec,relatime,devices
)
$
ls /sys/fs/cgroup/
blkio cpu cpuacct cpu,cpuacct cpuset devices freezer hugetlb memory net_cls net_cls,net_prio net_prio perf_event pids rdma systemd
二、cpu子系統
調度 cgroup 對 CPU 的獲取量。可用以下兩個調度程序來管理對 CPU 資源的獲取:
完全公平調度程序(CFS),一個比例分配調度程序,可根據任務優先級 ∕ 權重或 cgroup 分得的份額,在任務群組(cgroups)間按比例分配 CPU 時間(CPU 帶寬)。 實時調度程序(RT),一個任務調度程序,可對實時任務使用 CPU 的時間進行限定。
2.1、CFS
cpu.cfs_period_us:此參數可以設定重新分配 cgroup 可用 CPU 資源的時間間隔,單位為微秒,上限1秒,下限1000微秒。即設置單個CPU重新分配周期。 cpu.cfs_quota_us:此參數可以設定在某一階段(由 cpu.cfs_period_us 規定)某個 cgroup 中所有任務可運行的時間總量,單位為微秒。即每個周期時間內,可以使用多長時間的CPU(單個),該值可以大于cfs_period_us的值,表示可以利用多個CPU來滿足CPU使用時長。 cpu.shares:用一個整數來設定cgroup中任務CPU可用時間的相對比例。該參數是對系統所有CPU做分配,不是單個CPU。 cpu.stat:報告 CPU 時間統計 。
nr_periods : 經過的周期間隔數。 nr_throttled : cgroup 中任務被節流的次數(即耗盡所有按配額分得的可用時間后,被禁止運行)。 throttled_time : cgroup 中任務被節流的時間總計(以納秒為單位)。
2.2、RT
RT 調度程序與 CFS 類似,但只限制實時任務對 CPU 的存取。
cpu.rt_period_us:此參數可以設定在某個時間段中 ,每隔多久,cgroup 對 CPU 資源的存取就要重新分配,單位為微秒(μs,這里以“us”表示),只可用于實時調度任務。 cpu.rt_runtime_us:此參數可以指定在某個時間段中, cgroup 中的任務對 CPU 資源的最長連續訪問時間,單位為微秒(μs,這里以“us”表示),只可用于實時調度任務。
2.3、示例
一個 cgroup 使用一個 CPU 的 25%,同時另一個 cgroup 使用此 CPU 的 75%。
echo 250 > /cgroup/cpu/blue/cpu.shares
echo 750 > /cgroup/cpu/red/cpu.shares
一個 cgroup 完全使用一個 CPU。
echo 10000 > /cgroup/cpu/red/cpu.cfs_quota_us
echo 10000 > /cgroup/cpu/red/cpu.cfs_period_us
一個 cgroup 使用 CPU 的 10%。
echo 10000 > /cgroup/cpu/red/cpu.cfs_quota_us
echo 100000 > /cgroup/cpu/red/cpu.cfs_period_us
多核系統中,如要讓一個 cgroup 完全使用兩個 CPU 核。
echo 200000 > /cgroup/cpu/red/cpu.cfs_quota_us
echo 100000 > /cgroup/cpu/red/cpu.cfs_period_us
三、cpuset子系統
可以為 cgroup 分配獨立 CPU 和內存節點。
cpuset.cpu_exclusive:包含標簽(0 或者 1),它可以指定:其它 cpuset 及其父、子 cpuset 是否可共享該 cpuset 的特定 CPU。默認情況下(0),CPU 不會專門分配給某個 cpuset。 cpuset.cpus(強制):設定該 cgroup 任務可以訪問的 CPU。這是一個逗號分隔列表,格式為ASCII,小橫線(“-”)代表范圍。例如:0-2,16 表示cpu 0、1、2 和 16。 cpuset.mem_exclusive:包含標簽(0 或者 1),它可以指定:其它 cpuset 是否可共享該 cpuset的特定內存節點。默認情況下(0),內存節點不會專門分配給某個 cpuset 。為某個 cpuset 保留其專用內存節點(1)與使用 cpuset.mem_hardwall 參數啟用內存 hardwall 功能是一樣的。 cpuset.mem_hardwall:包含標簽(0 或者 1),它可以指定:內存頁和緩沖數據的 kernel 分配是否受到 cpuset 特定內存節點的限制。默認情況下 0,頁面和緩沖數據在多用戶進程間共享。啟用 hardwall 時(1)每個任務的用戶分配可以保持獨立。 cpuset.memory_migrate:包含一個標簽(0 或者 1),用來指定當 cpuset.mems 的值更改時,是否應該將內存中的頁遷移到新節點。默認情況下禁止內存遷移(0)且頁就保留在原來分配的節點中,即使此節點不再是 cpuset.mems 指定的節點。如果啟用(1),系統會將頁遷移到cpuset.mems 指定的新參數的內存節點中,如果可能的話會保留其相對位置。 cpuset.memory_pressure:一份只讀文件,包含該 cpuset 進程生成的“內存壓力”運行平均。啟用cpuset.memory_pressure_enabled 時,該偽文件中的值會自動更新,除非偽文件包含 0 值。 cpuset.memory_pressure_enabled:包含標簽(0 或者 1),它可以設定系統是否計算該 cgroup進程生成的“內存壓力”。計算出的值會輸出到 cpuset.memory_pressure,代表進程試圖釋放被占用內存的速率,報告值為:每秒嘗試回收內存的整數值再乘以 1000。 cpuset.memory_spread_page:包含標簽(0 或者 1),它可以設定文件系統緩沖是否應在該cpuset 的內存節點中均勻分布。默認情況下 0,系統不會為這些緩沖平均分配內存頁面,緩沖被置于生成緩沖的進程所運行的同一節點中。 cpuset.memory_spread_slab:包含標簽(0 或者 1),它可以設定是否在 cpuset 間平均分配用于文件輸入 / 輸出操作的 kernel 高速緩存板。默認情況下 0,kernel 高速緩存板不被平均分配,高速緩存板被置于生成它們的進程所運行的同一節點中。 cpuset.mems(強制):設定該 cgroup 中任務可以訪問的內存節點。這是一個逗號分隔列表,格式為 ASCII,小橫線(“-”)代表范圍。例如:0-2,16 表示內存節點 0、1、2 和 16。內存節點:內存被劃分為節點,每一個節點關聯到一個cpu。 cpuset.sched_load_balance:包含標簽(0 或者 1),它可以設定 kernel 是否在該 cpuset 的CPU 中平衡負載。默認情況下 1,kernel 將超載 CPU 中的進程移動到負載較低的 CPU 中以便平衡負載。如果父cgroup設置了,子cgroup的設置將沒有任何作用。 cpuset.sched_relax_domain_level:包含 -1 到一個小正數間的整數,它代表 kernel 應嘗試平衡負載的 CPU 寬度范圍。如果禁用 cpuset.sched_load_balance,則該值無意義 。
值描述 -1 平衡負載的系統默認值 0 不執行直接負載平衡;負載平衡只是階段性的 1 對同一核中的線程進行直接負載平衡 2 對同一軟件包中的線程進行直接負載平衡 3 對同一節點或者扇葉中的線程進行直接負載平衡 4 對不使用統一內存訪問(NUMA)構架中的多個 CPU 進行直接負載平衡 5 對使用統一內存訪問(NUMA)構架中的多個 CPU 進行直接負載平衡
四、cpuacct子系統
自動生成報告來顯示 cgroup 任務所使用的 CPU 資源,其中包括子群組任務。
cpuacct.stat:報告此 cgroup 的所有任務(包括層級中的低端任務)使用的用戶和系統 CPU 時間。user: 用戶模式中任務使用的 CPU 時間;system: 系統(kernel)模式中任務使用的 CPU 時間。 cpuacct.usage:報告此 cgroup 中所有任務(包括層級中的低端任務)使用 CPU 的總時間(納秒)。 cpuacct.usage_percpu:報告 cgroup 中所有任務(包括層級中的低端任務)在每個 CPU 中使用的 CPU 時間(納秒)。
五、memory子系統
自動生成 cgroup 任務使用內存資源的報告,并限定這些任務所用內存的大小。
$
ls /sys/fs/cgroup/memory/
cgroup.clone_children memory.kmem.max_usage_in_bytes memory.max_usage_in_bytes memory.usage_in_bytes
cgroup.event_control memory.kmem.slabinfo memory.move_charge_at_immigrate memory.use_hierarchy
cgroup.procs memory.kmem.tcp.failcnt memory.numa_stat notify_on_release
cgroup.sane_behavior memory.kmem.tcp.limit_in_bytes memory.oom_control release_agent
memory.failcnt memory.kmem.tcp.max_usage_in_bytes memory.pressure_level tasks
memory.force_empty memory.kmem.tcp.usage_in_bytes memory.soft_limit_in_bytes
memory.kmem.failcnt memory.kmem.usage_in_bytes memory.stat
memory.kmem.limit_in_bytes memory.limit_in_bytes memory.swappiness
memory.failcnt:報告內存達到 memory.limit_in_bytes 設定的限制值的次數。 memory.force_empty:當設定為 0 時,該 cgroup 中任務所用的所有頁面內存都將被清空。這個接口只可在 cgroup 沒有任務時使用。如果無法清空內存,請在可能的情況下將其移動到父 cgroup中。移除 cgroup 前請使用 memory.force_empty 參數以免將廢棄的頁面緩存移動到它的父cgroup 中。 memory.limit_in_bytes:設定用戶內存(包括文件緩存)的最大用量。如果沒有指定單位,則該數值將被解讀為字節。但是可以使用后綴代表更大的單位 —— k 或者 K 代表千字節,m 或者 M 代表兆字節 ,g 或者 G 代表千兆字節。在 memory.limit_in_bytes 中寫入 -1 可以移除全部已有限。 制。 memory.max_usage_in_bytes:報告 cgroup 中進程所用的最大內存量(以字節為單位)。 move_charge_at_immigrate:當將一個task移動到另一個cgroup中時,此task的內存頁可能會被 重新統計到新的cgroup中,這取決于是否設置了move_charge_at_immigrate numa_stat: 每個numa節點的內存使用數量 memory.oom_control:設置or查看內存超限控制信息(OOM killer) memory.pressure_level:設置內存壓力通知 memory.soft_limit_in_bytes:內存軟限制 memory.stat:報告大范圍內存統計 memory.swappiness:將 kernel 傾向設定為換出該 cgroup 中任務所使用的進程內存,而不是從頁高速緩沖中再生頁面。 memory.usage_in_bytes:報告 cgroup 中進程當前所用的內存總量(以字節為單位) memory.use_hierarchy:包含標簽(0 或者 1),它可以設定是否將內存用量計入 cgroup 層級的吞吐量中。如果啟用(1),內存子系統會從超過其內存限制的子進程中再生內存。默認情況下(0),子系統不從任務的子進程中再生內存。 memory.kmem.failcnt:報告內核內存達到 memory.kmem.limit_in_bytes 設定的限制值的次數。 memory.kmem.limit_in_bytes:設定內核內存(包括文件緩存)的最大用量。如果沒有指定單位,則該數值將被解讀為字節。 memory.kmem.max_usage_in_bytes:報告 cgroup 中進程所用的最大內核內存量(以字節為單位)。 memory.kmem.slabinfo:查看內核內存分配情況。 memory.kmem.usage_in_bytes:報告 cgroup 中進程當前所用的內核內存總量(以字節為單位)。 memory.kmem.tcp.failcnt:報告tcp緩存內存達到memory.kmem.tcp.limit_in_bytes設定限制值的次數。 memory.kmem.tcp.limit_in_bytes:設置或查看TCP緩沖區的內存使用限制。 memory.kmem.tcp.max_usage_in_bytes:報告cgroup中進程所用的最大tcp緩存內存量。 memory.kmem.tcp.usage_in_bytes:報告cgroup中進程當前所用TCP緩沖區的內存使用量。
示例:
echo 104857600 > memory.limit_in_bytes
查看字段的值:
fly@fly-virtual-machine:~$
cat /sys/fs/cgroup/memory/memory.limit_in_bytes
9223372036854771712
fly@fly-virtual-machine:~$
cat /sys/fs/cgroup/memory/memory.oom_control
oom_kill_disable
0
under_oom
0
oom_kill
0
六、blkio子系統
控制并監控 cgroup 中的任務對塊設備 I/O 的存取。對一些偽文件寫入值可以限制存取次數或帶寬,從偽文件中讀取值可以獲得關于 I/O 操作的信息。
blkio.reset_stats:此參數用于重設其它偽文件記錄的統計數據。請在此文件中寫入整數來為cgroup 重設統計數據。 blkio.throttle.io_service_bytes:此參數用于報告 cgroup 傳送到具體設備或者由具體設備中傳送出的字節數。 blkio.throttle.io_serviced:此參數用于報告 cgroup 根據節流方式在具體設備中執行的 I/O 操作數。 blkio.throttle.read_bps_device:此參數用于設定設備執行“讀”操作字節的上限。“讀”的操作率以每秒的字節數來限定。 blkio.throttle.read_iops_device:此參數用于設定設備執行“讀”操作次數的上限。“讀”的操作率以每秒的操作次數來表示。 blkio.throttle.write_bps_device:此參數用于設定設備執行“寫”操作次數的上限。“寫”的操作率用“字節/秒”來表示。 blkio.throttle.write_iops_device:此參數用于設定設備執行 “寫” 操作次數的上限。“寫”的操作率以每秒的操作次數來表示。
七、devices子系統
允許或者拒絕 cgroup 任務存取設備。
devices.allow:指定 cgroup 任務可訪問的設備。 devices.deny:指定 cgroup 任務無權訪問的設備。 devices.list:報告 cgroup 任務對其訪問受限的設備。
八、freezer子系統
暫停或者恢復 cgroup 中的任務。 freezer.state:
參數含義 FROZEN cgroup 中的任務已被暫停 FREEZING 系統正在暫停 cgroup 中的任務 THAWED cgroup 中的任務已恢復
九、net_cls子系統
使用等級識別符(classid)標記網絡數據包,這讓 Linux 流量管控器(tc)可以識別從特定 cgroup 中生成的數據包。可配置流量管控器,讓其為不同 cgroup 中的數據包設定不同的優先級。
net_cls.classid: 包含表示流量控制 handle 的單一數值。從 net_cls.classid 文件中讀取的 classid值是十進制格式,但寫入該文件的值則為十六進制格式
十、net_prio子系統
可以為各個 cgroup 中的應用程序動態配置每個網絡接口的流量優先級。網絡優先級是一個分配給網絡流量的數值,可在系統內部和網絡設備間使用。網絡優先級用來區分發送、排隊以及丟失的數據包。
net_prio.prioidx:只讀文件。它包含一個特有整數值,kernel 使用該整數值作為這個 cgroup 的內部代表。 net_prio.ifpriomap:包含優先級圖譜,這些優先級被分配給源于此群組進程的流量以及通過不同接口離開系統的流量。
十一、perf_event
允許使用perf工具來監控cgroup。
十二、hugetlb
允許使用大篇幅的虛擬內存頁,并且給這些內存頁強制設定可用資源量。
總結
內核內存:專用于Linux內核系統服務使用,是不可swap的。
在linux中看到的都是文件,但在子系統中是一個字段。
如果開啟了docker,cgroup子系統下會有docker文件夾,該文件夾就包含了docker的相關子系統配置字段。
。
總結
以上是生活随笔 為你收集整理的Linux命名空间cgroups简介 的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網站內容還不錯,歡迎將生活随笔 推薦給好友。