Docker-- cgroups资源控制实战

devtools/2024/11/7 23:07:13/

上一篇:容器化和虚拟化

什么是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控制子系统

名称功能
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]
  • 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

在这里插入图片描述
通过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%


http://www.ppmy.cn/devtools/131686.html

相关文章

android浏览器源码 可输入地址或关键词搜索 android studio 2024 可开发可改地址

Android 浏览器是一种运行在Android操作系统上的应用程序&#xff0c;主要用于访问和查看互联网内容。以下是关于Android浏览器的详细介绍&#xff1a; 1. 基本功能 Android浏览器提供了用户浏览网页的基本功能&#xff0c;如&#xff1a; 网页加载&#xff1a;支持加载静态…

2024 手机解压缩软件评测与推荐

手机解压缩软件在如今的移动互联网时代扮演着至关重要的角色。首先&#xff0c;在处理文件方面&#xff0c;当我们从各种渠道获取文件时&#xff0c;很多时候这些文件是以压缩包的形式存在的。手机解压缩软件能够快速地将这些压缩包解压&#xff0c;让我们方便地查看和使用其中…

只允许指定ip远程连接ssh

我们都会使用securtcrt或者xshell等软件进行远程登录&#xff0c;这样虽然会给我们带来很多便捷&#xff0c;但是同样会存在一定的风险。有很多人专门通过重复的扫描试图破解我们的linux服务器&#xff0c;从而获取免费的“肉鸡”。因此我们可以通过设置hosts.allow和hosts.den…

MySQL的sql练习,适合初学者

通过两张表&#xff0c;emp&#xff0c;dept 来演示mysql的sql语句 dept表 CREATE TABLE dept (id INT AUTO_INCREMENT PRIMARY KEY,name VARCHAR(255) NOT NULL );emp表 CREATE TABLE emp (id INT AUTO_INCREMENT PRIMARY KEY,name VARCHAR(255) NOT NULL,age INT,sex VARCH…

鉴源实验室·如何通过雷达攻击自动驾驶汽车-针对点云识别模型的对抗性攻击的科普

01 引 言 随着自动驾驶技术的迅速发展&#xff0c;雷达和激光雷达等传感器在自动驾驶汽车中的作用愈发重要。它们能够生成3D点云数据&#xff0c;帮助车辆实时感知周围环境并做出安全决策。然而&#xff0c;尽管这些传感器对驾驶环境的检测非常精确&#xff0c;它们也面临一种…

npm入门教程12:npm link功能

一、npm link的基本用法 在本地npm模块目录中执行npm link 当你在开发一个npm模块时&#xff0c;可以在该模块的根目录下运行npm link命令。这个命令会在全局的npm模块目录中创建一个符号链接&#xff0c;指向你当前的本地模块。这样&#xff0c;你的本地模块就被注册为了一个全…

Qt 视口和窗口

Qt 视口和窗口 1、视口和窗口的定义与原理 绘图设备的物理坐标是基本的坐标系&#xff0c;通过 QPainter 的平移、旋转等变换可以得到更容易操作的逻辑坐标。 为了实现更方便的坐标&#xff0c;QPainter 还提供了视口 (Viewport)和窗口 (Window)坐标系&#xff0c;通过Q…

【瑞吉外卖】-day03

目录 前言 启动禁用员工账号 消息转换器 1. Jackson (用于JSON) 2. JAXB (用于XML) 3. Gson (用于JSON) 4. MessagePack (用于二进制格式) 页面展示 代码部分 启动禁用员工账号修改&#xff08;个人意见&#xff09; 公共字段自动填充 ThreadLocal简要概述 基本用法…