05. 容器资源管理

news2024/9/23 11:22:50

目录

1、前言

2、CGroup

2.1、是否开启CGroup

2.2、Linux CGroup限制资源能使用

2.2.1、创建一个demo

2.2.2、CGroup限制CPU使用

2.3、Linux CGroup限制内存使用

2.4、Linux CGroup限制IO

3、Docker对资源的管理

3.1、Docker对CPU的限制

3.1.1、构建一个镜像

3.1.2、构建两个容器

3.1.3、查看CPU使用率

3.2、Docker对内存的限制

3.3、Docker对IO的限制

3.4、查看Docker的资源配置


1、前言

通常情况下,我们一台宿主机上会同时启动多个Docker容器,而在默认情况下,Docker是没有限制其运行的容器所使用的硬件资源,比如CPU,内存,IO等。而在实际环境中,往往一个容器的负载过高,会占用宿主机的大部分资源,会导致其他容器的访问资源被抢占,而出现响应超时或无法响应等情况。

因此,我们往往会对同时启动的Docker容器做资源的分配和管理。这就是我们今天要说的容器资源管理。

2、CGroup

熟悉Linux的应该知道,Linux内核提供了一组为cgroup(Controller Group)的进程,通过这些进程可以限制应用对资源的使用,如CPU,内存等。通过cgroup可以对系统资源做精细化控制,例如实现对每个容器使用的CPU比率进行限制。

Linux CGroup主要提供了几种功能:

  • Resource Limitation:限制资源的使用,如CPU,内存的上限。
  • Prioritization:应用的优先级控制,如控制任务的调度。
  • Accounting:应用的审计和统计,例如实现应用的计费。
  • Control:实现对应用的控制,例如应用的挂起,恢复和执行等。

2.1、是否开启CGroup

cat /boot/config-3.10.0-1160.el7.x86_64 |grep CGROUP

如果相关参数是y,表示已经启动了Linux CGroup,默认是开启的。

0

2.2、Linux CGroup限制资源能使用

2.2.1、创建一个demo

创建一个high_cpu.java文件。

touch high_cpu.java

编写一段死循环代码。

class HighCpu {
    public static void main(String args[]) {
        int i=0;
        while(true){
            i++;
        }

    }
}

再编译执行他。

javac high_cpu

nohup java HighCpu &

执行完观察cpu占用情况。

htop

我这里启了两个,所以两个进程。但是不影响我们观测,可以看到进程3999的CPU使用率已经接近100%。

0

安装htop步骤:

yum -y install epel-release.noarch

yum -y install htop

2.2.2、CGroup限制CPU使用

1)首先进入系统cgroup目录下。

cd /sys/fs/cgroup/
ls

可以看到里面有很多熟悉的资源相关文件,如cpu,memory,blkio等。

0

没错,我们要限制cpu使用,当然是进入到cpu/目录。

cd spu/
# 创建我们自己的资源隔离脚本,
mkdir mycpu
cd mycpu
ls

可以看到在里面默认生成很多cpu相关的脚本文件。

0

我们着重看cpu.cfs_quota_us。

cat cpu.cfs_quota_us

里面的值为-1,则表示不限制cpu使用。

0

我们修改他的值为2000,也就是限制20%阈值。

echo 20000 > cpu.cfs_quota_us

#同时把我们上面的进程号(3999)写进tasks文件
echo 3999 > tasks

0

我们再htop观察下cpu占用,可以看到CPU使用已经成功降到了20%的上限。

0

2.3、Linux CGroup限制内存使用

同上面的CPU限制,内存限制也类似。

cd /sys/fs/cgroup/memory
mkdir mymem
cd mymem
more memory.limit_in_bytes 

可以看到这个值很大,表示对内存没有进行限制。

0

同样我们可以通过配置进行调整。

echo 10m > memory.limit_in_bytes

#同时把我们上面的进程号(3999)写进tasks文件
echo 3999 > tasks

这样,内存使用就限制了10m可用。

2.4、Linux CGroup限制IO

