【DOCKER】-6 docker的资源限制与监控

文章目录

  • 1、docker的资源限制
    • 1.1 容器资源限制的介绍
    • 1.2 OOM
    • 1.3 容器的内存限制
      • 1.3.1 内存限制的相关选项
    • 1.4 容器的CPU限制介绍
  • 2、docker的监控插件
    • 2.1 cadvisor
    • 2.2 portainer

1、docker的资源限制

1.1 容器资源限制的介绍

默认情况下,容器没有资源的使用限制,可以使用主机内核调度程序允许的尽可能多的资源

Docker 提供了控制容器使用资源的方法,可以限制容器使用多少内存或 CPU等, 在docker run 命令的运行时配置标志实现资源限制功能。

其中许多功能都要求宿主机的内核支持,要检查是否支持这些功能,可以使用docker info 命令 ,如果内核中的某项特性可能会在输出结尾处看到警告, 如下所示:

WARNING: No swap limit support

1.2 OOM

对于 Linux 主机,如果没有足够的内存来执行其他重要的系统任务,将会抛出OOM (Out of Memory Exception,内存溢出、内存泄漏、内存异常 ),随后系统会开始杀死进程以释放内存, 凡是运行在宿主机的进程都有可能被 kill ,包括 Dockerd和其它的应用程序, 如果重要的系统进程被 Kill,会导致和该进程相关的服务全部宕机。通常越消耗内存比较大的应用越容易被kill,比如: MySQL数据库,Java程序等

产生 OOM 异常时, Dockerd尝试通过调整 Docker 守护程序上的 OOM 优先级来减轻这些风险,以便它比系统上的其他进程更不可能被杀死但是容器 的 OOM 优先级未调整, 这使得单个容器被杀死的可能性比 Docker守护程序或其他系统进程被杀死的可能性更大,不推荐通过在守护程序或容器上手动设置-- oom -score-adj为极端负数,或通过在容器上设置 – oom-kill-disable来绕过这些安全措施

OOM优先级机制:

linux会为每个进程算一个分数,最终将分数最高的kill

/proc/PID/oom_score_adj 
#范围为 -1000 到 1000,值越高容易被宿主机 kill掉,如果将该值设置为 -1000 ,则进程永远不会被宿主机 kernel kill /proc/PID/oom_adj 
#范围为 -17 到+15 ,取值越高越容易被干掉,如果是 -17 , 则表示不能被 kill ,该设置参数的存在是为了和旧版本的 Linux 内核兼容。/proc/PID/oom_score 
#这个值是系统综合进程的内存消耗量、 CPU 时间 (utime + 、存活时间 (uptime - start time) 和 oom_adj 计算出的进程得分 ,消耗内存越多得分越高,容易被宿主机 kernel 强制杀死

查看docker进程相关的oom的值

[root@localhost docker-compose]#cat /proc/24472/oom_score_adj 
-500
[root@localhost docker-compose]#cat /proc/24472/oom_adj 
-8
[root@localhost docker-compose]#cat /proc/24472/oom_score
0
[root@localhost docker-compose]#

1.3 容器的内存限制

Docker 可以强制执行硬性内存限制,即只允许容器使用给定的内存大小。

Docker 也可以执行非硬性内存限制,即容器可以使用尽可能多的内存,除非内核检测到主机上的内存不够用了

1.3.1 内存限制的相关选项

以下设置大部分的选项取正整数,跟着一个后缀 b , k , m , g ,,表示字节,千字节,兆字节或千兆字节

选项描述
-m , – --memory=容器可以使用的最大物理内存量,硬限制,此选项最小允许值为 4m (4 MB),此项较常用
–memory-swap允许此容器交换到磁盘的内存量,必须先用-m 对内存限制才可以使用,详 细说明如下
–memory-swappiness设置容器使用交换分区的倾向性,值越高表示越倾向于使用swap分 区,范围为0-100,0为能不用就不用,100为能用就用
–memory-reservation允许指定小于 --memory 的软限制 ,当 Docker 检测到主机上的争用 或内存不足时会激活该限制,如果使-- memory-reservation,则必须 将其设置为低于 --memory 才能使其优先生效。 因为它是软限制,所 以不能保证容器不超过限制
–kernel-memory容器可以使用的最大内核内存量,最小为 4m,由于内核内存与用户空 间内存隔离,因此无法与用户空间内存直接交换,因此内核内存不足的 容器可能会阻塞宿主机资源,这会对主机和其他容器或者其他服务进程 产生影响,因此不建议设置内核内存大小
–oom-kill-disable默认情况下,如果发生内存不足(OOM)错误,则内核将终止容器中 的进程。要更改此行为,请使用该 --oom-kill-disable 选项。仅在设 置了该 -m/–memory 选项的容器上禁用OOM。如果 -m 未设置该标志, 则主机可能会用完内存,内核可能需要终止主机系统的进程以释放内存

