Docker-- cgroups资源控制实战
上一篇:容器化和虚拟化
什么是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%
相关文章:

Docker-- cgroups资源控制实战
上一篇:容器化和虚拟化 什么是cgroups? cgroups是Linux内核中的一项功能,最初由Google的工程师提出,后来被整合进Linux内核; 它允许用户将一系列系统任务及其子任务整合或分隔到按资源划分等级的不同组内,从而为系统…...
使用Python和Vosk库实现语音识别
使用Python和Vosk库实现语音识别 在人工智能和机器学习领域,语音识别技术正变得越来越重要。Python作为一种强大的编程语言,拥有丰富的库和框架,可以方便地实现语音识别功能。今天,我们将介绍如何使用Python中的SpeechRecognitio…...

stm32使用串口的轮询模式,实现数据的收发
------内容以b站博主keysking为原型,整理而来,用作个人学习记录。 首先在STM32CubeMX中配置 前期工作省略,只讲重点设置。 这里我配置的是USART2的模式。 会发现,PA2和PA3分别是TX与RX,在连接串口时需要TX对RX&…...

105. UE5 GAS RPG 搭建主菜单
在这一篇,我们将实现对打开游戏显示的主菜单进行搭建,主菜单将显示游戏主角,游戏名称和进入游戏和退出游戏两个按钮。 搭建菜单场景 我们将主菜单设置为一个单独的场景,前面可以显示对应的UI控件,用于玩家操作&#…...

基于 JAVASSM(Java + Spring + Spring MVC + MyBatis)框架开发一个医院挂号系统
基于 JAVASSM(Java Spring Spring MVC MyBatis)框架开发一个医院挂号系统是一个实用的项目。 步骤一:需求分析 明确系统需要实现的功能,比如: 用户注册和登录查看医生列表预约挂号查看预约记录取消预约管理员管…...

Golang | Leetcode Golang题解之第540题有序数组中的单一元素
题目: 题解: func singleNonDuplicate(nums []int) int {low, high : 0, len(nums)-1for low < high {mid : low (high-low)/2mid - mid & 1if nums[mid] nums[mid1] {low mid 2} else {high mid}}return nums[low] }...

