趣谈 Linux 操作系统
刘超
前网易杭州研究院云计算技术部首席架构师
85459 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 72 讲
趣谈 Linux 操作系统
15
15
1.0x
00:00/00:00
登录|注册

58 | cgroup技术:内部创业公司应该独立核算成本

memory.memsw.limit_in_bytes
memory.swappiness
memory.limit_in_bytes
cpu.cfs_quota_us
cpu.cfs_period_us
cpu.shares
mem_cgroup_try_charge
mem_cgroup_write
sched_change_group
online_fair_sched_group
sched_create_group
cgroup_migrate_execute
cgroup_attach_task
cgroup_tasks_write
kernfs_fop_write
kernfs_file_fops
css_populate_dir
kernfs_create_root
cgroup_root
cgroup_init_subsys
cgroup_subsys数组
cgroup_init
cgroup_init_early
内存资源控制
CPU资源控制
挂载cgroup文件系统
freezer子系统
net_cls子系统
devices子系统
blkio子系统
memory子系统
cpuset子系统
cpuacct子系统
CPU子系统
cgroup技术
Namespace技术
内存资源控制实现
CPU资源控制实现
cgroup文件系统操作
cgroup根
cgroup初始化
cgroup文件系统
cgroup子系统
容器实现封闭的环境
解析内核中cgroup的工作机制

该思维导图由 AI 生成,仅供参考

我们前面说了,容器实现封闭的环境主要靠两种技术,一种是“看起来是隔离”的技术 Namespace,另一种是用起来是隔离的技术 cgroup。
上一节我们讲了“看起来隔离“的技术 Namespace,这一节我们就来看一下“用起来隔离“的技术 cgroup。
cgroup 全称是 control group,顾名思义,它是用来做“控制”的。控制什么东西呢?当然是资源的使用了。那它都能控制哪些资源的使用呢?我们一起来看一看。
首先,cgroup 定义了下面的一系列子系统,每个子系统用于控制某一类资源。
CPU 子系统,主要限制进程的 CPU 使用率。
cpuacct 子系统,可以统计 cgroup 中的进程的 CPU 使用报告。
cpuset 子系统,可以为 cgroup 中的进程分配单独的 CPU 节点或者内存节点。
memory 子系统,可以限制进程的 Memory 使用量。
blkio 子系统,可以限制进程的块设备 IO。
devices 子系统,可以控制进程能够访问某些设备。
net_cls 子系统,可以标记 cgroups 中进程的网络数据包,然后可以使用 tc 模块(traffic control)对数据包进行控制。
freezer 子系统,可以挂起或者恢复 cgroup 中的进程。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入探讨了cgroup在内核中的工作机制,重点关注了其在容器环境中的重要资源控制作用。通过验证Docker参数与cgroup的映射关系,展示了在Linux上操作cgroup的专门文件系统。文章详细解释了如何通过cgroup文件系统控制各种资源的使用,包括CPU和内存的限制效果。此外,还介绍了cgroup对Docker资源的控制方式,以及在内核中cgroup的实现机制。通过对cgroup_subsys数组的循环和cgroup_init_subsys的调用,阐述了cgroup在系统初始化时的初始化过程。整体而言,本文通过深入的技术分析,为读者提供了对cgroup技术在容器环境中的重要作用和实现原理的全面了解。文章内容涵盖了cgroup在内核中的初始化过程、文件系统的创建、资源控制的实现以及与Docker资源控制的关联,为读者呈现了cgroup技术的全貌。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《趣谈 Linux 操作系统》
新⼈⾸单¥68
立即购买
登录 后留言

