Docker-Cgroup资源限制

news2024/9/24 11:23:10

目录

一、Cgroup

1.CGROUP概念

2.CGROUP 子系统

3.CGROUP 示例

二、内存资源限制

1.内存资源限制概念

2.内存资源限制参数 1

3.内存资源限制参数 2

三、CPU 资源限制

1.容器中 CPU 使用

2.容器 CPU 限制参数

四、实验演示


一、Cgroup

1.CGROUP概念

 在linux内核里提供进程资源限制的一个底层原理,是一个内核机制。

       Linux Cgroup 全称 Linux Control Group, 是 Linux 内核的一个功能,用来限制,控制与分离一个进程组群的资源(如 CPU、内存、磁盘输入输出等)。这个项目最早是由 Google 的工程师在 2006 年发起,最早的名称为进程容器( process containers )。在 2007 年时,因为在 Linux 内核中,容器(container)这个名词太过广泛,为避免混乱,被重命名为 cgroup,并且被合并到 2.6.24 版的内核中去

         (1)限制资源使用            #限制进程组群

         (2)优先级控制

         (3)一些审计或一些统计

         (4)挂起进程,恢复执行进程

2.CGROUP 子系统

cpu 子系统,主要限制进程的 cpu 使用率

cpuacct 子系统,可以统计 cgroups 中的进程的 cpu 使用报告

cpuset 子系统,可以为 cgroups 中的进程分配单独的 cpu 节点或者内存节点

memory 子系统,可以限制进程的 memory 使用量,内存子系统,限制内存的使用量

blkio 子系统,可以限制进程的块设备 io

devices 子系统,可以控制进程能够访问某些设备

net_cls 子系统,可以标记 cgroups 中进程的网络数据包,然后可以使用 tc 模块(traffic control)对数据包进行控制

net_prio — 这个子系统用来设计网络流量的优先级

freezer 子系统,可以挂起或者恢复 cgroups 中的进程

ns 子系统,可以使不同 cgroups 下面的进程使用不同的 namespace

hugetlb — 这个子系统主要针对于HugeTLB系统进行限制,这是一个大页文件系统

3.CGROUP 示例

# 查看 Cgroup 挂载点    

[root@master ~]# mount -t cgroup

#把cgroup的子系统挂载到当前目录下,我们只要对这些文件做操作,就可以实现这些所谓的cgroup的底层功能的控制。

# 创建隔离组

[root@master cpu]# cd /sys/fs/cgroup/cpu         这个目录为挂在后的挂载点,cpu为挂载cpu子系统

[root@master cpu]# mkdir cpu_test                      #创建进程组群

# 示例代码(用C语言写的代码)

int main(void)            

{

    int i = 0;

    for(;;) i++;

    return 0;

}

#在我们的void函数里,创建一个变量是整型类型叫i,初始值为0,在死循环中i++的意思是i=i+1,无限叠加,

[root@master cpu]# echo 20000 > /sys/fs/cgroup/cpu/cpu_test/cpu.cfs_quota_us

[root@master cpu]# echo 23732 >> /sys/fs/cgroup/cpu/cpu_test/tasks

mount -t cgroup
    #把cgroup的子系统挂载到当前目录下,我们只要对这些文件做操作,就可以实现这些所谓的cgroup的底层功能的控制。

vim main.c
	int main(void)		
	{ 
    	int i = 0;
    	for(;;) i++;
    	return 0;
	}
#在我们的void函数里,创建一个变量是整型类型叫i,初始值为0,在死循环中i++的意思是i=i+1,无限叠加。

yum -y install gcc gcc-c++
    #安装编译环境
gcc main.c		
    #把源码main.c编译可执行文件
./a.out
    #执行生成的编译文件
top
    #查看cpu的使用情况,已经达到100%了

cd /sys/fs/cgroup/cpu

cat tasks
    #当前所有进程都在这里面

mkdir cpu_test		cd cpu_test/		ls
    #cpu.cfs_quota_us代表当前用户可以使用的大小