例子:启动容器不会被优化

docker run -e MYSQL_ROOT_PASSWORD=123456 -it --rm -m 1g --oom-kill-disable mysql:5.7.29

例子: 限制容器使用的最大内存 默认启动容器是不会 限制的

[root@localhost ~]#docker run -itd --name test1 -m 512m centos:7 /bin/bash
#限制容器最大内存为  512m[root@localhost ~]#docker stats --no-stream  test1
# 查看容器的最大值
CONTAINER ID   NAME      CPU %     MEM USAGE / LIMIT   MEM %     NET I/O     BLOCK I/O    PIDS
b6472ee1f67e   test8     0.00%     1.617MiB / 512MiB   0.32%     648B / 0B   9.3MB / 0B   1

例子: 限制使用swap 的大小

–memory-swap

[root@localhost ~]#  docker run -itd --name test10 -m 512m --memory-swap=1g centos:7强调一下,--memory-swap 是必须要与 --memory 一起使用的。正常情况下,--memory-swap 的值包含容器可用内存和可用 swap。
所以 -m 512m --memory-swap=1g 的含义为:容器可以使用 512M 的物理内存,
并且可以使用 700M(1G - 300)的 swap。如果 --memory-swap 设置为 0 或者 不设置,则容器可以使用的 swap 大小为 -m 值的两倍。
如果 --memory-swap 的值和 -m 值相同,则容器不能使用 swap。
如果 --memory-swap 值为 -1,它表示容器程序使用的内存受限,
而可以使用的 swap 空间使用不受限制(宿主机有多少 swap 容器就可以使用多少)

1.4 容器的CPU限制介绍

一个宿主机,有几十个核心的CPU,但是宿主机上可以同时运行成百上千个不同的进程用以处理不同的任务,多进程共用一个 CPU 的核心为可压缩资源,即一个核心的 CPU 可以通过调度而运行多个进程,但是同一个单位时间内只能有一个进程在 CPU 上运行,那么这么多的进程怎么在 CPU 上执行和调度的呢?

Linux kernel 进程的调度基于CFS(Completely Fair Scheduler),完全公平调度

服务器资源密集型

  • CPU 密集型的场景: 优先级越低越好,计算密集型任务的特点是要进行大量的计算,消耗CPU 资源,比如计算圆周率、数据处理、对视频进行高清解码等等,全靠CPU 的运算能力。
  • IO 密集型的场景: 优先级值高点,涉及到网络、磁盘IO 的任务都是IO 密集型任务,这类任务的特点是 CPU 消耗很少,任务的大部分时间都在等待 IO 操作完成(因为 IO 的速度远远低于 CPU 和内存的速度),比如 Web 应用,高并发,数据量大的动态网站来说,数据库应该为IO 密集型

CFS原理

cfs定义了进程调度的新模型,它给cfs_rq(cfs的run queue)中的每一个进程安排一个虚拟时钟vruntime。如果一个进程得以执行,随着时间的增长,其vruntime将不断增大。没有得到执行的进程vruntime不变, 而调度器总是选择vruntime跑得最慢的那个进程来执行。这就是所谓的“完全公平”。为了区别不同优先级的进程,优先级高的进程vruntime增长得慢,以至于它可能得到更多的运行机会。CFS的意义在于, 在一个混杂着大量计算型进程和IO交互进程的系统中,CFS调度器相对其它调度器在对待IO交互进程要更加友善和公平。