cd /sys/fs/cgroup/blkio
mkdir myio
cd myio
echo '8:0 1048576' > blkio.throttle.read_bps_device

#同时把我们上面的进程号(3999)写进tasks文件
echo 3999 > tasks

上面的"8:0"是当前需要限制的设备号。如要查看/dev/sda磁盘的设备号,可以使用ls -l /dev/sda。

3、Docker对资源的管理

为什么前面说了那么多Linux CGroup对资源的管理?因为Docker是构建在Linux基础上的,因此Docker就是利用Linux CGroup来实现对资源的控制。那么有了前面CGroup的认识,我们接下来学习Docker资源管理就容易很多。

3.1、Docker对CPU的限制

Docker引擎可以通过-c或--cpu-shares来为每个容器分配一个“CPU使用的权重”。该权重与实际的处理速度无关,每个容器默认有1024个CPU配额权重。

如果启动了两个容器,并且两个都使用默认的权重值 1024,则 Docker 引擎将把 CPU使用率平均分配给这两个容器,即这两个容器各自占用 50%的 CPU使用率。

但是,如果给容器 A分配的是 1024 权重,而给容器 B分配的是 512 权重,则会发现容器A使用CPU的比例比容器B使用 CPU的比例多一倍。

3.1.1、构建一个镜像

创建一个Dockerfile文件,这里直接使用我们前面用过的例子:

# 指定基础镜像作为该容器的基础环境,如springboot应用最起码得有jdk环境
FROM openjdk:8

# 执行维护者的信息
MAINTAINER shamee csdn peng793049488

# 创建一个存放该工程的目录
RUN mkdir -p /data/project
ADD target/dockerfile-springboot-1.0-SNAPSHOT.jar /data/project/dockerfile-springboot-1.0-SNAPSHOT.jar

# 对外暴露一个8899端口
EXPOSE 8899

# 执行启动
ENTRYPOINT ["/bin/sh", "-c", "java -jar /data/project/dockerfile-springboot-1.0-SNAPSHOT.jar"]

使用docker build构建镜像:

docker build -t docker_cgroup .

0

构建完,便可以看到我们的镜像docker_cgroup。

3.1.2、构建两个容器

# 第一个容器, CPU默认(1024)
docker run -d docker_cgroup --cpu 4 --name=cpu_1024

# 第二个容器, CPU配额权重512
docker run -d  -c 512 docker_cgroup --cpu 4  --name=cpu_512

3.1.3、查看CPU使用率

通过命令:

docker stats

可以看到CPU的占用情况,设置1024权重的CPU占用率比512的高将近一倍。

0

docker stats 命令可以查看容器的CPU,内存,IO等分配,使用情况。下面的内存验证和IO验证均可以使用该命令查看。

除此以外,还可以设置以下参数,直接绑定CPU核心数:

# 表示使用CPU0,1,2核
--cpuset-cpus=0,1,2

3.2、Docker对内存的限制

同上面CPU的管理,Docker引擎支持通过-m参数来设定容器所使用的内存。

如:

docker run -it xxx -m 256m

-m 256m表示限制容器使用的内存大小为256m。验证方式可以类似上面CPU管理方式,可以直接使用docker stats来查看。这里就不赘述。

3.3、Docker对IO的限制

对I/O的限制,可以使用参数:

# 这里是限制容器写入速度为1MB/s
docker run -it xxx --device-write-bps /dev/sda:1mb

其他参数:

参数名称

说明

--blkio-weight

可以通过--blkio-weight 修改容器 blkio 的权重,权重值为 10~1000

--blkio-weight-device weighted-device

指定某个设备的权重

--device-read-bps throttled-device

按每秒读取块设备的数据量设定上限

--device-read-iops throttled-device

按照每秒读操作的次数设定上限

--device-write-bps throttled-device

按每秒写入块设备的数据量设定上限

--device-write-iops throttled-device

按照每秒写操作的次数设定上限

3.4、查看Docker的资源配置

可以使用:

docker inspect <容器ID或名称>

来查看容器的具体配置情况信息。

 

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

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

相关文章

C语言入门篇(八)

