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