[root@localhost ~]#cat /sys/block/sda/queue/scheduler 
noop [deadline] cfq 
选项描述
–cpus=指定一个容器可以使用多少个可用的CPU核心资源。例如,如果主机有两个 CPU,如果设置了 --cpus=“1.5” ,则可以保证容器最多使用1.5个的CPU(如果 是4核CPU,那么还可以是4核心上每核用一点,但是总计是1.5核心的CPU)。这 相当于设置 --cpu-period=“100000” 和 --cpu-quota=“150000” 。此设置可在 Docker 1.13及更高版本中可用,目的是替代–cpu-period和–cpu-quota两个参 数,从而使配置更简单,但是最大不能超出宿主机的CPU总核心数(在操作系统 看到的CPU超线程后的数值),此项较常用
–cpu-period=过时选项,指定CPU CFS调度程序周期,必须与 --cpu-quota 一起使用 。默认为 100微秒。大多数用户不会更改默认设置。如果使用Docker 1.13或更高版本, 请改用 --cpus
–cpu-quota=过时选项,在容器上添加 CPU CFS 配额,计算方式为 cpu-quota / cpu-period的 结果值,docker1.13 及以上版本通常使用–cpus 设置此值
–cpuset-cpus用于指定容器运行的 CPU 编号,也就是所谓的CPU绑定。如果一个或多个 CPU,则容器可以使用逗号分隔的列表或用连字符分隔的CPU范围。第一个 CPU的编号为0。有效值可能是 0-3 (使用第一,第二,第三和第四CPU)或 1,3 (使用第二和第四CPU)
–cpu-shares用于设置 cfs 中调度的相对最大比例权重,cpu-share 的值越高的容器,将会分 得更多的时间片(宿主机多核 CPU 总数为 100%,假如容器 A 为1024,容器 B 为 2048,那么容器 B 将最大是容器 A 的可用 CPU 的两倍 ),默认的时间片 1024,最大 262144。这是一个软限制。

例子:设置CPU使用率上限

使用 --cpu-period 即可设置调度周期,使用 --cpu-quota 即可设置在每个周期内容器能使用的CPU时间。两者可以配合使用。
CFS 周期的有效范围是 1ms~1s,对应的 --cpu-period 的数值范围是 1000~1000000。
而容器的 CPU 配额必须不小于 1ms,即 --cpu-quota 的值必须 >= 1000。

[root@localhost ~]#docker run -itd --name test5 centos:7 /bin/bash[root@localhost ~]#docker  ps  -a
CONTAINER ID   IMAGE          COMMAND                   CREATED          STATUS                      PORTS                 NAMES
5f5ab75d9f1a   centos:7       "/bin/bash"               8 seconds ago    Up 7 seconds                                      test5[root@localhost ~]#cd /sys/fs/cgroup/cpu/docker/5f5ab75d9f1add29fd4441c88abc70f84cbc083d1fd5e77b99c94e5c8440d213/
[root@localhost 5f5ab75d9f1add29fd4441c88abc70f84cbc083d1fd5e77b99c94e5c8440d213]#
[root@localhost 5f5ab75d9f1add29fd4441c88abc70f84cbc083d1fd5e77b99c94e5c8440d213]#cat cpu.cfs_quota_us
-1
[root@localhost 5f5ab75d9f1add29fd4441c88abc70f84cbc083d1fd5e77b99c94e5c8440d213]#cat cpu.cfs_period_us 
100000cpu.cfs_period_us: 表示 CFS 调度周期的长度,以微秒为单位。
在每个周期内,容器可以使用指定比例的 CPU 时间。默认情况下,cpu.cfs_period_us 的值是 100000(即 100 毫秒)。cpu.cfs_quota_us: 表示容器在 cpu.cfs_period_us 周期内能够使用的 CPU 时间量,同样以微秒为单位。
它定义了一个相对于周期的配额。如果设置为 -1,表示没有限制。如果设置为正值,表示在周期内的配额。
例如,如果 cpu.cfs_quota_us 设置为 50000,那么容器在一个周期内最多可以使用 50 毫秒的 CPU 时间。在 Linux 的 CFS 调度器中,cpu.cfs_period_us 参数定义了一个周期,
而这个周期实际上是用来调度任务(包括容器)的基本时间单位。
然而,具体的一次调度的时间是由调度器决定的,并且这个时间在一般情况下是动态变化的。

进入容器模拟测试

[root@localhost ~]#docker exec -it test5  bash[root@5f5ab75d9f1a /]# vi cpu.sh
#!/bin/bash
i=0
while true
do
let i++
done
[root@5f5ab75d9f1a /]# ./cpu.sh  &