前言   本篇分享的是部分操作符的概念与用法&#xff0c;从经典例题入手&#xff0c;带你快速了解和掌握。   收录专栏&#xff1a;浅谈C语言 操作符详解上 1. 操作符分类2. 算术操作符3. 移位操作符3.1 左移操作符3.2 右移操作符 4. 位操作符5. 赋值操作符6. 单目操作符6.…

Pytest常用的命令行

查看Pytest所有的命令行 Pytest -h 结果&#xff1a; 我们使用pytest时&#xff0c;忘记了会有哪些命令行&#xff0c;或是忘记哪个命令行怎么用&#xff0c;可以进行查看下。 执行参数 命令行参数 (1)--collect-only&#xff0c;打印出具体的执行从目录到用例执行的具体显…

is与==的区别

是比较运算符&#xff0c;用于比较两个值是否相等&#xff0c;结果返回布尔类型True或False is操作符是比较值所在的内存地址是否相同&#xff0c;结果返回布尔类型True或False aList [a,b,c] bList [a,b,c] # True print(aList bList) # False print(aList is bList)# 12…

【计算机网络】应用层协议 -- 安全的HTTPS协议

文章目录 1. 认识HTTPS2. 使用HTTPS加密的必要性3. 常见的加密方式3.1 对称加密3.2 非对称加密3.3 非对称加密对称加密 4. 引入CA证书4.1 CA认证4.2 数据签名4.3 非对称机密对称加密证书认证4.4 常见问题 5. 总结 1. 认识HTTPS HTTPS全称为 Hyper Text Tranfer Protocol over …

Java---第八章(字符串-----String,StringBuilder 和 StringBuffer)

Java---第八章 字符串String字符串的常用方法StringBuilder和StringBuffer常用方法 对比String 和StringBuilder 和 StringBuffer 字符串 String 特性&#xff1a; String 类位于java.lang包中&#xff0c;无需引入&#xff0c;可直接使用String 类是由final修饰的&#xff…

【cpolar内网穿透工具】

文章目录 cpolar内网穿透工具.md概述什么是cpolar&#xff1f;cpolar可以用在哪些场景&#xff1f; 1. 注册cpolar帐号1.1 访问官网站点&#xff1a;[https://www.cpolar.com](https://link.zhihu.com/?targethttps%3A//www.cpolar.com/) 1.2 注册帐号 2. 下载Windows版本cpol…

SpringBoot使用Redis对用户IP进行接口限流

使用接口限流的主要目的在于提高系统的稳定性&#xff0c;防止接口被恶意打击&#xff08;短时间内大量请求&#xff09;。 一、创建限流注解 引入redis依赖 <!--redis--><dependency><groupId>org.springframework.boot</groupId><artifactId&g…

RK3399平台开发系列讲解(内核调试篇)Valgrind 内存调试与性能分析

🚀返回专栏总目录 文章目录 一、为什么要学会Valgrind二、什么是内存泄露三、Valgrind的移植四、Valgrind相关参数沉淀、分享、成长,让自己和他人都能有所收获!😄 📢Valgrind 是一个开源的内存调试和性能分析工具,用于帮助开发者找出程序中的内存错误,如内存泄漏、使…

Ansys 光学解决方案在 A/VMR 中的应用 | 以Apple Vision Pro 为例(1)

说明 苹果公司于近期在 WWDC23 上发布了其第一代空间计算设备 Apple Vision Pro。作为一款跨世代的融合现实产品&#xff0c;Apple Vision Pro 融合了业界尖端的光学技术以实现最佳的用户体验。在这个系列的文章中&#xff0c;我们将以 Apple Vision Pro 中的各项光学应用为引子…

获奖!CFS十二届财经峰会,群硕持续耕耘数字化科技沃土

7月26-27日&#xff0c;CFS2023第十二届财经峰会暨2023可持续商业大会&#xff0c;于北京成功举办。在这场中国经济影响力思想盛会上&#xff0c;群硕获评2023数字化转型推动力奖。 ## 开拓创新&#xff0c;屡获殊荣 CFS财经峰会设立于2012年&#xff0c;是国内众多财经及大众…

