Docker与Cgroups资源控制实战

news/2024/11/8 16:23:50 标签: docker, linux, 运维

Docker与Cgroups资源控制实战

一、Cgroups简介

Cgroups(Control Groups)是Linux内核提供的一种机制,用于将进程按组进行管理,并限制和统计这些进程的资源使用情况。这些资源包括CPU、内存、存储、网络等。通过Cgroups,系统管理员可以方便地限制某个进程或进程组的资源占用,并实时监控这些资源的使用情况。

Cgroups的核心概念包括cgroup、subsystem和hierarchy。

  • cgroup:cgroup是对进程分组管理的一种机制,一个cgroup包含一组进程,并可以在这个cgroup上增加Linux subsystem的各种参数配置,将一组进程和一组subsystem的系统参数关联起来。
  • subsystem:subsystem是一个内核模块,被关联到一颗cgroup树之后,就会在树的每个节点(进程组)上做具体的操作。subsystem经常被称作“resource controller”,因为它主要被用来调度或者限制每个进程组的资源。
  • hierarchy:hierarchy可以理解为一棵cgroup树,树的每个节点就是一个进程组,每棵树都会与零到多个subsystem关联。在一颗树里面,会包含Linux系统中的所有进程,但每个进程只能属于一个节点(进程组)。

Linux支持多种subsystem,例如限制CPU的使用时间、限制使用的内存、统计CPU的使用情况等。这些subsystem可以单独或组合使用,以满足不同的资源管理需求。

二、Cgroups资源控制实战
1. 查看Cgroups信息

在进行Cgroups资源控制之前,首先需要查看当前系统支持的subsystem和cgroup树的信息。

cat /proc/cgroups

该命令将显示当前系统支持的subsystem列表以及它们所关联的cgroup树的ID。

2. 创建Cgroups

在/sys/fs/cgroup目录下,可以看到各种资源的cgroup控制目录,如cpu、memory、blkio等。可以通过在这些目录下创建子目录来创建新的cgroup。

例如,创建一个名为test_cpu的cpu cgroup:

sudo mkdir /sys/fs/cgroup/cpu/test_cpu

同样地,可以创建一个名为test_mem的memory cgroup:

sudo mkdir /sys/fs/cgroup/memory/test_mem

创建cgroup后,系统会自动在相应的目录中生成配置文件,用于设置资源限制。

3. 设置CPU资源限制

在/sys/fs/cgroup/cpu/test_cpu目录下,可以看到一些用于设置CPU资源限制的文件,如cpu.cfs_quota_us和cpu.cfs_period_us。

  • cpu.cfs_quota_us:表示该cgroup限制占用的CPU时间(微秒)。
  • cpu.cfs_period_us:表示CPU分配的周期(微秒)。

例如,要将test_cpu cgroup的CPU使用率限制为20%,可以执行以下命令:

echo 20000 | sudo tee /sys/fs/cgroup/cpu/test_cpu/cpu.cfs_quota_us
echo 100000 | sudo tee /sys/fs/cgroup/cpu/test_cpu/cpu.cfs_period_us

这里,cpu.cfs_quota_us设置为20000,cpu.cfs_period_us设置为100000,因此CPU使用率限制为20%(20000/100000)。

4. 设置内存资源限制

在/sys/fs/cgroup/memory/test_mem目录下,可以看到一些用于设置内存资源限制的文件,如memory.limit_in_bytes和memory.swappiness。

  • memory.limit_in_bytes:表示该cgroup可以使用的最大内存量(字节)。
  • memory.swappiness:表示该cgroup的交换行为(0-100),值越高表示越倾向于使用交换空间。

例如,要将test_mem cgroup的内存使用量限制为200MB,可以执行以下命令:

echo 209715200 | sudo tee /sys/fs/cgroup/memory/test_mem/memory.limit_in_bytes

这里,memory.limit_in_bytes设置为209715200字节(即200MB)。

5. 将进程添加到Cgroups

创建并设置好cgroup后,需要将目标进程添加到相应的cgroup中。这可以通过将进程的PID写入cgroup的tasks文件来实现。

例如,要将PID为1234的进程添加到test_cpu cgroup中,可以执行以下命令:

echo 1234 | sudo tee /sys/fs/cgroup/cpu/test_cpu/tasks

同样地,可以将进程添加到test_mem cgroup中:

echo 1234 | sudo tee /sys/fs/cgroup/memory/test_mem/tasks
6. 使用Docker进行Cgroups资源控制

Docker本质上也是通过调用Cgroups的API来完成对资源的管理的。Docker提供了丰富的选项来限制容器的资源使用。

  • 限制CPU使用

    在创建Docker容器时,可以使用–cpu-quota和–cpu-period选项来限制容器的CPU使用。

    docker run -itd --name test_container --cpu-quota=20000 --cpu-period=100000 centos:7 /bin/bash
    

    这里,–cpu-quota设置为20000,–cpu-period设置为100000,因此容器的CPU使用率限制为20%(20000/100000)。

  • 限制内存使用

    在创建Docker容器时,可以使用-m或–memory选项来限制容器的内存使用。

    docker run -itd --name test_container -m 200m centos:7 /bin/bash
    

    这里,-m或–memory设置为200m(即200MB)。

  • 限制磁盘IO

    在创建Docker容器时,可以使用–device-read-bps和–device-write-bps等选项来限制容器的磁盘IO。

    docker run -itd --name test_container --device-read-bps /dev/sda:1mb --device-write-bps /dev/sda:1mb centos:7 /bin/bash
    

    这里,–device-read-bps和–device-write-bps分别设置为1mb,表示限制容器的磁盘读写速度为1MB/s。

