linux cgroup、kubernetes limit
linux cgroup、kubernetes limit
1.cgroups 簡介
- cgroups,其名稱源自控制組群(control groups)的縮寫,是內(nèi)核的一個特性,用于限制、記錄和隔離一組進(jìn)程的資源使用(CPU、內(nèi)存、磁盤 I/O、網(wǎng)絡(luò)等)
- 資源限制:可以配置cgroup,從而限制進(jìn)程可以對特定資源(例如內(nèi)存或 CPU)的使用量
- 優(yōu)先級 :當(dāng)資源發(fā)生沖突時,您可以控制一個進(jìn)程相比另一個cgroup 中的進(jìn)程可以使用的資源量(CPU、磁盤或網(wǎng)絡(luò))
- 記錄:在 cgroup 級別監(jiān)控和報告資源限制
- 控制:您可以使用單個命令更改cgroup 中所有進(jìn)程的狀態(tài)(凍結(jié)、停止或重新啟動)
Cgroups功能的實現(xiàn)依賴于四個核心概念:子系統(tǒng)、控制組、層級樹、任務(wù)
2.limit限制
k8s當(dāng)設(shè)置了limit,真正設(shè)置限制的是cgroup,但是最終設(shè)置在哪一個組件上?下面一個圖就可以清晰看出來。這也是k8s在24版本后放棄docker的原因,因為k8s可以直接調(diào)用到containerd,無序中間在多走一步docker
最終設(shè)置在了containerd-shim的執(zhí)行中。同時cgroup也是設(shè)置在了這里。
3.cgroup文件
cgroup是樹形結(jié)構(gòu)的。當(dāng)最下層的目錄中沒有限制(例如shares為空,則繼承上級父目錄的限制)
cgroup文件在 /sys/fs/cgroup下面,可以看到能限制的所有資源。
如果想要看到某種資源的限制情況,例如cpu,可以進(jìn)入到cpu查看。可以看到這里cpu的限制是1024,也就是當(dāng)前task文件里的所有進(jìn)程,都是cpu限制上限1024。
當(dāng)k8s創(chuàng)建一個pod時,會根據(jù)QOS分級,創(chuàng)建對應(yīng)的文件夾,其中Guaranteed的pod會單獨創(chuàng)建。
進(jìn)入到burstable等級的文件夾中,會發(fā)現(xiàn)pod信息都在這里,k8s設(shè)置的limit值,就是在該目錄下對文件的修改。
我本地啟動了一個Guaranteed類型的pod
這個時候,cgroup下也出現(xiàn)了這個目錄,進(jìn)入這個目錄查看cpu.shares和memory.limit_in_bytes。發(fā)現(xiàn)和describe pod中設(shè)置的limit信息是一致的。
這里有個小實驗,就是把cpu.shares改小或者改大。這時候這個pod的限制回隨著改動變化。但是describe pod的時候顯示的依然是最初得值(存在了etcd),所以要在cgroup目錄下直接修改值。
4.subsystem(子系統(tǒng))
這里就是設(shè)置資源限制的使用量。直接貼文檔了。
4.1、cpu子系統(tǒng):于限制進(jìn)程的 CPU 利用率
| cpu.shares | -cpu比重分配。通過一個整數(shù)的數(shù)值來調(diào)節(jié)cgroup所占用的cpu時間。例如,有2個cgroup(假設(shè)為CPU1,CPU2),其中一個(CPU1)cpu.shares設(shè)定為100另外一個(CPU2)設(shè)為200,那么CPU2所使用的cpu時間將是CPU1所使用時間的2倍。cpu.shares 的值必須為2或者高于2- |
| cpu.cfs_period_us | 規(guī)定CPU的時間周期(單位是微秒)。最大值是1秒,最小值是1000微秒。如果在一個單CPU的系統(tǒng)內(nèi),要保證一個cgroup 內(nèi)的任務(wù)在1秒的CPU周期內(nèi)占用0.2秒的CPU時間,可以通過設(shè)置cpu.cfs_quota_us 為200000和cpu.cfs_period_us 為 1000000 |
| cpu.cfs_quota_us | 在單位時間內(nèi)(即cpu.cfs_period_us設(shè)定值)可用的CPU最大時間(單位是微秒)。cpu.cfs_quota_us值可以大于cpu.cfs_period_us值,例如在一個雙CPU的系統(tǒng)內(nèi),想要一個cgroup內(nèi)的進(jìn)程充分的利用2個CPU,可以設(shè)定cpu.cfs_quota_us為 200000 及cpu.cfs_period_us為 100000 |
當(dāng)設(shè)定cpu.cfs_quota_us為-1時,表明不受限制,同時這也是默認(rèn)值
4.2 cpuacct子系統(tǒng):統(tǒng)計各個 Cgroup 的 CPU 使用情況
| cpuacct.stat | cgroup中所有任務(wù)的用戶和內(nèi)核分別使用CPU的時長 |
| cpuacct.usage | cgroup中所有任務(wù)的CPU使用時長(納秒) |
| cpuacct.usage_percpu | cgroup中所有任務(wù)使用的每個cpu的時間(納秒) |
4.3 cpuset子系統(tǒng):為一組進(jìn)程分配指定的CPU和內(nèi)存節(jié)點
| cpuset.cpus | 允許cgroup中的進(jìn)程使用的CPU列表。如0-2,16代表 0,1,2,16這4個CPU |
| cpuset.mems | 允許cgroup中的進(jìn)程使用的內(nèi)存節(jié)點列表。如0-2,16代表 0,1,2,16這4個可用節(jié)點 |
| cpuset.memory_migrate | 當(dāng)cpuset.mems變化時內(nèi)存頁上的數(shù)據(jù)是否遷移(默認(rèn)值0,不遷移;1,遷移) |
| cpuset.cpu_exclusive | cgroup是否獨占cpuset.cpus 中分配的cpu 。(默認(rèn)值0,共享;1,獨占),如果設(shè)置為1,其他cgroup內(nèi)的cpuset.cpus值不能包含有該cpuset.cpus內(nèi)的值 |
| cpuset.mem_exclusive | 是否獨占memory,(默認(rèn)值0,共享;1,獨占) |
| cpuset.mem_hardwall | cgroup中任務(wù)的內(nèi)存是否隔離,(默認(rèn)值0,不隔離;1,隔離,每個用戶的任務(wù)將擁有獨立的空間) |
| cpuset.sched_load_balance | cgroup的cpu壓力是否會被平均到cpuset中的多個cpu上。(默認(rèn)值1,啟用負(fù)載均衡;0,禁用。) |
4.4 memory子系統(tǒng):限制cgroup所能使用的內(nèi)存上限
| memory.limit_in_bytes | 設(shè)定最大的內(nèi)存使用量,可以加單位(k/K,m/M,g/G)不加單位默認(rèn)為bytes |
| memory.soft_limit_in_bytes | 和 memory.limit_in_bytes 的差異是,這個限制并不會阻止進(jìn)程使用超過限額的內(nèi)存,只是在系統(tǒng)內(nèi)存不足時,會優(yōu)先回收超過限額的進(jìn)程占用的內(nèi)存,使之向限定值靠攏。該值應(yīng)小于memory.limit_in_bytes設(shè)定值 |
| memory.stat | 統(tǒng)計內(nèi)存使用情況。各項單位為字節(jié) |
| memory.memsw.limit_in_bytes | 設(shè)定最大的內(nèi)存+swap的使用量 |
| memory.oom_control | 當(dāng)進(jìn)程出現(xiàn)Out of Memory時,是否進(jìn)行kill操作。默認(rèn)值0,kill;設(shè)置為1時,進(jìn)程將進(jìn)入睡眠狀態(tài),等待內(nèi)存充足時被喚醒 |
| memory.force_empty | 當(dāng)設(shè)置為0時,清空該group的所有內(nèi)存頁;該選項只有在當(dāng)前group沒有tasks才可以使用 |
4.5 blkio子系統(tǒng):限制cgroup對IO的使用
| blkio.weight | 設(shè)置權(quán)值,范圍在[100, 1000],屬于比重分配,不是絕對帶寬。因此只有當(dāng)不同 Cgroup 爭用同一個 阻塞設(shè)備時才起作用 |
| blkio.weight_device | 對具體設(shè)備設(shè)置權(quán)值。它會覆蓋上面的選項值 |
| blkio.throttle.read_bps_device | 對具體的設(shè)備,設(shè)置每秒讀磁盤的帶寬上限 |
| blkio.throttle.write_bps_device | 對具體的設(shè)備,設(shè)置每秒寫磁盤的帶寬上限 |
| blkio.throttle.read_iops_device | 對具體的設(shè)備,設(shè)置每秒讀磁盤的IOPS帶寬上限 |
| blkio.throttle.write_iops_device | 對具體的設(shè)備,設(shè)置每秒寫磁盤的IOPS帶寬上限 |
4.6 devices子系統(tǒng):限定cgroup內(nèi)的進(jìn)程可以訪問的設(shè)備
devices.allow:允許訪問的設(shè)備。文件包括4個字段:type(設(shè)備類型), major(主設(shè)備號), minor(次設(shè)備號), and access(訪問方式)
type
- a — 適用所有設(shè)備,包括字符設(shè)備和塊設(shè)備
- b — 塊設(shè)備
- c — 字符設(shè)備
major, minor
- 9:*
- *:*
- 8:1
access
- r — 讀
- w — 寫
- m — 創(chuàng)建不存在的設(shè)備
| devices.deny | 禁止訪問的設(shè)備,格式同devices.allow |
| devices.list | 顯示目前允許被訪問的設(shè)備列表 |
4.7 freezer子系統(tǒng):暫停或恢復(fù)任務(wù)
freezer.state:當(dāng)前cgroup中進(jìn)程的狀態(tài)
FROZEN:掛起進(jìn)程
FREEZING:進(jìn)程正在掛起中
THAWED:激活進(jìn)程
1.掛起進(jìn)程時,會連同子進(jìn)程一同掛起。
2.不能將進(jìn)程移動到處于FROZEN狀態(tài)的cgroup中。
3.只有FROZEN和THAWED可以被寫進(jìn)freezer.state中, FREEZING則不能
總結(jié)
以上是生活随笔為你收集整理的linux cgroup、kubernetes limit的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 三、vue3--生命周期、Hook函数、
- 下一篇: linux上cgconfig服务,lin