当前位置: 首页 > article >正文

Docker与Cgroups资源控制实战

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.kler.cn/a/385015.html

相关文章:

  • 使用最新版的wvp和ZLMediaKit搭建Gb28181测试服务器
  • 蓝桥杯 python day01 第一题
  • 飞腾平台Arm ComputeLibrary编译安装指南
  • Word大珩助手:超大数字怎么读?35位数字?69位数字?
  • 群控系统服务端开发模式-应用开发-个人资料
  • 【Linux】冯诺依曼体系、再谈操作系统
  • 如何通过网络加速器提升TikTok创作与观看体验
  • ORACLE _11G_R2_ASM 常用命令
  • 设置域名跨越访问
  • 第J5周:DenseNet+SE-Net实战
  • DNS服务器
  • 使用QtWebEngine的Mac应用如何发布App Store
  • PHP实现全站静态化
  • C++学习笔记----10、模块、头文件及各种主题(四)---- 头文件
  • 论文阅读《Structure-from-Motion Revisited》
  • Excel 无法打开文件
  • 【计网】实现reactor反应堆模型 --- 框架搭建
  • 【论文复现】基于深度学习的手势识别算法
  • 【AI写作宝-注册安全分析报告-无验证方式导致安全隐患】
  • 单细胞 RNA 测序分析的当前最佳实践:教程-文献精读80
  • Elasticsearch可视化工具Elasticvue插件用法
  • JavaWeb项目-----博客系统
  • 如何修改WordPress经典编辑器的默认高度?
  • Prompt 工程
  • 漫漫数学之旅038
  • 贪心算法习题其四【力扣】【算法学习day.21】