news 2026/10/1 17:07:09

CGroups 资源控制组

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
CGroups 资源控制组

通过命名空间可以实现进程间在文件系统、网络以及宿主进程之间的相互隔离,但是对于宿主机的物理资源比如 CPU、内存、块设备等,如果同一机器上运行了多个相互独立的容器,这些容器在执行高负载任务时必定会因此产生严重的资源争用问题。比如,当其中的某个容器正在执行 CPU 密集型的任务,此时如果没有某种限制,这个容器必定会影响在同一主机上运行的其他容器中任务,进而导致这些容器的性能受到极大的影响,这在生产上是必须要避免的。

解决进程间虚拟资源隔离问题的办法就是 CGroups(Control Groups),它是 Linux 内核的一种机制,用于对系统资源(如 CPU、内存、磁盘 I/O、网络等)进行分组管理和限制。CGroups 允许系统管理员将进程分组,并为每个组分配特定的资源限制,从而实现资源的隔离、控制和监控。

CGroups 的核心功能包括:

  1. 限制组内进程的资源使用量(如 CPU 使用率、内存使用量等)。防止某个进程或组占用过多资源,影响其他进程或系统的稳定性。
  2. 为不同的组分配不同的资源优先级。为高优先级任务分配更多的 CPU 时间。
  3. 监控和记录组内进程的资源使用情况(如 CPU 时间、内存使用量等)。
  4. 对组内进程进行挂起、恢复、终止等操作。
  5. CGroups 支持层次化结构,可以将组嵌套在其他组中,形成树状结构。

CGroups 通过子系统(subsystem)来管理不同类型的资源。常见的子系统包括:

root@docker-host:~# ls /sys/fs/cgroup/ blkio cpu,cpuacct freezer net_cls perf_event systemd cpu cpuset hugetlb net_cls,net_prio pids unified cpuacct devices memory net_prio rdma root@docker-host:~#

其中,cpu:限制 CPU 使用率,支持按比例分配 CPU 时间。memory:限制内存使用量,支持设置内存和交换空间的上限。blkio:限制块设备如磁盘的 I/O 操作。devices:控制组内进程对设备的访问权限。freezer:挂起或恢复组内的进程。net_cls:标记网络数据包,用于流量控制。pids:限制组内进程的数量。cpuacct:统计组内进程的 CPU 使用情况。

我们将在两个 shell 会话中同时运行这个程序,不出意外的话,主机内存很快就会耗尽。为防止这种情况的出现,可以创建一个 CGroups 来限制这两个 shell 进程的内存使用,当内存达到限制上限时终止程序,从而保证主机内存资源的安全使用。

创建 CGroups 很简单,只需在控制组文件系统创建一个目录即可。在本例中,我们将创建一个名为 demo 的内存组,之后内核会自动将可用的子系统配置文件填充到这个目录:

root@docker-host:~# mkdir /sys/fs/cgroup/memory/demo root@docker-host:~# ls /sys/fs/cgroup/memory/demo/ cgroup.clone_children memory.limit_in_bytes cgroup.event_control memory.max_usage_in_bytes cgroup.procs memory.move_charge_at_immigrate memory.failcnt memory.numa_stat memory.force_empty memory.oom_control memory.kmem.failcnt memory.pressure_level memory.kmem.limit_in_bytes memory.soft_limit_in_bytes memory.kmem.max_usage_in_bytes memory.stat memory.kmem.slabinfo memory.swappiness memory.kmem.tcp.failcnt memory.usage_in_bytes memory.kmem.tcp.limit_in_bytes memory.use_hierarchy memory.kmem.tcp.max_usage_in_bytes notify_on_release memory.kmem.tcp.usage_in_bytes tasks root@docker-host:~#

将 demo 内存控制组的最大内存使用量限制在 100M,为演示效果考虑,禁止使用交换分区:

root@docker-host:~# echo "100000000" > /sys/fs/cgroup/memory/demo/memory.limit_in_bytes root@docker-host:~# echo "0" > /sys/fs/cgroup/memory/demo/memory.swappiness root@docker-host:~#

