前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Linux 进程资源限制 -- CGroup 的机制与用法

Linux 进程资源限制 -- CGroup 的机制与用法

作者头像
用户3147702
发布2022-09-23 08:31:41
8.4K2
发布2022-09-23 08:31:41
举报
文章被收录于专栏:小脑斧科技博客

1. 引言

此前的文章中,我们介绍了 docker 赖以实现资源隔离与限制的原理:

docker 赖以实现资源隔离与限制的原理

在文章中,我们提到了 Linux 用来管理和限制 Linux 进程组资源使用的 CGroup 机制。本文我们就来详细介绍一下。

2. CGroup 的诞生

2006 年,Google 工程师在开源社区发起了一个用来管理和限制进程资源使用的项目,名为“process containers”,2007 年,Linux 内核团队将其改名为 cgroup 纳入到 Linux 内核 feature 项目中。在 2008 年 1 月发布的 Linux 2.6.24,这一功能被合并到了内核中。到 Linux 4.5 版本内核,CGroup v2 被合并到内核,这是一次在使用方式上的重大更新。

CGroup 一般也被称为“cgroups”,是 control groups 的简称。

CGroup 机制的功能就是对 linux 的一组进程进行包括 CPU、内存、磁盘 IO、网络等在内的资源使用进行限制、管理和隔离。

3. CGroup 的主要功能

CGroup 的主要功能有:

  1. 限制资源的使用,如划定内存等资源的使用上限,对文件系统的缓存进行限制等;
  2. 优先级控制,如让进程以低优先级被 CPU 调度等;
  3. 审计和统计,例如统计 CPU 使用的比例等;
  4. 挂起进程和恢复进程执行。

4. cgroups 子系统

CGroup 对进程组资源的限制是通过子系统来实现的,这样做的好处是可以便于新的功能的增加。目前已有的子系统有:

  1. cpu 子系统:主要限制进程的 cpu 使用率。
  2. cpuacct 子系统:可以统计 cgroups 中的进程的 cpu 使用报告。
  3. cpuset 子系统:可以为 cgroups 中的进程分配单独的 cpu 节点或者内存节点。
  4. memory 子系统:可以限制进程的 memory 使用量。
  5. blkio 子系统:可以限制进程的块设备 io。
  6. devices 子系统:可以控制进程能够访问某些设备。
  7. net_cls 子系统:可以标记 cgroups 中进程的网络数据包,然后可以使用 tc 模块(traffic control)对数据包进行控制。
  8. net_prio 子系统:这个子系统用来设计网络流量的优先级
  9. freezer 子系统:可以挂起或者恢复 cgroups 中的进程。
  10. ns 子系统:可以使不同 cgroups 下面的进程使用不同的 namespace
  11. hugetlb 子系统:这个子系统主要针对于HugeTLB系统进行限制,这是一个大页文件系统。

5. cgroups 的层级结构

CGroup 是通过树的结构形式来进行组织的,每一棵 cgroup 结构体组成的树称之为一个 cgroups 层级结构(cgroups hierarchy)。

如图所示,Group Hierarchy A 和 Group Hierarchy B 分别代表了 cgroups 的一个层级。在一个 cgroups 层级上,都可以 attach 一个或几个 cgroup 子系统,而被 attach 的 cgroups 子系统就可以对当前层级包含的一组进程进行相应的资源限制。

那么,cgroup 节点和它们管理的进程是如何关联的呢?这依赖于该节点的控制任务列表,进程被添加到某个节点的控制任务列表中,便实现了该节点对相应进程的控制。一个 cgroup 节点的控制列表可以包含多个进程,而一个进程又可以被添加到多个 cgroup 节点的控制列表中,这样便实现了 cgroup 节点与被管理的进程之间多对多的对应关系。

6. 实战

6.1 查看 cgroup 子系统挂载点

通过命令 mount -t cgroup 就可以查看当前的所有 linux cgroups 子系统与挂载点:

6.2 创建隔离组

例如我们要对某一组进程的 cpu 资源进行限制,那么我们就执行:

代码语言:javascript
复制
 cd /sys/fs/cgroup/cpu
 mkdir test_limit
 cd test_limit

查看创建后的目录,可以看到,目录中已经生成了一系列文件。

6.3 限制 CPU 利用率

接下来我们就可以来对进程进行 CPU 利用率的限制了。

首先我们写一个 C 语言的程序,用来将 CPU 跑到 100%:

代码语言:javascript
复制
 int main() {
     int i=0;
     for (;;) i++;
     return 0;
 }

运行这个进程,我们观察到 CPU 利用率确实达到了 100%。

接着我们执行下面的命令:

代码语言:javascript
复制
 # 限制该组进程 CPU 总利用率到 20%
 echo 20000 > /sys/fs/cgroup/cpu/test_limit/cpu.cfs_quota_us
 
 # 向任务控制列表中添加需要被限制的 pid
 echo 23732 >> /sys/fs/cgroup/cpu/test_limit/tasks

可以看到,在完成上述命令的执行后,可以看到,cpu 利用率很快就被成功限制到了 20%。

其他资源的限制方法与此是完全类似的。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-07-31,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 小脑斧科技博客 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 引言
  • 2. CGroup 的诞生
  • 3. CGroup 的主要功能
  • 4. cgroups 子系统
  • 5. cgroups 的层级结构
  • 6. 实战
    • 6.1 查看 cgroup 子系统挂载点
      • 6.2 创建隔离组
        • 6.3 限制 CPU 利用率
        相关产品与服务
        容器镜像服务
        容器镜像服务(Tencent Container Registry,TCR)为您提供安全独享、高性能的容器镜像托管分发服务。您可同时在全球多个地域创建独享实例,以实现容器镜像的就近拉取,降低拉取时间,节约带宽成本。TCR 提供细颗粒度的权限管理及访问控制,保障您的数据安全。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档