Docker-- cgroups资源控制实战

news2024/11/25 11:50:52

上一篇:容器化和虚拟化

什么是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.coloradmin.cn/o/2234066.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

解决ImportError: DLL load failed while importing _message: 找不到指定的程序。

C:\software\Anoconda\envs\yolov5_train\python.exe C:\Project\13_yolov5-master\train.py C:\software\Anoconda\envs\yolov5_train\lib\site-packages\torchvision\io\image.py:13: UserWarning: Failed to load image Python extension: [WinError 127] 找不到指定的程序…

超越Axure:探索新一代原型设计工具

Axure RP是一款被广泛认可的快速原型设计工具&#xff0c;专为专业设计师打造&#xff0c;用于创建高效的产品原型图&#xff0c;包括APP和网页的原型图、框架图和结构图等。Axure RP制作的原型图能够实现与实际APP相似的交互效果&#xff0c;便于向用户或客户展示&#xff0c;…

综合项目--博客

一。基础配置&#xff1a; 1.配置主机名&#xff0c;静态IP地址 2.开启防火墙配置 3.部分开启selinux并且配置 4.服务器之间使用同ntp.aliyun.com进行世家能同步 5.服务器之间实现SSH绵密登陆 二。业务需求 1.Sever-NFS-DNS主机配置NFS服务器&#xff0c;将博客网站资源…

dns欺骗

[[Ettercap]] 少不了这个 arp 毒化和流量截取的中间人工具。 dns欺骗原理 什么是 DNS 欺骗&#xff1f; DNS 欺骗&#xff08;DNS Spoofing&#xff09; 是一种网络攻击技术&#xff0c;攻击者通过修改 DNS 响应&#xff0c;将目标用户的 DNS 查询结果篡改&#xff0c;指向攻…

危机来临前---- 力扣: 876

危机即将来临 – 链表的中间节点 描述&#xff1a; 给你单链表的头结点 head &#xff0c;请你找出并返回链表的中间结点。如果有两个中间结点&#xff0c;则返回第二个中间结点。 示例&#xff1a; 何解&#xff1f; 1、遍历找到中间节点 &#xff1a; 这个之在回文链表中找…

SQL Server数据库中,报错:用户名或密码不正确

1、 用户名或密码不正确 2、解决方式 可能是服务器名称不对&#xff0c;检查服务器名称是否是安装sqlserver数据的服务器名称。安装sqlserver数据的服务器&#xff0c;没有开启1433端口&#xff0c;需要开启端口 下一步保证&#xff1a;TCP/IP 状态状态为&#xff1a;已启用 然…

PKG_CHECK_MODULES(FUSE,fuse)

运行 ./configure 命令报错如下&#xff1a; ./configure: line 13934: syntax error near unexpected token FUSE,fuse ./configure: line 13934: PKG_CHECK_MODULES(FUSE,fuse)解决方案&#xff1a; 命令窗口运行如下命令&#xff0c;安装 pkg-config&#xff1a; sudo …

不要只知道deepl翻译,这里有10个专业好用的翻译工具等着你。

deepl翻译的优点还是有很多的&#xff0c;比如翻译的准确性很高&#xff0c;支持翻译的语言有很多&#xff0c;并且支持翻译文件和文本。但是现在翻译工具那么多&#xff0c;大家需要翻译的场景也有很多&#xff0c;怎么能只拥有一个翻译工具呢。所以在这里我帮助大家寻找了一波…

如何检索 LINEMOD 数据集的相机内参

简介 BOP (Benchmark for 6D Object Pose Estimation) 是一个专为6D物体姿态估计而设计的基准测试平台。它为研究人员提供了多种数据集&#xff0c;以帮助评估和比较物体识别和姿态估计算法的性能。官方网站是 BOP&#xff0c;你可以在这里找到丰富的资源和信息。 检索 LINEM…

健康生活的重要性,注重规律作息

