热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

linux启动docker数量限制,一看必会系列:docker练习6docker资源限制cpumemory

前面练完知道如何使用docker那么如保更好的控制也需要进行练习Docker基于Linux内核提供的cgroups功能,可以限制容器在运行时使用到的资源,

前面练完知道如何使用docker 那么如保更好的控制也需要进行练习

Docker 基于 Linux 内核提供的 cgroups 功能,可以限制容器在运行时使用到的资源,比如内存、CPU、块 I/O、网络等。

首先查看 cpu的数量

root@docker:~# lscpu

Architecture:        x86_64

CPU op-mode(s):      32-bit, 64-bit

Byte Order:          Little Endian

CPU(s):              4   ---4个

On-line CPU(s) list: 0-3   ----cpu序号 0,1,2,3

先来看一下容器使用的内存CPU及相关资源

root@docker:~# docker stats dd4d7133240f

CONTAINER ID        NAME                CPU %               MEM USAGE / LIMIT    MEM %               NET I/O             BLOCK I/O           PIDS

dd4d7133240f        quizzical_curran    0.00%               5.379MiB / 7.79GiB   0.07%               9.83MB / 93.8kB     0B / 56.8MB         1

^C

root@docker:~#

从以上看 发现 是没有限制可以共用host的所有资源,

这样会影响资源有分配和容器的稳定性。系统可能kill容器

一,限制内存

命令

docker run -it -m  内存大小

root@docker:~# docker run -it -m 500M reg.ccie.wang/test/ubuntu:sshd001 /bin/bash

WARNING: Your kernel does not support swap limit capabilities or the cgroup is not mounted. Memory limited without swap.

运行下面的命令后可以看出   LIMIT  500MiB成功

CONTAINER ID        NAME                CPU %               MEM USAGE / LIMIT   MEM %               NET I/O             BLOCK I/O           PIDS

290255fe3161        inspiring_brown     0.00%               1.918MiB / 500MiB   0.38%               2.89kB / 0B         1.61MB / 0B         1

进行内存压力测试

容器内安装

安装stress

apt-get update

apt install -y stress

运行命令  使用1个IO进程,10个内存分配进程,每次分配100M,分配后不释放,测试100S

stress -i 1 -m 10 –vm-bytes 100M –vm-hang 100  –timeout 100s

命令运行前  内存使用 1.82MiB / 500MiB

CONTAINER ID        NAME                CPU %               MEM USAGE / LIMIT   MEM %               NET I/O             BLOCK I/O           PIDS

c3db20ece882        festive_blackburn   0.00%               1.82MiB / 500MiB    0.36%               2.51MB / 33.7kB     1.88MB / 2.42GB     1

命令使用后  499.9MiB / 500MiB

CONTAINER ID        NAME                CPU %               MEM USAGE / LIMIT   MEM %               NET I/O             BLOCK I/O           PIDS

c3db20ece882        festive_blackburn   12.20%              499.9MiB / 500MiB   99.97%              2.51MB / 33.7kB     393kB / 1.22GB      13

测试成功

如果进入容器会发现,容器内内存显示仍为主机的内存大小,这个无所谓

二,CPU 限制

进行cpu压力测试 计算圆周率

apt-get update

apt install bc

echo "scale=50000; 4*a(1)" | bc -l -q

以下方式是不指定CPU 所以看不出权限的作用

第一个 container

docker run -it -c 1024 reg.ccie.wang/test/ubuntu:sshd001 /bin/bash

第二个 container

docker run -it -c 512 reg.ccie.wang/test/ubuntu:sshd001 /bin/bash

第3个 container

docker run -it -c 512 reg.ccie.wang/test/ubuntu:sshd001 /bin/bash

CONTAINER ID        NAME                CPU %               MEM USAGE / LIMIT    MEM %               NET I/O             BLOCK I/O           PIDS

5b9c706e650d        lucid_babbage       99.65%              4.742MiB / 7.79GiB   0.06%               2.57MB / 33.3kB     1.09MB / 21.9MB     2

2个容器对应 两个CPU 100%  三个对应三个

top – 14:11:25 up 9 days, 22:39,  3 users,  load average: 1.28, 0.41, 0.15

Tasks: 174 total,   3 running, 171 sleeping,   0 stopped,   0 zombie

%Cpu0  : 99.7 us,  0.3 sy,  0.0 ni,  0.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st