7. 监控资源使用情况

在设置了Cgroups资源限制后,可以使用一些工具来监控资源的使用情况。例如,pidstat是sysstat的一个命令,用于监控全部或指定进程的CPU、内存、线程、设备IO等系统资源的占用情况。

pidstat -u -r -d -p ALL 1

该命令将每秒显示一次所有进程的CPU、内存和IO使用情况。

另外,还可以使用Docker自带的命令来监控容器的资源使用情况。例如,docker stats命令可以显示容器的CPU、内存、网络IO等使用情况。

docker stats
三、总结

Cgroups是Linux内核提供的一种强大的资源管理机制,通过它可以方便地限制和统计进程组的资源使用情况。Docker也利用了Cgroups来实现对容器资源的控制。通过合理配置Cgroups和Docker的选项,可以有效地管理系统的资源使用,提高系统的稳定性和性能。

在实际应用中,需要根据具体的需求和场景来设置Cgroups和Docker的资源限制。例如,在部署高并发应用时,可能需要限制容器的CPU和内存使用,以避免资源竞争和性能下降。在部署大数据处理应用时,可能需要限制容器的磁盘IO和网络带宽,以确保数据的处理速度和安全性。

此外,还需要注意Cgroups和Docker资源限制的相互影响。例如,在设置了Docker容器的CPU限制后,可能会影响容器的内存和网络性能。因此,在进行资源限制时,需要综合考虑各种因素,并进行充分的测试和验证。

通过合理使用Cgroups和Docker的资源控制功能,可以实现对系统资源的精细化管理,提高系统的可靠性和性能。这对于构建高效、稳定、可扩展的云计算和容器化应用环境具有重要意义。


http://www.niftyadmin.cn/n/5744144.html

相关文章

【NOIP普及组】质因数分解

【NOIP普及组】质因数分解 C语言代码C代码Java代码Python代码 💐The Begin💐点点关注,收藏不迷路💐 已知正整数 n 是两个不同的质数的乘积,试求出较大的那个质数。 输入 输入只有一行,包含一个正整数…

React.lazy() 懒加载

概要 React.lazy() 是 React 16.6 引入的一个功能,用于实现代码分割(code splitting)。它允许你懒加载组件,即在需要时才加载组件,而不是在应用初始加载时就加载所有组件。这种方法可以显著提高应用的性能&#xff0c…

基于Springboot+Vue的网上课程学习系统(含源码数据库)

1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: SpringBoot自带 apache tomcat 主要技术: Java,Springboot,mybatis,mysql,vue 2.视频演示地址 3.功能 该系统…

植物神经功能紊乱?这些维生素或许能帮到你!

植物神经功能紊乱,这个听起来有些陌生的名词,实际上却是一种常见的内脏功能失调综合征。它可能与心理、遗传、疾病等多种因素有关,表现为多个系统的症状,如睡眠障碍、心悸、头痛、胸闷、多汗等,严重影响了患者的生活质…

C语言实现数据结构之堆

文章目录 堆一. 树概念及结构1. 树的概念2. 树的相关概念3. 树的表示4. 树在实际中的运用(表示文件系统的目录树结构) 二. 二叉树概念及结构1. 概念2. 特殊的二叉树3. 二叉树的性质4. 二叉树的存储结构 三. 二叉树的顺序结构及实现1. 二叉树的顺序结构2.…

linux rocky 9.4部署和管理docker harbor私有源

文章目录 Harbor简介安装Harbor技术细节1.安装系统(略),设置主机名和IP2.安装docker3.安装docker-compose4.安装Harbor私有源仓库5 测试登录1.本机登录2.客户端登录Harbor服务器配置docker源1. 下载镜像2.把镜像上传到Harbor私有仓库源3.客户端下载镜像,并且启动容器linux …

简单分享一下淘宝商品数据自动化抓取的技术实现与挑战

在电子商务领域,数据是驱动决策的关键。淘宝作为国内最大的电商平台之一,其商品数据对电商从业者来说具有极高的价值。然而,从淘宝平台自动化抓取商品数据并非易事,涉及多重技术和法律挑战。本文将从技术层面分析实现淘宝商品数据…

如何选择最适合的消息队列?详解 Kafka、RocketMQ、RabbitMQ 的使用场景

引言 在日常开发中,消息队列已经成为业务场景中几乎不可或缺的一部分。无论是订单系统、日志收集、分布式事务,还是大数据实时流处理,消息队列都在支撑着这些关键环节。目前市面上常用的消息队列有三种(ActiveMQ 虽然在企业集成中仍有应用&a…