Docker容器资源控制CGroup的使用

 更新时间:2025年09月04日 10:50:57   作者:@t.t.  
本文主要介绍了Docker容器资源控制CGroup的使用,用于限制CPU、内存、磁盘I/O等资源,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

一、CGroups的含义

CGroups是Linux内核提供的一 种可以限制单个进程或者多个进程所使用资源的机制,可以对 CPU、内存和磁盘I/O等资源实现检制。Docker可使用CGroups提倡的资源限制功能来完成CPU、内存等部分的资源控制。

CGroups提供了对进程进行分组化管理的功能和接口的基础结构,内存或磁盘I/O的分配控制等具体的资源管理功能是通过对进程进行分组化管理来实现的。这些具体的资源管理功能称为CGroups子系统或控制器,主要通过以下九大子系统实现。

(1)blkio:为每个块设备设置I/O限制,如磁盘、光盘和USB等设备。

(2) cpu:使用调度程序提供对CPU的CGroup任务访问。

(3) cpuacct:自动生成CGroup任务的CPU资源使用报告。

(4)cpuset:为CGroup中的任务分配独立CPU (在多核系统中)和内存节点。

(5) devices:允许或拒绝CGroup任务访问设备。

(6) freezer: 暂停和恢复CGroup任务。

(7)memory:设置每个CGroup任务使用的内存限制,并自动生成内存资源使用报告。

(8)net_ clsI: 标记每个网络包以供CGroup任务使用。

(9)ns:命名空间子系统。(namesparce)

二、CGroup的功能和特点

1、CGroups的主要功能

(1) CGroups可实现对进程组使用的资源总额的限制。例如,使用memory子系统为进程组设定一个内存使用上限, 当进程组使用的内存达到限额后再申请内存时,会触发OOM(OutOfMemory)警告。

(2)CGroups可实现对进程组的优先级控制。通过分配CPU时间片数量及硬盘I/O、带宽大小可控制进程的优先级。例如,使用CPU子系统为某个进程组分配特定cpu share。

(3) CGroups 可实现对进程组使用的资源数量的记录。例如,使用cpuacct子系统可记录某个进程组使用的CPU时间。

(4) CGroups 可实现对进程组的隔离和控制。例如,使用ns子系统对不同的进程组使用不同的namespace,以达到隔离的目的,使用不同的进程组实现各自的进程、网络、文件系统挂载空间,也可使用feezer子系统将进程组暂停和恢复。

2、CGroups的特点

(1)控制族群:控制族群是组按照某种标准划分的进程。CGroups中的资源控制都是以控制族群为单位实现的。一个进程可以加入某个控制族群中,也可以从一个进程组迁移到另一个控制族群。一个进程组的进程可以使用CGroups以控制族群为单位分配资源,并受到CGroups以控制族群为单位设定的限制。

(2)层级:控制族群可以组织为hierarchical 的形式,即一棵控制族群树。子控制组自动继承父节点的特定属性,子控制组还可以有自己特定的属性。

(3)子系统:一个子系统就是一个资源控制器, 如memory 子系统是一个内存控制器。子系统必须附加到一个层级上才能起作用。个子 系统附加到某个层级以后, 这个层级上的所有控制族群都受到这个子系统的控制。

三、实训

1、利用CGroups实现CPU资源控制

(1)利用busybox镜像生成容器,设置容器调度的周期为5000,将容器在每个周期内的CPU配额设置为25000

[root@controller ~]# docker run -dit --name t1 --cpu-period 50000 --cpu-quota 25000 busybox:latest
da8f5d80873d6dc349e7aae44ef51571b7c530070b8600468aceaec9c20936ac

(2)利用busybox镜像生成容器。将容器绑定到CPU上执行,设置容器调度的周期和周期内的CPU配额为50000

[root@controller ~]# docker run -dit --name t2 --cpuset-cpus 0 --cpu-period 50000 --cpu-quota 50000 busybox
8bc68f70004e051b344948717d82acba9e9c1a0f5a15f911fa60394618436e12

(3)利用busybox镜像生成两个容器,设置第二个容器的CPU使用率是第一个容器的两倍

