当前位置: 首页 > news >正文

【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.lryc.cn/news/588493.html

相关文章:

  • Linux操作系统之信号:信号的产生
  • 深入学习前端 Proxy 和 Reflect:现代 JavaScript 元编程核心
  • Modbus 开发工具实战:ModScan32 与 Wireshark 抓包分析(二)
  • Swift 解 LeetCode 326:两种方法判断是否是 3 的幂,含循环与数学技巧
  • [硬件电路-21]:模拟信号处理运算与数字信号处理运算的详细比较
  • 无人机迫降模式模块运行方式概述!
  • ICMP隧道工具完全指南:原理、实战与防御策略
  • Datawhale AI夏令营大模型 task2.1
  • 【科研绘图系列】R语言绘制世界地图
  • 硬盘爆满不够用?这个免费神器帮你找回50GB硬盘空间
  • 【React Natve】NetworkError 和 TouchableOpacity 组件
  • 网络编程(TCP连接)
  • 代理模式详解:代理、策略与模板方法模式
  • 暑期自学嵌入式——Day02(C语言阶段)
  • PyTorch张量(Tensor)创建的方式汇总详解和代码示例
  • 如何降低AIGC的查重率?精选六个AIGC降重让论文更出色
  • 《每日AI-人工智能-编程日报》--2025年7月14日
  • Android Studio C++/JNI/Kotlin 示例 三
  • git项目,有idea文件夹,怎么去掉
  • Mybatis(黑马)
  • 网络传输过程
  • 理解Linux文件系统:从物理存储到统一接口
  • 小波变换 | 离散小波变换
  • 学习笔记——农作物遥感识别与大范围农作物类别制图的若干关键问题
  • rsyslog简单应用
  • Linux中的系统日志(Rsyslog)
  • 算法训练营day17 654.最大二叉树、617.合并二叉树、700.二叉搜索树中的搜索、98.验证二叉搜索树
  • Linux —— A / 基础指令
  • 深入解析Hadoop YARN架构设计:从原理到实践
  • 019 进程控制 —— 进程程序替换