在快节奏的现代生活中&#xff0c;健康已成为我们最宝贵的财富。随着生活水平的提高&#xff0c;人们越来越注重养生&#xff0c;追求身心的和谐与平衡。那么&#xff0c;如何在繁忙的日常中实践健康养生&#xff0c;为生活注入新的活力呢&#xff1f;以下是一些实用的建议&…

最简单方式SSH连接局域网中另一台电脑的WSL2

1、首先确认一下WSL2中的SSH服务是否开启&#xff1a; 先安装更新一下&#xff0c;再安装一下ssh服务模块&#xff0c;这里很多人都没有安装过。 sudo apt update sudo apt upgrade sudo apt install openssh-server 2、配置SSH服务器&#xff1a; 打开配置文件&#xff0c…

andrular输入框input监听值传递

效果图&#xff1a; step1: E:\projectgood\ajnine\untitled4\src\app\apple\apple.component.html <button mat-button (click)“openDialog()”>Open dialog step2: E:\projectgood\ajnine\untitled4\src\app\apple\apple.component.ts import {Component, inject}…

数据结构——二叉树(续集)

♥♥♥~~~~~~欢迎光临知星小度博客空间~~~~~~♥♥♥ ♥♥♥零星地变得优秀~也能拼凑出星河~♥♥♥ ♥♥♥我们一起努力成为更好的自己~♥♥♥ ♥♥♥如果这一篇博客对你有帮助~别忘了点赞分享哦~♥♥♥ ♥♥♥如果有什么问题可以评论区留言或者私信我哦~♥♥♥ 在上一篇博客我们…

动态规划 —— dp问题-按摩师

1. 按摩师 题目链接&#xff1a; 面试题 17.16. 按摩师 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/the-masseuse-lcci/description/ 2. 算法原理 状态表示&#xff1a;以某一个位置为结尾或者以某一个位置为起点 dp[i]表示&#xff1a;选择到i位置…

python爬取旅游攻略(1)

参考网址&#xff1a; https://blog.csdn.net/m0_61981943/article/details/131262987 导入相关库&#xff0c;用get请求方式请求网页方式&#xff1a; import requests import parsel import csv import time import random url fhttps://travel.qunar.com/travelbook/list.…

C++设计模式创建型模式———原型模式

文章目录 一、引言二、原型模式三、总结 一、引言 与工厂模式相同&#xff0c;原型模式&#xff08;Prototype&#xff09;也是创建型模式。原型模式通过一个对象&#xff08;原型对象&#xff09;克隆出多个一模一样的对象。实际上&#xff0c;该模式与其说是一种设计模式&am…

基于STM32的智能温室环境监测与控制系统设计(代码示例)

一、项目概述 在现代农业中&#xff0c;智能大棚能够通过环境监测、数据分析和自动控制等技术手段&#xff0c;实现对作物生长环境的精细化管理。本项目旨在设计一个基于STM32单片机的智能大棚系统&#xff0c;能够实时监测光照强度、空气温湿度及土壤湿度&#xff0c;并根据设…

(五)Web前端开发进阶2——AJAX

目录 1.Ajax概述 2.Axios库 3.认识URL 4.Axios常用请求方法 5.HTTP协议——请求报文/响应报文 6.HMLHttpRequest对象 7.前后端分离开发&#xff08;接口文档&#xff09; 8.Element组件库 1.Ajax概述 AJAX 是异步的 JavaScript和XML(Asynchronous JavaScript And XML)。…

进程信号——信号的保存

信号的概念 实际执行信号的处理动作称为信号递达(Delivery) 信号从产生到递达之间的状态,称为信号未决(Pending)。 进程可以选择阻塞 (Block )某个信号。 被阻塞的信号产生时将保持在未决状态,直到进程解除对此信号的阻塞,才执行递达的动作. 注意,阻塞和忽略是不同的,只要信号…

基于SSM的“房屋租赁系统”的设计与实现(源码+数据库+文档+PPT)

基于SSM的“房屋租赁系统”的设计与实现&#xff08;源码数据库文档PPT) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SSM&#xff0c;JSP 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 房屋租赁系统首页 管理员后台管理页面 报告故障管…