加入选项 --cpu-quota 50000

docker run -itd --name test6 --cpu-quota 50000 centos:7 /bin/bash

或者直接修改 配置文件

cd /sys/fs/cgroup/cpu/docker/3ed82355f81151c4568aaa6e7bc60ba6984201c119125360924bf7dfd6eaa42b/
echo 50000 > cpu.cfs_quota_us
docker exec -it 3ed82355f811 /bin/bash
./cpu.sh

例子: 设置容器 绑定cpu

docker run -itd --name test7 --cpuset-cpus 1,3 centos:7 /bin/bash

2、docker的监控插件

2.1 cadvisor

docker自带的监控组件,可以把cadvisor下载下来,以一个UI界面,输出出来,方便资源管理

在监控的知识体系中cadvisor也称为指标暴露器

docker run -d --name wxj -p 8080:8080 -v /:/rootfs:ro -v /var/run/:/var/run/:rw -v /sys/:/sys/:ro -v /var/lib/docker/:/var/lib/docker/:ro -v /dev/disk/:/dev/disk/:ro google/cadvisor:v0.32.0

在这里插入图片描述

在这里插入图片描述

2.2 portainer

docker run -p 9000:9000 -p 8000:8000 --name portainer \
--restart=always \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /mydata/portainer/data:/data \
-d portainer/portainer

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

gcc 源码分析--gimple 关键数据结构