%Cpu1  :  1.0 us,  0.7 sy,  0.0 ni, 95.8 id,  0.0 wa,  0.0 hi,  2.6 si,  0.0 st

%Cpu2  :  0.7 us,  1.0 sy,  0.0 ni, 98.0 id,  0.0 wa,  0.0 hi,  0.3 si,  0.0 st

%Cpu3  :100.0 us,  0.0 sy,  0.0 ni,  0.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st

MiB Mem :   7976.8 total,   1231.0 free,   1707.2 used,   5038.7 buff/cache

MiB Swap:   2048.0 total,   2048.0 free,      0.0 used.   5977.2 avail Mem

-c,–cpu-shares=0    CPU 共享权值(相对权重)

–cpuset-cpus=""    允许使用的 CPU 集,值可以为 0-3,0,1

测试2 限制 容器只能使用CPU 1 并且三个容器 按权重分配使用率

1配置 :docker run -it –cpuset-cpus 1 -c 1024 reg.ccie.wang/test/ubuntu:sshd001 /bin/bash

2配置 :docker run -it –cpuset-cpus 1 -c 512 reg.ccie.wang/test/ubuntu:sshd001 /bin/bash

3配置 :docker run -it –cpuset-cpus 1 -c 512 reg.ccie.wang/test/ubuntu:sshd001 /bin/bash

container 1  权重1024  理论上最大占50%

container 2  权重512   理论上最大占50% 的一半

container 3  权重512   理论上最大占50% 的一半

计算方式理解决 1+2+3 应等于100

1=2*2

1=3*2

在host上查看top  cpu跑满

%Cpu1  : 99.7 us,  0.3 sy,  0.0 ni,  0.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st

查看运行中的三个 container

docker stats cf3388f91e18 2e7e91f901a2 48b30cb94410

结果如下,证明限制是有效的

CONTAINER ID        NAME                 CPU %               MEM USAGE / LIMIT    MEM %               NET I/O             BLOCK I/O           PIDS

cf3388f91e18        trusting_bassi       25.02%              3.25MiB / 7.79GiB    0.04%               2.57MB / 28.1kB     0B / 21.8MB         2

2e7e91f901a2        suspicious_bardeen   25.47%              3.227MiB / 7.79GiB   0.04%               2.59MB / 44kB       0B / 21.8MB         2

48b30cb94410        distracted_lamport   49.88%              3.027MiB / 7.79GiB   0.04%               2.6MB / 40.2kB      0B / 21.8MB         2

^C

警告解决

1. vim /etc/default/grub   增加配置

#docker add support cgroup

GRUB_CMDLINE_LINUX="cgroup_enable=memory swapaccount=1"

2.  $ sudo update-grub  更新grub

3.  重启服务生效

https://docs.docker.com/v17.09/engine/installation/linux/linux-postinstall/#your-kernel-does-not-support-cgroup-swap-limit-capabilities

root@docker:~# update-grub

Generating grub configuration file …

Found linux image: /boot/vmlinuz-4.18.0-16-generic

Found initrd image: /boot/initrd.img-4.18.0-16-generic

Found linux image: /boot/vmlinuz-4.18.0-15-generic

Found initrd image: /boot/initrd.img-4.18.0-15-generic

Found linux image: /boot/vmlinuz-4.18.0-10-generic

Found initrd image: /boot/initrd.img-4.18.0-10-generic

Found memtest86+ image: /boot/memtest86+.elf

Found memtest86+ image: /boot/memtest86+.bin

done

root@docker:~#

————-报错

WARNING: Your kernel does not support swap limit capabilities or the cgroup is not mounted. Memory limited without swap.

警告解决

1. vim /etc/default/grub   增加配置

#docker add support cgroup

GRUB_CMDLINE_LINUX="cgroup_enable=memory swapaccount=1"

2.  $ sudo update-grub  更新grub

3.  重启服务生效

https://docs.docker.com/v17.09/engine/installation/linux/linux-postinstall/#your-kernel-does-not-support-cgroup-swap-limit-capabilities

Docker 提供的内存限制功能有以下几点:

容器能使用的内存和交换分区大小。

容器的核心内存大小。

容器虚拟内存的交换行为。

容器内存的软性限制。

是否杀死占用过多内存的容器。

容器被杀死的优先级

一般情况下,达到内存限制的容器过段时间后就会被系统杀死

