Docker-- cgroups资源控制实战

米饭5个月前行业资讯255

什么是cgroups?

cgroups是Linux内核中的一项功能,最初由Google的工程师提出,后来被整合进Linux内核;

它允许用户将一系列系统任务及其子任务整合或分隔到按资源划分等级的不同组内,从而为系统资源管理提供一个统一的框架。


基本功能

资源限制:cgroups可以对进程组使用的资源进行限制,如CPU时间、内存使用量、I/O带宽等。一旦进程组使用的资源达到限额,再申请资源时可能会受到限制或触发相应的错误处理机制(如OOM,Out of Memory)。

优先级控制:通过cgroups,用户可以为进程组分配特定的CPU份额,从而控制其运行的优先级。

资源记录:cgoups还可以记录进程组使用的资源数量,如CPU时间、内存使用量等,便于用户进行监控和分析。

进程组隔离:使用cgroups,用户可以使不同的进程组使用不同的命名空间(namespace),以达到隔离的目的。不同的进程组将有各自的进程、网络、文件系统挂载空间等。

进程组控制:cgroups提供了对进程组的控制功能,如挂起、恢复等。

组成结构

任务(Task):在cgroups中,任务就是系统的一个进程。一个进程可以加入到某个cgroup中,也可以从一个cgroup迁移到另一个cgroup。

控制族群(Control Group):cgroup表示按某种资源控制标准划分而成的任务组,包含一个或多个子系统。cgroups中的资源控制都是以控制族群为单位实现的。

层级(Hierarchy):cgroups具有层次结构,类似于文件系统的层次树。每个cgroup可以包含多个子CGroup,资源控制是自上而下继承的。层级中的cgroup节点可以包含零个或多个子节点,子节点继承父节点挂载的子系统。

子系统(Subsystem):一个子系统就是一个资源调度控制器(又称controllers),如CPU子系统可以控制CPU的时间分配,内存子系统可以限制内存的使用量。子系统必须附加到一个层级上才能起作用,一个子系统附加到某个层级以后,这个层级上的所有cgroup都受到这个子系统的控制。

为什么使用cgroups?

它能够对cpu、内存等资源做到精细的控制,目前的轻量级容器Docker和k8s就是使用了cgroup提供的资源限制能力对cpu、内存等资源进行资源控制。


比如要使用内存的时候,假如全部有2G内存,我们能够根据我们的需求具体分配出400m内存出来供资源使用,达到上限时就会触发OOM;


cgroups控制子系统

图像2024-12-30 15.56.jpeg

命令:pidstat

pidstat是Linux系统中的一个性能分析工具,它属于sysstat套件的一部分。这个命令可以用来监控特定进程或所有进程的CPU使用率、内存使用情况、I/O活动以及上下文切换等资源使用状况。

基本语法

pidstat [options] [interval] [count]
  • interval:指定两次采样之间的间隔时间(单位为秒)。

  • count:可选参数,用于指定要显示统计信息的次数。

关键参数


-u:默认参数,显示每个进程的CPU利用率(用户空间、内核空间)。

-r:显示每个进程的内存使用情况,包括页面错误(minflt/majflt)和虚拟内存大小(VSZ)及实际使用的物理内存(RSS)。

-d:显示每个进程的磁盘I/O统计,如读写操作的数量和带宽。

-w:显示每个进程的上下文切换次数(自愿和非自愿)。

-p PID:监视指定PID的进程。

-t:包含线程级别的统计信息。

如:

每2秒输出一次所有进程的CPU和内存使用情况:

pidstat -ru 2

监视PID为1234的进程的CPU、内存和磁盘I/O,并每隔5秒输出一次:

pidstat -urd 5 -p 1234

显示特定进程及其线程的CPU使用率:

pidstat -ut 1 -p <process_id>

命令:stress

stress命令是一个用于对Linux系统进行压力测试的工具,它可以模拟多种类型的负载,包括CPU、内存、磁盘、网络等。

基本语法:

stress [OPTION [ARG]]

-c ,–cpu N:模拟N个CPU核心的负载。

-m --vm N:模拟N个虚拟内存设备的负载。

–vm-bytes B:指定每个虚拟内存设备的大小为B(单位可以是K、M、G)。

-i, --io N:模拟N个磁盘I/O操作的负载(注意:在某些版本中,这个选项可能被–hdd替代)。

-t, --timeout T:指定压力测试运行T秒后自动停止。

例如:

监控压力测试进程,每两秒监控一次:

pidstat-C stress-p ALL-u2 10000

压力测试cpu:

stress-c 1

c5961d3558fc4d93b8e4566e41d2dc61.png通过pidstat监控看到

压力测试IO,system资源会被占用:

stress-i 1

848fa7fc693647059e3d3635bdb67047.png压力测试内存,虚拟内存是不变的,而真实内存是不断变化的;
因为需要不断进行数据交换

stress-m --vm-bytes 50m

88a3ba29259842308ee6ba9dbcbb5679.png压力进程的写入能力测试
stress -d 1

8599e7b346744b1a97f3bbe99409a3d9.png

cgroups信息查看

版本查看

cat /proc/filesystems | grep cg


133ae6f5208d4249b3a12f9684ada7c0.png

如果看到 cgroup2,表示支持cgroup v2;

子系统查看

cat /proc/cgroups

a4833ebcea4a4ddb86a436ed776665fc.png

