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相关推荐

  1. 谷歌宣布 Linux Kernel、Kubernetes 0day 漏洞奖励加倍

     聚焦源代码安全,网罗国内外最新资讯! 编译:代码卫士 谷歌表示提高对 Linux Kernel.Kubernetes.Google Kubernetes Engine (GKE) 或kCTF 漏洞报 ...

  2. Docker、Kubernetes、Apache Mesos 之争 | 一个与传说不同的故事

    本文讲的是Docker.Kubernetes.Apache Mesos 之争 | 一个与传说不同的故事[编者的话]有无数的文章.讨论和社交网络上的交流在比较 Docker.Kubernetes 和 M ...

  3. 二、Kubernetes安装

    二.Kubernetes安装 1.集群原理 集群: 主从: 主从同步/复制 ;mysql 主 – mysql 从 主管理从 v 分片(数据集群): 大家都一样 每个人存一部分东西 1.master-n ...

  4. linux cgroup

    了解cgroup 1.cgroup描述 官方描述: DESCRIPTION Control groups, usually referred to as cgroups, are a Linux ke ...

  5. 微软副总裁、Kubernetes 头号贡献者的他,给云原生带来奇迹!

    我们做了一个街头采访,调查路人眼中的程序员到底是怎样的? 提到程序员,大家似乎都有刻板印象:总是格子衬衫+牛仔裤+双肩包打扮,总是埋头敲代码,加班是常态-- 谁说程序员呆板木讷,只会埋头敲一行行代码& ...

  6. Docker、kubernetes、微服务、SpringBoot/Cloud...好乱!到底要不要学?

    Docker.微服务日益火热的今天,相信标题上这些名词大家都不陌生.但也相信有很多同学并不够清楚他们的概念,不理解它们的关系,也可能有这样的疑惑:不知道跟我有没有关系?要不要学习?怎么去学习?学哪些东 ...

  7. [转载] linux cgroup

    原文: http://coolshell.cn/articles/17049.html 感谢左耳朵耗子的精彩文章. 前面,我们介绍了Linux Namespace,但是Namespace解决的问题主要 ...

  8. 二、kubernetes

    一.kubernetes(简称k8s) 集群示意图 Kubernetes工作模式server-client,Kubenetes Master提供集中化管理Minions.部署1台Kubernetes ...

  9. IT运维面试问题总结-LVS、Keepalived、HAProxy、Kubernetes、OpenShift

    文章目录 1.简述ETCD及其特点 2.简述ETCD适应的场景? 3.简述HAProxy及其特性 4.简述HAProxy常见的负载均衡策略? 5.简述负载均衡四层和七层的区别? 6.简述LVS.Ngi ...

最新文章

  1. 全栈Python 必备库
  2. 插件translator_Zotero Jasminum 插件的更新记录
  3. java dateformat hh_SimpleDateFormat上的Java HH:mm和hh:mm之间的区别
  4. 基于Teigha.Net实现CAD到SHP的转换方案
  5. OpenGL显卡编程
  6. 张艾迪(创始人): 我的梦想与成长之路
  7. red hat linux 改ip,Red Hat Enterprise Linux 7(RHEL7)配置静态IP地址
  8. 前端开发学习之——dom ready和window onload的区别
  9. github操作实用命令
  10. caffe的Matlab接口的使用方法
  11. 空气质量等级c语言编程,编程小白如何快速处理空气质量数据
  12. [蓝桥杯]蓝肽子序列(c++详解)
  13. Java、JSP基于JavaEE的智能化跨境电子商务平台的设计
  14. 最适合小白的Odoo12框架详解(更新完毕!!!有错请指正)
  15. Activiti7工作流引擎:基础篇(一) 简介与IDEA插件安装
  16. php+flash头像上传组件
  17. C语言实现汉字的输出以及字库的应用
  18. gyp: No Xcode or CLT version detected! 错误提示
  19. 接线端子连接器是什么?有哪些种类?
  20. Apache Doris介绍

热门文章

  1. linux如何更改密钥环密码,Linux系统教程:Ubuntu桌面上禁用默认的密钥环解锁提示...
  2. python实训报告心得体会-Python学习心得体会
  3. 马建威android视频,5.25春季班高级班第三期第五节课课堂总结
  4. 怎么把桌面计算机的快捷,教你在电脑桌面如何设置“一键关机”快捷图标的教程...
  5. 中断的概念和机制————(清华大学慕课记录)
  6. 虚拟化操作系统ESXi 6.7安装配置详细步骤图文
  7. 子平真诠释疑笔记(三)
  8. Linux系统启动分析
  9. for(int i:nums){.....}的含义
  10. python 自动生成问卷表的软件的设计与实现 毕业设计源码291138