内存限制相关的参数

执行docker run命令时能使用的和内存限制相关的所有选项如下。

选项    描述

-m,–memory    内存限制,格式是数字加单位,单位可以为 b,k,m,g。最小为 4M

–memory-swap    内存+交换分区大小总限制。格式同上。必须必-m设置的大

–memory-reservation    内存的软性限制。格式同上

–oom-kill-disable    是否阻止 OOM killer 杀死容器,默认没设置

–oom-score-adj    容器被 OOM killer 杀死的优先级,范围是[-1000, 1000],默认为 0

–memory-swappiness    用于设置容器的虚拟内存控制行为。值为 0~100 之间的整数

–kernel-memory    核心内存限制。格式同上,最小为 4M

CPU 限制

概述

Docker 的资源限制和隔离完全基于 Linux cgroups。对 CPU 资源的限制方式也和 cgroups 相同。Docker 提供的 CPU 资源限制选项可以在多核系统上限制容器能利用哪些 vCPU。而对容器最多能使用的 CPU 时间有两种限制方式:一是有多个 CPU 密集型的容器竞争 CPU 时,设置各个容器能使用的 CPU 时间相对比例。二是以绝对的方式设置容器在每个调度周期内最多能使用的 CPU 时间。

CPU 限制相关参数

docker run命令和 CPU 限制相关的所有选项如下:

选项    描述

–cpuset-cpus=""    允许使用的 CPU 集,值可以为 0-3,0,1

-c,–cpu-shares=0    CPU 共享权值(相对权重)

cpu-period=0    限制 CPU CFS 的周期,范围从 100ms~1s,即[1000, 1000000]

–cpu-quota=0    限制 CPU CFS 配额,必须不小于1ms,即 >= 1000

–cpuset-mems=""    允许在上执行的内存节点(MEMs),只对 NUMA 系统有效

其中–cpuset-cpus用于设置容器可以使用的 vCPU 核。-c,–cpu-shares用于设置多个容器竞争 CPU 时,各个容器相对能分配到的 CPU 时间比例。–cpu-period和–cpu-quata用于绝对设置容器能使用 CPU 时间。

–cpuset-mems暂用不上,这里不谈。

———————

作者:流沙的刺客

来源:CSDN

原文:https://blog.csdn.net/candcplusplus/article/details/53728507

版权声明:本文为博主原创文章,转载请附上博文链接!



推荐阅读
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
  • 如何自行分析定位SAP BSP错误
    The“BSPtag”Imentionedintheblogtitlemeansforexamplethetagchtmlb:configCelleratorbelowwhichi ... [详细]
  • 在Docker中,将主机目录挂载到容器中作为volume使用时,常常会遇到文件权限问题。这是因为容器内外的UID不同所导致的。本文介绍了解决这个问题的方法,包括使用gosu和suexec工具以及在Dockerfile中配置volume的权限。通过这些方法,可以避免在使用Docker时出现无写权限的情况。 ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文介绍了如何找到并终止在8080端口上运行的进程的方法,通过使用终端命令lsof -i :8080可以获取在该端口上运行的所有进程的输出,并使用kill命令终止指定进程的运行。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • http:my.oschina.netleejun2005blog136820刚看到群里又有同学在说HTTP协议下的Get请求参数长度是有大小限制的,最大不能超过XX ... [详细]
  • 标题: ... [详细]
  • Java中包装类的设计原因以及操作方法
    本文主要介绍了Java中设计包装类的原因以及操作方法。在Java中,除了对象类型,还有八大基本类型,为了将基本类型转换成对象,Java引入了包装类。文章通过介绍包装类的定义和实现,解答了为什么需要包装类的问题,并提供了简单易用的操作方法。通过本文的学习,读者可以更好地理解和应用Java中的包装类。 ... [详细]
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
  • Servlet多用户登录时HttpSession会话信息覆盖问题的解决方案
    本文讨论了在Servlet多用户登录时可能出现的HttpSession会话信息覆盖问题,并提供了解决方案。通过分析JSESSIONID的作用机制和编码方式,我们可以得出每个HttpSession对象都是通过客户端发送的唯一JSESSIONID来识别的,因此无需担心会话信息被覆盖的问题。需要注意的是,本文讨论的是多个客户端级别上的多用户登录,而非同一个浏览器级别上的多用户登录。 ... [详细]
author-avatar
_MIN_Y
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有