docker

关注公众号 jb51net

关闭
首页 > 网站技巧 > 服务器 > 云和虚拟化 > docker > Docker cgroups资源控制

Docker中cgroups资源控制实战

作者:诡异森林。

cgroups是Linux内核的功能,允许用户管理和限制进程组资源使用,支持资源限制、优先级控制、资源记录等,应用广泛,Docker和k8s等容器技术,通过cgroups实现精细的资源控制,本文就来详细的介绍一下

什么是cgroups?

cgroups是Linux内核中的一项功能,最初由Google的工程师提出,后来被整合进Linux内核;
它允许用户将一系列系统任务及其子任务整合或分隔到按资源划分等级的不同组内,从而为系统资源管理提供一个统一的框架。

基本功能

组成结构

为什么使用cgroups?

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

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

cgroups控制子系统

名称功能
blkio对块设备的 IO 进行限制
cpu限制 CPU 时间片的分配
cpuacct生成 cgroup 中的任务占用 CPU 资源的报告,与 cpu 挂载在同一目录
cpuset给 cgroup 中的任务分配独立的 CPU(多处理器系统) 和内存节点
devices限制设备文件的创建,和对设备文件的读写
memory对 cgroup 中的任务的可用内存进行限制,并自动生成资源占用报告
freezer暂停/恢复 cgroup 中的任务
hugetlb限制使用的内存页数量
perf_event允许 perf 观测 cgroup 中的 task
pids限制任务的数量
rdma限制 RDMA 资源(Remote Direct Memory Access,远程直接数据存取)

命令:pidstat

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

基本语法

pidstat [options] [interval] [count]

关键参数

如:
每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]]

例如:

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

pidstat-C stress-p ALL-u2 10000

压力测试cpu:

stress-c 1

在这里插入图片描述

通过pidstat监控看到

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

stress-i 1

在这里插入图片描述

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

stress-m --vm-bytes 50m

在这里插入图片描述

压力进程的写入能力测试

stress -d 1

在这里插入图片描述

cgroups信息查看

版本查看

cat /proc/filesystems | grep cg

在这里插入图片描述

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

子系统查看

cat /proc/cgroups

在这里插入图片描述

cgroup 挂载信息查看

mount |  grep cgroup

在这里插入图片描述

显示当前挂载的文件系统,这些行显示了不同的cgroup子系统是如何挂载到文件系统中的
tmpfs是一种基于内存的文件系统,这里它被用来挂载cgroup的根目录。
cgroup类型表示这是一个cgroup挂载点,后面的参数(如name=systemd)指定了cgroup子系统的名称。

在这里插入图片描述

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

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

当使用了systemd作为初始化系统(init system)时,/sys/fs/cgroup/目录下会包含各种cgroup(控制组)子系统的挂载点。
user.slice是systemd用来管理用户会话的一个cgroup层级,它包含了所有用户级别的进程和服务。

查看该目录下的文件:

在这里插入图片描述

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

使用cgroups对内存的控制

先进入到内存控制目录

cd/sys/fs/cgroup/memory

在这里插入图片描述

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

mkdir test_memlimit
cd test_memlimit

在这里插入图片描述

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

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

echo "20971520" > memory.limit_in_bytes

在这里插入图片描述

开启对内存的监控和压力测试:

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

在这里插入图片描述

将stress进程放入cgroup策略中:

echo "3605712" > tasks

在这里插入图片描述

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

使用cgroups对cpu进行控制

mount | grep cg

在这里插入图片描述

创建测试目录并进入:

mkdir test_cpu
cd test_cpu

开启cpu压力测试并监控:

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

在这里插入图片描述

cpu_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

在这里插入图片描述

将进程放入tasks进行控制:

echo "3615387" > tasks

在这里插入图片描述

cpu利用率变为20%

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

您可能感兴趣的文章:
阅读全文