影刀RPA实战:嵌入python,如虎添翼
1. 影刀RPA与Python的关系 影刀RPA与Python的关系可以从以下几个方面来理解: 技术互补:影刀RPA是一种自动化工具,它允许用户通过图形化界面创建自动化流程,而Python是一种编程语言,常用于编写自动化脚本。影刀RPA可以…...
es 数据清理delete_by_query
POST /索引名/_delete_by_query?conflictsproceed&scroll_size2000&wait_for_completionfalse&slices36 {"size": 2000, "query": {"bool": { "must": [{"terms": {"rule_id": [800007]}}]}} }slice…...
【每日 C/C++ 问题】
一、C 中类的三大特性是什么?请简要解释。 封装、继承、多态 封装:将事物的属性(成员变量)和行为(成员函数)封装在一起形成一个类。并且可以设置相应的访问权限(私有的 受保护的 公有的&#…...

stm32学习4
学习目录 一.流水灯1.创建文件2.编写相关代码 一.流水灯 1.创建文件 将方法进行分类保存在不同的 .c 文件中,方便复用和寻找; 创建Hardware\LED文件,其中有led.c和led.h文件,用于存放有关LED灯操作的方法; 在User文…...

Midjourney国内直登
Midjourney确实是一个强大的AI绘画工具,能够根据用户输入的文本生成高质量的图像。然而,由于国内的网络限制,直接访问Midjourney可能会遇到障碍。 目前,已经有一些国内代理或中转平台可以帮助用户更方便地使用Midjourney…...
【双目视觉标定】——3面结构光相机标定实践(获取相机内参)~未完待续
相机标定基本原理及双目相机内参解析 相机标定是计算机视觉中的一个重要步骤,旨在确定相机的内部和外部参数,以便在图像处理中进行准确的三维重建、物体识别等任务。本文将重点讲解双目相机的内参和外参原理,并结合实际参数进行分析。 一、…...
Python常用脚本集锦
收集了一些常用Python脚本,作为平时练手使用,也可以作为自己的笔记,用到哪个功能可以自己查询一下即可。 文件和目录管理 复制文件 import shutil# 复制源文件到目标文件 shutil.copy(source.txt, destination.txt)移动文件 import shuti…...

MacBook 如何设置打开json格式文件的默认程序是vs code
首先右键选中文件,然后选中显示简介 然后选中打开方式 设置成vs code...
如何在 Spring Boot 中实现多数据源的事务管理?
在 Spring Boot 中实现多数据源的事务管理可以通过以下几种方式: 一、使用编程式事务管理 配置多个数据源 如同前面提到的,在 application.properties 或 application.yml 文件中配置多个数据源的连接信息,并创建对应的数据源 bean。 手动开启…...
SQL 常用更新操作
目录 1. 从一个查询结果中获取数据批量更新一张表 1. 从一个查询结果中获取数据批量更新一张表 更新table_a中所有id在tmp查询结果中的name值 UPDATE table_a a SET a.name tmp.name FROM (SELECT id, name FROM table_b) tmp WHERE a.id tmp.id;UPDATE table_a a JOIN (SE…...

Android camera2
一、序言 为了对阶段性的知识积累、方便以后调查问题,特做此文档! 将以camera app 使用camera2 api进行分析。 (1)、打开相机 openCamera (2)、创建会话 createCaptureSession (3)、开始预览 setRepeatingRequest (4)、停止预览 stopRepeating (5)、关闭…...
nginx监控指标有哪些
Nginx 的监控指标可以帮助你了解服务器的性能、资源使用以及运行状态。下面是一些常见的 Nginx 监控指标,涵盖了访问、性能、资源使用等多个方面: 1. 访问量与请求处理 Active Connections(活跃连接数):当前 Nginx 处…...

我谈正态分布——正态偏态
目录 pdf和cdf参数 标准正态分布期望和方差分布形态 3 σ 3\sigma 3σ原则 正态和偏态正态偏态瑞利分布偏度 (Skewness)峰度 (Kurtosis) 比较 正态分布的英文是Normal Distribution,normal是“正常”或“标准”的意思,中文翻译是正态,多完美的…...
如何使用uniswap v2 获取两个代币的交易对池子
在 Uniswap V2 中,获取两个代币的交易对池子(即 pair)可以通过以下步骤实现: 连接到 Uniswap V2 的合约:你需要与 Uniswap V2 的 Factory 合约进行交互,通过该合约来查找代币交易对。 获取交易对地址:Uniswap V2 Factory 合约提供了一个 getPair 函数,可以通过该函数查…...
进程地址空间(比特课总结)
一、进程地址空间 1. 环境变量 1 )⽤户级环境变量与系统级环境变量 全局属性:环境变量具有全局属性,会被⼦进程继承。例如当bash启动⼦进程时,环 境变量会⾃动传递给⼦进程。 本地变量限制:本地变量只在当前进程(ba…...

AI Agent与Agentic AI:原理、应用、挑战与未来展望
文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例:使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例:使用OpenAI GPT-3进…...

为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?
在建筑行业,项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升,传统的管理模式已经难以满足现代工程的需求。过去,许多企业依赖手工记录、口头沟通和分散的信息管理,导致效率低下、成本失控、风险频发。例如&#…...

Mysql中select查询语句的执行过程
目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析(Parser) 2.4、执行sql 1. 预处理(Preprocessor) 2. 查询优化器(Optimizer) 3. 执行器…...

使用Spring AI和MCP协议构建图片搜索服务
目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式(本地调用) SSE模式(远程调用) 4. 注册工具提…...

力扣热题100 k个一组反转链表题解
题目: 代码: func reverseKGroup(head *ListNode, k int) *ListNode {cur : headfor i : 0; i < k; i {if cur nil {return head}cur cur.Next}newHead : reverse(head, cur)head.Next reverseKGroup(cur, k)return newHead }func reverse(start, end *ListNode) *ListN…...
【SpringBoot自动化部署】
SpringBoot自动化部署方法 使用Jenkins进行持续集成与部署 Jenkins是最常用的自动化部署工具之一,能够实现代码拉取、构建、测试和部署的全流程自动化。 配置Jenkins任务时,需要添加Git仓库地址和凭证,设置构建触发器(如GitHub…...

Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement
Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement 1. LAB环境2. L2公告策略2.1 部署Death Star2.2 访问服务2.3 部署L2公告策略2.4 服务宣告 3. 可视化 ARP 流量3.1 部署新服务3.2 准备可视化3.3 再次请求 4. 自动IPAM4.1 IPAM Pool4.2 …...
Leetcode33( 搜索旋转排序数组)
题目表述 整数数组 nums 按升序排列,数组中的值 互不相同 。 在传递给函数之前,nums 在预先未知的某个下标 k(0 < k < nums.length)上进行了 旋转,使数组变为 [nums[k], nums[k1], …, nums[n-1], nums[0], nu…...
Spring Security 认证流程——补充
一、认证流程概述 Spring Security 的认证流程基于 过滤器链(Filter Chain),核心组件包括 UsernamePasswordAuthenticationFilter、AuthenticationManager、UserDetailsService 等。整个流程可分为以下步骤: 用户提交登录请求拦…...