echo 5360 >> tasks
    #a.out的进程号写入tasks文件

echo 20000 >> cpu.cfs_quota_us
    #一个周期默认的最大配额是10万,这里给到两万

top
    #cpu占比明显下降,这就是cpu资源限制的方法

docker ps -a
    #虽然没有给容器做资源限制,但是docker默认给容器做了资源限制.
    #不是说已经做了资源限制,而是已经把资源限制的目录创建好了。

cd /sys/fs/cgroup/cpu/docker
    #查看容器的资源限制目录
    #进入到目录里面,将资源配额写入到cpu.cfs_period_us中,就相当于对整个容器做了资源限制.

二、内存资源限制

可压缩性资源:资源被降低以后,不会影响进程的正常运行

不可压缩性资源:资源被降低以后,会影响进程的正常运行

         内存(不可压缩性资源

1.内存资源限制概念

默认情况下,如果不对容器做任何限制,容器能够占用当前系统能给容器提供的所有资源

        Docker 限制可以从 Memory、CPU、Block I/O 三个方面

        OOME:Out Of Memory Exception

                一旦发生 OOME,任何进程都有可能被杀死,包括 docker daemon 在内

                为此,Docker 调整了 docker daemon 的 OOM 优先级,以免被内核关闭

2.内存资源限制参数 1

3.内存资源限制参数 2

        #在kubernetes中,默认不允许开启虚拟内存,如果开启可能会报错,无法启动

三、CPU 资源限制

1.容器中 CPU 使用

默认情况下,如果不对容器做任何限制,容器能够占用当前系统中的所有 CPU 资源

        大多数进程是采用 CFS 调度算法(公平调度原则

        1.13 Docker 版本后支持实时调度算法

2.容器 CPU 限制参数

四、实验演示

docker run --name stress -it --rm -m 256m lorel/docker-stress-ng:latest stress -vm 2 
	#-m表示--memage设置当前的物理内存, -vm 2 为压力测试的一个选项

docker run --name stress -it --rm --cpus 2 lorel/docker-stress-ng:latest stress --cpu 8  
	#--cpus指定cpu的使用核心数

docker run --name stress -it --rm --cpuset-cpus 0 lorel/docker-stress-ng:latest stress --cpu 8
	#指定使用哪个CPU核心
终端1:
docker run --name stress -it --rm lorel/docker-stress-ng:latest stress -vm 2

终端2:
free -m
    #查看内存使用情况

docker stats
    #查看docker的运行状态
    #查看当前容器的的内存大小

终端1:
docker run --name stress -it --rm lorel/docker-stress-ng:latest stress -vm 20

终端2:
docker stats
查看内存资源使用情况

终端1:
docker run --name stress -it --rm -m 100m lorel/docker-stress-ng:latest stress -vm 20
	#加入内存资源限制
    #没有把错误传递到系统,过度占用内存,随机杀死进程,出现OOM的报错提示

终端2:
docker stats
    #查看资源使用情况,观察内存限制的效果。

终端1:
docker run --name stress -it --rm lorel/docker-stress-ng:latest stress --cpu 8
	#不加入资源限制,现在实在对物理机的最大CPU资源做压力测试
    #会报很多的OOM的错误提示,不断随即删除进程释放资源
终端2:
docker stats
    #查看资源使用情况

终端1:
docker run --name stress -it --rm --cpus 6 lorel/docker-stress-ng:latest stress --cpu 8
	#会报错,因为没有6个cpu核心

docker run --name stress -it --rm --cpus 0.1 lorel/docker-stress-ng:latest stress --cpu 8

终端2:
docker stats
    #查看资源使用情况

终端1:
docker run --name stress -it --rm --cpuset-cpus 0-1 lorel/docker-stress-ng:latest stress --cpu 8
	#分配的--cpuset-cpus的值,决定了它的上限,数值如果为0,代表使用cpu的最大值为100%,数值为0-1的时候,表示0-1号的cpu都可以用,最高可以使用cpu至200%

终端2:
docker stats
    #查看资源使用情况

终端1:
docker run --name stress -it --rm --cpuset-cpus 0-1 --cpus 0.1 lorel/docker-stress-ng:latest stress --cpu 8
	#0-1的cpu都可以用,但是cpu的最大使用值为10%

终端2:
docker stats
    #查看docker的资源使用情况

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1420787.html

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

相关文章

【LeetCode: 25. K 个一组翻转链表 + 链表 + 递归】

🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,…

Vue之初识Vue CLI 脚手架

Vue CLI 是Vue 官方提供的一个全局命令工具 可以帮助我们快速创建一个开发Vue项目的标准化基础架子。【集成了webpack配置】 脚手架有什么好处? 1.开箱即用,零配置 2.内置 babel 等工具 3.标准化 使用步骤: 1.全局安装(一次):yarn globaladd vue/cli …

vue3中使用echarts

效果如图: 1、首先安装echarts npm install echarts --save安装后的版本为&#xff1a; “echarts”: “5.4.2”, 2、页面使用 <template><div class"contact_us_page main"><div class"contact_us " id"main" ref"ech…

实际项目演示:Python RegEx在数据处理中的应用!

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 正则表达式&#xff08;Regular Expressions&#xff0c;简称 RegEx&#xff09;是一种强大的文本匹配和搜索工具&#xff0c;它在数据处理、文本解析和字符串操作中发挥着关键作用。Python 提供了内置的 re 模块…

DevOps落地笔记-01|追溯本源:DevOps的发展历史回顾

任何事物的诞生、发展和消亡都是由所处社会阶段决定的&#xff0c;软件开发方法也是一样。现在我们津津乐道的 DevOps&#xff0c;也有其自己的起源和诞生的前提条件&#xff0c;今天我带领你追本溯源&#xff0c;一起找一找 DevOps 兴起的历史根源。 当谈到 DevOps&#xff0…

kafka集群搭建需要做的事情

首先&#xff0c;虚拟机克隆好之后的步骤如下&#xff1a; 1. 修改IP、主机名&#xff0c;关闭防火墙&#xff1b;&#xff08;reboot重启&#xff09; 2. 在/etc/hosts文件中进行IP与主机名的映射配置&#xff0c;集群中每天都记得配置&#xff1b; 3. 安装JDK并进行分发&a…

3种JWT验证和续签的策略

3 种JWT验证和续签的策略 好文推荐&#xff1a;一文教你搞定所有前端鉴权与后端鉴权方案&#xff0c;让你不再迷惘 - 掘金 (juejin.cn) 3 种jwt 验证的策略 通过解析去验证&#xff1a;每次访问api时parse jwt 判断是否vaild jwt有效 正常调用api jwt无效 返回401 缺点&a…

字符串和格式化输入/输出

本文参考C Primerf Plus进行C语言学习 文章目录 使用scanf() 从scanf()角度看输入格式字符串中的普通字符scanf()的返回值 1.使用scanf() 如果用scanf()读取基本变量类型的值&#xff0c;在变量名前加上一个&;如果用scanf()把字符串读入字符数组中&#xff0c;不要使用&am…

Kotlin快速入门系列6

Kotlin的接口与扩展 接口 与Java类似&#xff0c;Kotlin使用interface关键字定义接口&#xff0c;同时允许方法有默认实现&#xff1a; interface KtInterfaceTest {fun method()fun methodGo(){println("上面方法未实现&#xff0c;此方法已实现")} } 接口实现 …

提升编程效率的利器: 解析Google Guava库之集合篇RangeSet范围集合(五)

在编程中&#xff0c;我们经常需要处理各种范围集合&#xff0c;例如时间范围、数字范围等。传统的集合类库往往只能处理离散的元素集合&#xff0c;对于范围集合的处理则显得力不从心。为了解决这个问题&#xff0c;Google的Guava库提供了一种强大的数据结构——RangeSet&…

【JLU】校园网linux客户端运行方法

终于给这输入法整好了&#xff0c;就像上面图里那样执行命令就行 写一个开机自启的脚本会更方便&#xff0c;每次都运行也挺烦的 补充了一键运行脚本&#xff0c;文件路径$DIR需要自己修改 #!/bin/bash DIR"/home/d0/ubuntu-drclient-64/DrClient" run_per_prog&qu…

微信小程序上传时报错message:Error: 系统错误,错误码:80051,source size 2148KB exceed max limit 2MB

问题&#xff1a; 微信小程序上传时错误码&#xff1a;80051,source size 2248KB exceed max limit 2MB 问题原因&#xff1a; 由于代码中的静态资源 图片大小超了200k以及主包的体积超出1.5M 解决办法 分包 tabBar 是主包的&#xff0c;不需要分包处理&#xff0c;以下是分…

0130-2-秋招面试—HTML篇

2023 HTML面试题 1.src和href的区别 scr用于替换当前元素&#xff0c;href用于在当前文档和外部资源之间建立联系。 <script src"main.js"></script><link href"style.css" rel"stylesheet" />2.对HTML语义化的理解 根据内…

Linux:重定向

Linux&#xff1a;重定向 输出重定向追加重定向输出重定向与追加重定向的本质输入重定向 输出重定向 在Linux中&#xff0c;输出重定向是一种将命令的输出发送到不同位置的方法。通常&#xff0c;执行命令时&#xff0c;输出会显示在终端上。然而&#xff0c;使用输出重定向&a…

5-1 A. DS串应用--KMP算法

题目描述 学习KMP算法&#xff0c;给出主串和模式串&#xff0c;求模式串在主串的位置 算法框架如下&#xff0c;仅供参考 输入 第一个输入t&#xff0c;表示有t个实例 第二行输入第1个实例的主串&#xff0c;第三行输入第1个实例的模式串 以此类推 输入样例&#xff1a; 3 qwe…

产品经理的发展方向是什么?市场需求现状如何?未来有哪些趋势?作为产品经理应该如何准备?

目录 了解产品经理的发展方向 市场需求现状 未来有那些趋势&#xff1f; 作为产品经理应该作何准备? 了解产品经理的发展方向 市场需求现状 未来有那些趋势&#xff1f; 个人软件 &#xff1a;智能终端&#xff0c;轻量化应用&#xff0c;虚拟社交等企业软件&#xff1a…

用GoLand写一个小玩意-git定时push、commit

这里是weihubeats,觉得文章不错可以关注公众号小奏技术&#xff0c;文章首发。拒绝营销号&#xff0c;拒绝标题党 背景 有时候你想刷一刷github的commit墙&#xff0c;或者公司需要每天提交代码&#xff0c;你想摸鱼。就有这么一个小需求&#xff0c;想要自动commit、push代码…

solr的原理是什么

1 Java程序里如果有无限for循环的代码导致CPU负载超高&#xff0c;如何排查&#xff1f; 排查Java程序中由于无限循环导致的CPU负载过高的问题&#xff0c;可以按照以下步骤进行&#xff1a; 资源监控&#xff1a; 使用系统命令行工具&#xff08;如Linux上的top或htop&#xf…

Arrays.asList()方法调用add()或remove()抛出java.lang.UnsupportedOperationException问题

在使用Arrays.asList方法将以,分割的字符串转为list集合时&#xff0c;调用add和remove等方法时会抛出java.lang.UnsupportedOperationException。以下为原因和解决方法。 原因&#xff1a; Arrays.asList()方法返回了一个Arrays类的一个继承了AbstractList的ArrayList内部类…

富文本编辑器CKEditor4简单使用-03(图片上传)

富文本编辑器CKEditor4简单使用-03&#xff08;图片上传&#xff09; 1. 前言1.1 关于CKEditor4的安装及简单使用1.2 关于CKEditor4的插件安装及使用1.3 关于Easy Image 2. CKEditor4自带的默认上传图片按钮功能3. 使用增强的图像插件3.1 什么是增强的图像插件3.2 下载并安装增…