gimple 操作码,支持这些:DEFGSCODE(GIMPLE_symbol, printable name, GSS_symbol). */ DEFGSCODE(GIMPLE_ERROR_MARK, "gimple_error_mark", GSS_BASE) DEFGSCODE(GIMPLE_COND, "gimple_cond", GSS_WITH_OPS) DEFGSCODE(GIMPLE_DEBU…

TDengine GREATEST 和 LEAST 函数用户手册

TDengine GREATEST 和 LEAST 函数用户手册 1. 需求背景 1.1 问题描述 在实际生产过程中,客户经常需要计算三相电流、电压的最大值和最小值。传统的实现方式需要使用复杂的 CASE WHEN 语句,例如: -- 传统方式:计算三相电流最大…

Redis 与数据库不一致问题及解决方案

一、不一致的原因分析 1. 缓存更新策略不当 先更新数据库后删除缓存:删除缓存失败会导致不一致 先删除缓存后更新数据库:并发请求可能导致不一致 缓存穿透:大量请求直接打到数据库,绕过缓存 2. 并发操作问题 读写并发:读请求获取旧缓存时,写请求更新了数据库但未更新缓存…

iOS 加固工具使用经验与 App 安全交付流程的实战分享

在实际开发中,iOS App不仅要安全,还要能被稳定、快速、无误地交付。这在外包、B端项目、渠道分发、企业自用系统等场景中尤为常见。 然而,许多开发者在引入加固工具后会遇到以下困扰: 混淆后App运行异常、不稳定;资源路…

Windows 下 Visual Studio 开发 C++ 项目的部署流程

在Windows环境中使用Visual Studio(以下简称VS)开发C项目时,“部署”是确保程序能在目标设备上正常运行的关键环节。部署的核心目标是:将编译生成的可执行文件(.exe)、依赖的动态链接库(.dll&am…

yolo8+声纹识别(实时字幕)

现在已经完成了人脸识别跟踪 ✅,接下来要: ✅ 加入「声纹识别(说话人识别)」功能,识别谁在讲话,并在视频中“这个人”的名字旁边加上「正在讲话」。 这属于多模态识别(视觉 音频)&a…

DH(Denavit–Hartenberg)矩阵

DH 矩阵(Denavit-Hartenberg 矩阵)是 1955 年由 Denavit 和 Hartenberg 提出的一种机器人运动学建模方法,用于描述机器人连杆和关节之间的关系。该方法通过在机器人每个连杆上建立坐标系,并用 44 的齐次变换矩阵(DH 矩…

Vim的magic模式

在 Vim 中,magic 模式用于控制正则表达式中特殊字符的解析方式。它决定了哪些字符需要转义才能发挥特殊作用,从而影响搜索和替换命令的写法。以下是详细介绍: 一、三种 magic 模式 Vim 提供三种 magic 模式,通过在正则表达式前添加…

Git 使用技巧与原理(一)—— 基础操作

1、起步 1.1 版本控制 版本控制是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统。 版本控制系统(VCS,Version Control System)通常可以分为三类: 本地版本控制系统:大多都是采用某…

软件测试之自动化测试

目录 1.什么是自动化测试 2.web⾃动化测试 2.1驱动 WebDriverManager 3. Selenium 3.1selenium驱动浏览器的⼯作原理 4.常用函数 4.1元素的定位 4.1.1cssSelector选择器 4.2.2xpath 4.2操作测试对象 4.3窗⼝ 4.4等待 4.5浏览器导航 4.6弹窗 4.7文件上传 4.8设置…

sqlserver迁移日志文件和数据文件

sqlserver安装后没有指定日志存储路径或者还原库指定的日志存储位置不理想想要更改,都可以按照这种方式来更换;1.前提准备:数据库的备份bak文件2.查看自己当前数据库的日志文件和数据文件存储路径是否理想选中当前数据库,右键属性…

MFC UI表格制作从专家到入门

文章目录CListCtrl常见问题增强版CGridCtrl(第三方)第三方库ReoGridCListCtrl 默认情况下,CListCtrl不支持直接编辑单元格,需通过消息处理实现。 1.添加控件到资源视图 在对话框资源编辑器中拖入List Control控件,设…

数字后端APR innovus sroute到底是如何选取宽度来铺power rail的?

吾爱IC社区新一期IC训练营将于7月初开班(07.06号晚上第一次直播课)!社区所有IC后端训练营课程均为直播课!全网唯一一家敢开后端直播课的(口碑不好招生一定存在困难,自然就无法开直播课)&#xf…

LVS集群技术

LVS(Linux Virtual Server)是一种基于Linux内核的高性能、高可用性服务器集群技术,它通过负载均衡将客户端请求分发到多台后端真实服务器,实现 scalability 和 fault tolerance。LVS工作在传输层(OSI Layer 4&#xff…

git项目,有idea文件夹,怎么去掉

要从Git项目中排除.idea文件夹(IntelliJ IDEA的配置文件目录),可以通过以下步骤操作: 1. 添加.gitignore规则 在项目根目录创建或编辑.gitignore文件,添加以下内容: .idea/2. 从Git缓存中删除已跟踪的.idea…

springboot+swagger2文档从swagger-bootstrap-ui更换为knife4j及文档接口参数不显示问题

背景 已有springboot项目,且使用的是swagger2+swagger-bootstrap-ui的版本 1.pom依赖如下 <!-- Swagger接口管理工具 --><dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><version>2.9…

mysql数据库表只能查询,对于插入、更新、删除操作一直卡住,直到报错Lost connection to MySQL server during query

诊断步骤1. 查看阻塞进程SELECT * FROM performance_schema.metadata_locks WHERE LOCK_STATUS PENDING;SELECT * FROM sys.schema_table_lock_waits;2. 查看当前活动事务SELECT * FROM information_schema.INNODB_TRX;3. 查看进程列表SHOW PROCESSLIST;通过SELECT * FROM in…

Redis BigKey 深度解析:从原理到实战解决方案

引言&#xff1a;什么是 BigKey&#xff1f;在 Redis 的使用场景中&#xff0c;BigKey&#xff08;大键&#xff09;是指那些数据量异常庞大的键值&#xff0c;通常表现为&#xff1a;String 类型&#xff1a;值大小超过 10KBHash/Set 等&#xff1a;元素数量超过 5000List/ZSe…

Qt 实现新手引导

Qt实现新手引导 对于一个新安装的软件或者一个新的功能&#xff0c;提供一个新手引导步骤&#xff0c;能够让用户快速熟悉。这是最终效果&#xff0c;每一个按钮都会有一个简单引导&#xff0c;通过点击上一步、下一步来切换不同的指导。当前引导的功能&#xff0c;会有一个高光…

Maven+Spring

一、Maven 相关- 本地仓库设置&#xff1a;- 在 IDE&#xff08;如 IntelliJ IDEA&#xff09;中可以设置 Maven 的本地仓库路径&#xff0c;本地仓库用于存储从远程仓库下载的依赖库&#xff0c;方便项目重复使用。- 仓库关系&#xff1a;- 项目&#xff1a;开发中的项目&…