启动的两个 bash 进程 id 显示如下:

root@docker-host:~# ps -ef | grep bash root 1585 1378 0 12:55 pts/0 00:00:00 -bash root 1695 1371 0 12:55 pts/1 00:00:00 -bash root 1770 1695 0 12:56 pts/1 00:00:00 grep --color=auto bash root@docker-host:~#

将这两个进程加入到 demo 内存控制组的 tasks 文件中:

root@docker-host:~# ps PID TTY TIME CMD 1585 pts/0 00:00:00 bash 1850 pts/0 00:00:00 ps root@docker-host:~# echo $$ >> /sys/fs/cgroup/memory/demo/tasks root@docker-host:~# root@docker-host:~# ps PID TTY TIME CMD 1695 pts/1 00:00:00 bash 1845 pts/1 00:00:00 ps

可以看到,当两个应用的内存使用达到 100M 时,demo 内存控制组会终止程序的运行,如果要取消控制组的限制,只要删除控制目录即可.

注意:只有 tasks 文件中的所有进程都已退出或已重新分配给另一个组才能删除。

CGroup 的前身是出自于 2006 年 Google 工程师 Paul Menage 和 Rohit Seth 启动的一个名字叫做 process containers 的项目,后来因为与 container 在内核中的名字有冲突,因此在 2007 年改名为 control groups,合并到 2008 年发布的 2.6.24 内核版本中。

最初 CGroups 的版本被称为 v1,后续的开发工作由 Tejun Heo 接管,他重新设计并重写了 CGroups,新版本被称为 v2,并在 kernel 4.5 版本中引入。随着 v2 版本的普及,容器资源的管理变得更加高效和灵活。

在容器环境中,CGroup 扮演着至关重要的角色,它是容器资源管理和隔离的核心技术之一。在 Docker 和 Kubernetes 中,CGroup 被广泛用于限制容器的 CPU、内存、磁盘 I/O 等资源。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/1 17:04:43

用Godot接入大模型开发《AI侦探所》:提示词、记忆与工具调用全解析

AI游戏开发这个方向,我是从一个很偶然的念头开始的。去年我翻到一条玩家评论,说现在的游戏NPC就像提线木偶,对话永远只有三句。当时我就想:如果把大模型接进游戏里,让NPC真的会说话、会推理、会怀疑,会是什…

作者头像 李华
网站建设 2026/10/1 17:04:40

Unity3D逆向分析可视化:搭建WebUI辅助工具

1. 为什么要给 Unity3D 逆向分析套一个 WebUI日常做 Unity3D 游戏分析时,很多朋友还是习惯开好几个命令行窗口:一边用 AssetStudio 导资源,一边用 Il2CppDumper 砸脚本,再开着调试器盯内存。偶尔还要切换到 hex 工具,或…

作者头像 李华
网站建设 2026/10/1 17:04:27

IEC104从站模拟器选型与调试实战指南

做电力远动联调的工程师,基本都碰过这种场景:现场IEC104主站还没完全就绪,站端测控装置却已经上电,调度电话一个接一个地催,后台监控页面上却一个遥测都刷不出来。这时候你最需要的并不是什么高深的算法,而…

作者头像 李华
网站建设 2026/10/1 17:04:14

Jenkins 环境变量注入:Environment Injector 实践

1. 环境变量为什么总是"构建成功、运行报错"的元凶做 CI/CD 的同学大概都有过这种体验:本地mvn clean package一片绿,丢到 Jenkins 上跑构建也是一片绿,结果应用一启动就抛JAVA_HOME not found、mvn: command not found、No such f…

作者头像 李华
网站建设 2026/10/1 17:02:19

大西洋明珠马德拉旅游攻略:徒步、葡萄酒与丰沙尔全指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/1 17:02:02

UE5地编必会:烘焙光照原理与Lumen差异及实操指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华