【 Python 全栈开发 - 人工智能篇 - 45 】决策树与随机森林

文章目录 一、概念与原理1.1 决策树1.1.1 概念1.1.2 原理特征选择分割方法 1.1.3 优点与缺点1.1.4 Python常用决策树算法 1.2 随机森林1.2.1 概念1.2.2 原理1.2.3 优点与缺点1.2.4 Python常用随机森林算法 1.3 决策树与随机森林的比较1.3.1 相同之处1.3.2 不同之处 二、决策树算…

苍穹外卖Day01项目日志

1.软件开发流程和人员分工是怎样的&#xff1f; 软件开发流程 一个软件是怎么被开发出来的&#xff1f; 需求分析 先得知道软件定位人群、用户群体、有什么功能、要实现什么效果等。 需要得到需求规格说明书、产品原型。 需求规格说明书 其中前后端工程师要关注的就是产品原…

C# 继承,封装,多态等知识点

一&#xff1a;面向对象的三大特征&#xff1a;继承性&#xff0c;封装性&#xff0c;多态性 1&#xff1a;继承性&#xff1a;继承主要描述是类与类之间的关系&#xff0c;通过继承可以在无需重新编写原有的类的情况下&#xff0c;对原有的类的功能进行扩展。 2&#xff1a;封…

【Lua学习笔记】Lua进阶——协程

文章目录 协程协程的定义和调度StatusRunning 协程 协程是一种并发操作&#xff0c;相比于线程&#xff0c;线程在执行时往往是并行的&#xff0c;并且线程在创建销毁执行时极其消耗资源&#xff0c;并且过长的执行时间会造成主进程阻塞。而协程可以以并发时轮值时间片来执行&…

法大大携手盘子女人坊,以数字化唤醒国风摄影新体验

第三方数据显示&#xff0c;目前&#xff0c;我国共有163万家摄影相关企业&#xff0c;有约1900个从事摄影相关业务的品牌&#xff0c;且预计到2025年艺术摄影市场规模将达到7063.18亿元。艺术摄影行业作为在时代进步、科技发展以及人民生活水平提高的推动下逐渐发展起来的行业…

flutter:角标

角标应该非常常见了&#xff0c;以小说app为例&#xff0c;通常会在小说封面的右上角上显示当前未读的章数。 badges 简介 Flutter的badges库是一个用于创建徽章组件的开源库。它提供了简单易用的API&#xff0c;使开发者可以轻松地在Flutter应用程序中添加徽章效果。 官方文…

day42-Live User Filter(实时用户过滤器)

50 天学习 50 个项目 - HTMLCSS and JavaScript day42-Live User Filter&#xff08;实时用户过滤器&#xff09; 效果 index.html <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport…

【深度学习】【三维重建】windows11环境配置tiny-cuda-nn详细教程

【深度学习】【三维重建】windows11环境配置tiny-cuda-nn详细教程 文章目录 【深度学习】【三维重建】windows11环境配置tiny-cuda-nn详细教程前言确定版本对应关系源码编译安装tiny-cuda-nn总结 前言 本人windows11下使用【Instant Neural Surface Reconstruction】算法时需要…

饱和(非饱和)激活函数

1.什么是饱和&#xff08;非饱和&#xff09;激活函数 若h(x)满足&#xff1a;&#xff0c;则h(x)称为饱和激活函数&#xff0c;例如sigmoid和tanh&#xff0c;否则为非饱和激活函数&#xff0c;例如Relu及其变体。 2.非饱和激活函数的优势有两点 能解决所谓的“梯度消失”问…

剑指offer10-II.青蛙跳台阶问题

这道题和上一道斐波那契一模一样&#xff0c;如果你要到达第n个台阶&#xff0c;你有两种方法&#xff0c;第一种是到达n-1级然后跳一下&#xff0c;第二种是到大n-2级然后跳两下&#xff0c;所以到达n级的方法数就是到达n-1级的方法数加上到达n-2级的方法数。其实就是和斐波那…