全部留言(13)

  • 最新
  • 精选
  • 安排
    Cgroup文件系统是只存在内存中吗?每一次设置之后在掉电后是不是就消失了?

    作者回复: 掉电后,进程都挂了,pid都变了,cgroup还有啥用

    2019-08-09
    5
  • 刘桢
    二十天闭关冲北邮

    作者回复: 加油

    2019-08-09
    6
    4
  • 行者
    老师,麻烦讲下华为鸿蒙系统,它和linux区别与联系是什么?
    2019-08-10
    1
    8
  • fhchina
    cpu.cfs_period_us的单位是us, 微秒不是毫秒
    2019-11-23
    3
  • 张亚琛
    补充一些背景: Cgroup是Linux系统内核提供的一种机制,它是在Linux 内核版本 2.6.24中引入的,来解决资源管理和隔离的问题。在它出现之前,Linux只能对单个进程进行资源限制,例如通过sched_setaffinity设置进程CPU亲和性,使用ulimit限制进程打开文件上限、栈大小等。 在这个时代,有一些早期的容器技术,如Chroot和Linux VServer。 Chroot 可以将进程及其子进程与操作系统的其余部分隔离开来,但是,对于 root process,却可以任意退出 chroot。 Linux VServer 是一种基于 Security Contexts 的软分区技术,可以做到虚拟服务器隔离,共享相同的硬件资源。主要问题是 VServer 应用程序针对 "chroot-again" 类型的攻击没有很好的进行安全保护,攻击者可以利用这个漏洞脱离限制环境,访问限制目录之外的任意文件。 虽然在没有 Cgroup 技术的情况下,还有其他的方法可以实现一定程度的资源隔离和管理,但是这些方法在处理多进程或者进程组的资源管理时显得力不从心,而且在安全性和功能性方面也存在一些问题。 随着容器技术的发展,Docker的开发者在了解并掌握了 Cgroup 技术之后,应用这项技术去实现Docker 的资源管理和隔离功能。因此,Cgroup 不仅解决了 Linux 系统的资源管理问题,也为容器技术的发展提供了基础。
    2024-02-23归属地:上海
    2
  • 羊仔爸比
    老师: 请教一下docker 里面我设置了 内存的limit是2g,cgroup 文件中memory.usage_in_bytes这个文件是是包含memory.stat中的total_rss 和total_cache 相加的大小,oom kill的时候会根据memory.usage_in_bytes的值kill吗,如果不是根据这个文件的值kill是根据哪个值进行kill的?
    2020-05-29
    1
    1
  • Bravery168
    容器从概念上就是通过各种数据结构的定义建构了一个模型,从执行层面,本质上是对进程资源和行为的定义和控制。牛
    2022-12-15归属地:广东
  • 幼儿编程教学
    >第五步,对于 CPU 来讲,会修改 scheduled entity,放入相应的队列里面去,从而下次调度的时候就起作用了。对于内存的 cgroup 设定,只有在申请内存的时候才起作用。 请教老师,2个我比较非常的问题。 * 设置 cgroup cpu后,极端情况下,是否会突发cpu超过限制? 文章中说”对于 CPU 来讲,会修改 scheduled entity,放入相应的队列里面去,从而下次调度的时候就起作用了“。如果1个进程,占用时间太长,或者短时间内,耗费了很多cpu,是否会引发cpu超量使用,导致系统卡死?k8s中,如果cpu设置的不好(配置大于宿主机实际量),是会引发宿主机卡死的情况。这时候,只能重启宿主机 * 设置 cgroup memory后,极端情况下,是否会突发memory超过限制? 内存好像会?因为上面说,”只有在申请内存的时候才起作用“。那之前申请的内存呢?申请内存的时候,申请的都是虚拟内存。假设宿主机只有1g内存。2个进程a,b,都申请内存1g。内存应该是在实际使用时,才会去分配。所以,进程a,b运行起来,可以超过宿主机实际1g内存。这时,操作系统会oom。应该是这样吧?
    2022-11-02归属地:浙江
  • Sudouble
    这么多篇深度文章,很好的诠释了十几年前的一个疑问,为什么不让电脑突然断电!内存、缓存里存的大量数据,操作系统还没有触发写,这时突然断电,这部分数据全都丢了。
    2022-06-19
  • EST4What
    为什么我mount -t cgroup会显示,而切换到/sys/fs/cgroup时,文件却不见了呢 [root@jenkins cgroup]# mount -t cgroup cgroup on /sys/fs/cgroup/systemd type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,xattr,release_agent=/usr/lib/systemd/systemd-cgroups-agent,name=systemd) cgroup on /sys/fs/cgroup/memory type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,memory) cgroup on /sys/fs/cgroup/devices type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,devices) cgroup on /sys/fs/cgroup/cpu,cpuacct type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,cpuacct,cpu) cgroup on /sys/fs/cgroup/hugetlb type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,hugetlb) cgroup on /sys/fs/cgroup/cpuset type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,cpuset) cgroup on /sys/fs/cgroup/freezer type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,freezer) cgroup on /sys/fs/cgroup/perf_event type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,perf_event) cgroup on /sys/fs/cgroup/blkio type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,blkio) cgroup on /sys/fs/cgroup/net_cls,net_prio type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,net_prio,net_cls) cgroup on /sys/fs/cgroup/pids type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,pids) [root@jenkins cgroup]# ls [root@jenkins cgroup]# ll total 0
    2022-03-02
收起评论
显示
设置
留言
13
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部