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