[root@controller ~]# docker run  -dit --name t3 --cpu-quota 1000 busybox
4908f5f5846fc5f269e5a5c7ebf82a4bf53a6f4dacf47753bbbfb2579fccbf88
[root@controller ~]# docker run  -dit --name t4 --cpu-quota 2000 busybox
71f56247679674f65c888562f3ea8f90f783a20e25a2a0f803bdb1ebef928aa4

2、利用CGroups实现内存资源控制

(1)利用busybox镜像生成容器,设置容器使用的最大内存为256MB

[root@controller ~]# docker run -dit --name  t5 --memory 256MB busybox
3349f1259d61026be4353a6d9460a5e4f43bd960451547d1c4dd383df292fadc

3、利用CGroups实现磁盘I/O控制

(1)利用busybox镜像生成容器,设置第二个容器读这些磁盘的带宽是第一个容器两倍

[root@controller ~]# docker run -dit --name t6 --device-read-bps /dev/sda1:1mb  --device-write-bps /dev/sda1:1mb busybox 
b55bce694ef2a24f029ac9c13afe28510085db2751162d876de1b97e210c1066
[root@controller ~]# docker run -dit --name t7 --device-read-bps /dev/sda1:2mb  --device-write-bps /dev/sda1:2mb busybo
79d2920ce67a8c9956d499cff05fc09bee19ab412e419817ea7f220cd6cfc45c

(2)利用busybox镜像生成容器,设置容器读写速度为30MB/s

[root@controller ~]# docker run -dit --name t8 --device-write-bps /dev/sd2:30mb busybox
70ce52a12add7635fcf082311f5cd719ade0036c0a716ced275a83c4802ea4a2

到此这篇关于Docker容器资源控制CGroup的使用的文章就介绍到这了,更多相关Docker容器资源控制CGroup内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • docker容器存放目录磁盘空间满了的解决

    docker容器存放目录磁盘空间满了的解决

    这篇文章主要介绍了docker容器存放目录磁盘空间满了的解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-07-07
  • docker-compose限制容器cpu和内存方式

    docker-compose限制容器cpu和内存方式

    这篇文章主要介绍了docker-compose限制容器cpu和内存方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • docker 运行花生壳实现内外网穿透的详细过程

    docker 运行花生壳实现内外网穿透的详细过程

    这篇文章主要介绍了docker 运行花生壳实现内外网穿透,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-03-03
  • 利用docker搭建php7和nginx运行环境全过程(官方镜像)

    利用docker搭建php7和nginx运行环境全过程(官方镜像)

    docker提供了在服务端分布式的部署应用,这样的好处是方便维护和升级。下面这篇文章主要给大家介绍了利用docker搭建php7和nginx运行环境的相关资料,搭建过程中运用的是官方镜像,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-05-05
  • 如何解决安装docker的yum工具时报错问题

    如何解决安装docker的yum工具时报错问题

    在安装Docker时遇到yum工具错误可通过更新yum源解决,先卸载旧Docker,备份原yum源,下载新的CentOS-Base.repo文件到指定目录,安装yum工具后,配置Docker的yum源,国内用户建议使用aliyun源以避免访问异常,安装并启动Docker,校验是否成功
    2024-09-09
  • Docker部署PostgreSQL+PostGIS服务的实现

    Docker部署PostgreSQL+PostGIS服务的实现

    本文介绍了如何使用Docker快速部署PostgreSQL,并手动安装PostGIS模块,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-12-12
  • 使用 kind 和 Docker 启动本地的 Kubernetes环境

    使用 kind 和 Docker 启动本地的 Kubernetes环境

    这篇文章主要介绍了使用 kind 和 Docker 启动本地的 Kubernetes环境,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-05-05
  • docker通过Dockerfile修改镜像中tomcat的端口

    docker通过Dockerfile修改镜像中tomcat的端口

    8080端口会经常出现被占用的情况,本文主要介绍了docker通过Dockerfile修改镜像中tomcat的端口,具有一定的参考价值,感兴趣的可以了解一下
    2023-10-10
  • Docker如何配置Redis容器持久化

    Docker如何配置Redis容器持久化

    这篇文章主要介绍了Docker如何配置Redis容器持久化问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-05-05
  • Docker搭建RabbitMQ集群的方法步骤

    Docker搭建RabbitMQ集群的方法步骤

    本文主要介绍了Docker搭建RabbitMQ集群的方法步骤,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01

最新评论