cgroup 挂载信息查看

mount |  grep cgroup

1a8fe4e41b6240d0811a4e7260187ea7.png

显示当前挂载的文件系统,这些行显示了不同的cgroup子系统是如何挂载到文件系统中的

tmpfs是一种基于内存的文件系统,这里它被用来挂载cgroup的根目录。

cgroup类型表示这是一个cgroup挂载点,后面的参数(如name=systemd)指定了cgroup子系统的名称。

873ce5930c0d4d2a92724c8bd2105306.png

显示当前shell进程所属的cgroup(控制组)信息

ll /sys/fs/cgroup/memory/user.slice

当使用了systemd作为初始化系统(init system)时,/sys/fs/cgroup/目录下会包含各种cgroup(控制组)子系统的挂载点。

user.slice是systemd用来管理用户会话的一个cgroup层级,它包含了所有用户级别的进程和服务。


查看该目录下的文件:

dedf246c3cba4b36b9564735b2dea3f4.png

这些文件允许你读取或设置cgroup的内存限制和统计信息。

使用cgroups对内存的控制

先进入到内存控制目录

cd/sys/fs/cgroup/memory

2492f63cef914d3d8fc414e3e1ea8547.png

创建一个测试目录,并进入;

mkdir test_memlimit
cd test_memlimit

48884b5ed8244612a8a431c6ca1bebca.png

内存限制文件已经自动在新目录中建立;

更改内存最大限制为20M:

echo "20971520" > memory.limit_in_bytes

4154557796864e33915e091c69eb5d5c.png开启对内存的监控和压力测试:

pidstat -C stress -p ALL -r 2 10000 
stress -m 1 --vm-bytes 50m

db30aa56dd8f4b72b558d6b9b6245bac.png将stress进程放入cgroup策略中:

echo "3605712" > tasks

c10593e0000c483186d7cb95e5e7862d.png

进程无法申请到足够的内存而退出.

使用cgroups对cpu进行控制

mount | grep cg

a62e67be164643c88e885f5029f673d2.png创建测试目录并进入:

mkdir test_cpu
cd test_cpu

开启cpu压力测试并监控:

stress -c 1
pidstat -C stress -p ALL-u 2 10000

cb32c37a5efb469aacf0cd4b42917b9c.pngcpu_period_us:表示cpu可以使用的带宽,默认值是100000
cpu_quota_us:表示cgroup可以使用的带宽,-1表示CPU不受cgroup的限制;
我们将cpu_quota_us/cpu_period_us就能表示cpu的利用率

将cpu利用率改到20%:

echo "20000"> cpu.cfs_quota_us

e617ada153974b328cff46deb1600bae.png将进程放入tasks进行控制:

echo "3615387" > tasks

f789b30d04de4c1c9f5f366adafca002.pngcpu利用率变为20%

本文系转载,版权归原作者所有,如若侵权请联系我们进行删除!  

云掣基于多年在运维领域的丰富时间经验,编写了《云运维服务白皮书》,欢迎大家互相交流学习:

《云运维服务白皮书》下载地址:https://fs80.cn/v2kbbq

想了解更多大数据运维托管服务、数据库运维托管服务、应用系统运维托管服务的的客户,欢迎点击云掣官网沟通咨询:https://yunche.pro/?t=shequ

相关文章

MySQL运维之分库分表与读写分离

MySQL运维之分库分表与读写分离

分库分表1.介绍问题分析随着互联网以及移动互联网的发展,应用系统的数据量也是成指数式增长,若采用单数据库进行数据存储,存在以下性能瓶颈:IO瓶颈:热点数据太多,数据库缓存不足,产生大量磁盘IO,效率较...

Docker——Windows版本Docker安装

Docker——Windows版本Docker安装

一、简介一、简介  1.1 Docker如何解决大型项目依赖关系复杂,不同组件依赖的兼容性问题?Docker允许开发中将应用、依赖、函数库、配置一起打包,形成可移植镜像Docker应用运行在...

MySQL运维之日志与主从复制

MySQL运维之日志与主从复制

一、日志1.错误日志错误日志是MySQL中最重要的日志之一,它记录了当mysql启动和停止时,以及服务器在运行过程中发生任何严重错误时的相关信息。当数据库出现任何故障导致无法正常使用时,建议首先查看此...

Docker 基础与实战指南(3)

Docker 基础与实战指南(3)

2.2 数据卷:容器是隔离环境,容器内程序的文件、配置、运行时产生的容器都在容器内部,我们要读写容器内的文件非常不方便。大家思考几个问题:如果要升级 MySQL 版本,需要销毁旧容器,那么数据岂不是跟...

Docker:技术架构的演进之路(下)

Docker:技术架构的演进之路(下)

冷热分离架构六、冷热分离架构为了进一步提高系统的并发性能,系统进入冷热分离架构阶段。在这个阶段,引入缓存,实现冷热分离。将热点数据放入缓存中,冷数据放入数据库中,实现数据库的快速响应。这种架构的优点是...

微服务保护和分布式事务(3)

微服务保护和分布式事务(3)

1.3 请求限流:在簇点链路后面点击流控按钮,即可对其做限流配置:在弹出的菜单中填写:这样就把查询购物车列表这个簇点资源的流量限制在了每秒 6 个,也就是最大 QPS 为 6。1.4 线程隔离:限流可...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。