首页 > 其他分享 >5、docker系统资源限制

5、docker系统资源限制

时间:2024-04-09 22:47:52浏览次数:22  
标签:stress 限制 -- 内存 memory docker cpu 系统资源

docker系统资源限制
1、内存限制:
默认docker内存限制可以使用-m参数进行限制,但如果仅-m参数,不添加其他,那么内存限制不会限制死,比如你-m 256m内存,那么容器里程序可以跑到256m*2=512m后才会被oom给杀死,原因是源码里memory.memsw.limit_in_bytes 值是被设置成我们指定的内存参数的两倍。
目的:限制每一个内存线程分配多大内存。
注意:限制的时候不能超过物理内存,可以运行,但是会占用所有物理内存。
格式:
docker run -itd -m 200M --memory-swap=300M centos /bin/bash
参数解释:memory可以使用200 swap可以使用100
 
例子:
docker run -itd -m 200M --memory-swap=300M progrium/stress --vm 1 --vm-bytes 280M
progrium/stress:测试镜像,启动一个内存工作线程给280m内存

目前Docker支持内存资源限制选项:
(1)-m, --memory=""
内存限制(格式:) <number>[<unit>]。Number是正整数。单位可以是一个b,k,m,或g。最低为4M。
(2)--memory-swap=""
总内存限制(内存+交换,格式:) <number>[<unit>]。Number是正整数。单位可以是一个b,k,m,或g。
# docker run -it --rm -m 100M --memory-swap -1 ubuntu-stress:latest /bin/bash
指定限制内​​存大小并且设置memory-swap值为-1,表示容器程序使用内存受限,而交换空间使用不受限制(宿主交换支持使用多少则容器即可使用多少。如果--memory-swap设置小于--memory则设置不生效,使用默认设置)。

使用docker stats查看当前容器内存资源使用:
docker stats 4b61f98e787d
通过top实时监控stress进程内存占用:
# pgrep stress  --stress进程的pid
# top -p stress_pid
也可以通过如下命令获取stress进程的交换占用:
for file in /proc/*/status ; do awk '/VmSwap|Name/{printf $2 " " $3}END{ print ""}' $file; done | sort -k 2 -n -r | grep stress
stress

# docker run -it --rm -m 100M ubuntu-stress:latest /bin/bash
按照官方文档的理解,如果指定-m内存限制时不添加--memory-swap选项,则表示容器中程序可以使用100M内存和100M交换内存。默认情况下,--memory-swap会被设置成存的2倍。
我们只设置内存限制(300M),这意味着容器中的进程可以使用300M内存和300M交换内存,默认情况下,总虚拟内存大小--memory-swap将设置为内存的两倍,在这种情况下,内存+交换将是2 * 300M,因此进程也可以使用300M交换内存
如果按照以上方式运行容器提示如下信息:
WARNING: Your kernel does not support swap limit capabilities, memory limited without swap.

(3)--memory-swappiness=""
调整容器的内存swappiness行为。接受0到100之间的整数。0表示尽量不适用swap,100表示尽可能的使用swap;
swappiness可以认为是宿主/proc/sys/vm/swappiness设定:
Swappiness是一个Linux内核参数,它控制交换运行时内存的相对权重,而不是从系统页面缓存中删除页面。Swappiness可以设置为0到100之间的值。较低的值会导致内核避免交换,较高的值会导致内核尝试使用交换空间
--memory-swappiness=0 表示禁用容器swap powerpower(这点不同于宿主机,宿主机swappiness设置为0也不保证swap不会被使用)
# docker run -it --rm -m 100M --memory-swappiness=0 ubuntu-stress:latest /bin/bash

(4)--shm-size=""
大小/dev/shm。格式是<number><unit>。number必须大于0. Unit是可选的,可以是b(字节),k(千字节),m(兆字节)或g(千兆字节)。如果省略该单位,则系统使用字节。如果完全省略大小,则系统使用64m。
根据实际需求设置,这里不作过多的介绍
(5)--memory-reservation=""
内存软限制(格式:) <number>[<unit>]。Number是正整数。单位可以是一个b,k,m,或g。
如果不设置-m选项,那么容器使用内存可以理解为是不受限的。按照官方的说法,memory reservation设置可以确保容器不会长时间占用大量内存。
(6)--kernel-memory=""
内核内存限制(格式:) <number>[<unit>]。Number是正整数。单位可以是一个b,k,m,或g。最低为4M。
内核内存没有特殊需求,则无需额外设置

(7)--oom-kill-disable=false
是否为容器禁用OOM Killer。
# docker run -it --rm -m 100M --memory-swappiness=0 --oom-kill-disable ubuntu-stress:latest /bin/bash

默认启动一个容器,对于容器的内存是没有任何限制的。


2、CPU限制:
安装优先级进行限制,数值大,优先级高。
docker run -it --name containera -c 1024 progrium/stress --cpu 1
参数解释:
1024:优先级越大越优先,占用比值,一个占用100,两个各自50%
 
目前 Docker 支持 CPU 资源限制选项:
(1)-c, --cpu-shares=0
CPU shares (relative weight)
-c 选项将会废弃,推荐使用 --cpu-shares
默认所有的容器对于 CPU 的利用占比都是一样的,-c或者--cpu-shares可以设置CPU利用率权重,默认为1024,可以设置权重为2或者更高(单个CPU为1024,两个为2048)。如果设置选项为0,则系统会忽略该选项并且使用默认值1024。通过以上设置,只会在CPU密集(繁忙)型运行进程时体现出来。当一个 container 空闲时,其它容器都是可以占用CPU的。cpu-shares值为一个相对值,实际CPU利用率则取决于系统上运行容器的数量。
测试:当只有一个container时,可以使用任意cpu:
# docker run -it --rm --cpu-shares 512 ubuntu-stress:latest /bin/bash
root@87asjse889:/#: stress -c 4
测试:两个 container,一个设置为 3072,一个设置 1024,CPU 占用如下:
#  docker run -it --rm --cpu-shares 3072 ubuntu-stress:latest /bin/bash
root@87asjse889:/#: stress -c 4

(2)--cpu-period=0
Limit the CPU CFS (Completely Fair Scheduler) period
默认的 CPU CFS「Completely Fair Scheduler」period 是 100ms。我们可以通过 --cpu-period 值限制容器的 CPU 使用。一般 --cpu-period 配合 --cpu-quota 一起使用。
设置 cpu-period 为 100ms,cpu-quota 为 200ms,表示最多可以使用 2 个 cpu,
测试:
# docker run -it --rm --cpu=period=100000 --cpu-quota=200000 ubuntu-stress:latest /bin/bash


(3)--cpuset-cpus=""
CPUs in which to allow execution (0-3, 0,1)
通过 --cpuset-cpus 可以绑定指定容器使用指定 CPU:
设置测试容器只能使用 cpu1 和 cpu3,即最多使用 2 个 固定的 CPU 上:
# docker run -it --rm --cpuset-cpus="1,3"  ubuntu-stress:latest /bin/bash
root@87asjse889:/#: stress -c 4
以下表示容器可以利用 CPU1、CPU2 和 CPU3:
# docker run -it --rm --cpuset-cpus="1-3"  ubuntu-stress:latest /bin/bash

(4)--cpuset-mems=""
Memory nodes (MEMs) in which to allow execution (0-3, 0,1). Only effective on NUMA systems.

(5)--cpu-quota=0
Limit the CPU CFS (Completely Fair Scheduler) quota


2、硬盘(Block IO)限制:
限制原因:会反复读写硬盘,容易坏
bps  每秒钟读写的数据量
设置参数:--device-read-bps
      --device-write-bps
iops 每秒钟读写IO次数
     --device-read-iops
     --device-write-iops
例子:
docker run -itd --name containerc --blkio-weight 600 centos /bin/bahs
参数解释:
优先设置权重 --blkio-weight 600
验证:
**docker run -it --device-write-bps /dev/sda:30MB centos /bin/bash
设置对硬盘的读写为30MB
 
**time dd if=/dev/zero of=test.out bs=1M count=800 oflag=direct
测试:
 
**然后删除这个限制,创建一个新的容器,在进行测试,查看读写速度。

 

标签:stress,限制,--,内存,memory,docker,cpu,系统资源
From: https://www.cnblogs.com/skyzy/p/18125035

相关文章

  • 4、docker-registry
    docker-registryregistry用于保存docker镜像,包括镜像的层次结构和元数据;用户可以自建registry,也可使用官方的DockerHub;分类:sponsorregistry:第三方的registry,供客户和docker社区使用;mirrorregistry:第三方的registry,只让客户使用;vendorregistry:由发布doc......
  • 3 docker存储
    docker存储docker镜像有多个只读层叠加而成,启动容器是,docker会加载只读镜像层,并在镜像栈顶部添加一个读写层如果运行中的容器修改了现有的一个已经存在的文件,那该文件将会从读写层下面的只读层复制到读写层,该文件的只读版本依然存在,只是被读写层中该文件的副本所隐藏此即“写时......
  • 4-1 dockerfile介绍
    dockerfile介绍一dockerfile概念dockerfile是自定义镜像的一套规则(自定义镜像)dockerfie由多条指令构成,Dockerfile中的每一条指令都会对应于Docker镜像中的每一层dockerfile的原理就是镜像分层:1Dockerfile中的每个指令都会创建一个新的镜像层(是一个临时的容器,执行完后将......
  • 1、docker基础及安装,镜像操作
    docker基础dockerarchitecture:dockerclient:dockerbuild、dockerpull、dockerrundocker_host:dockerdeamon:containers+imagesdockerregistry:dockerobjects:images、containers、networks、volumes、plugins镜像:静态的容器:动态,生命周期1、docker安装和使......
  • 0-1、docker
    Docker命令详解#docker--helpUsage:docker[OPTIONS]COMMAND[arg...]dockerdaemon[--help|...]docker[-h|--help|-v|--version]Aself-sufficientruntimeforcontainers.主要选项:-d:以后台进行方式运行容器-t:提供一个伪终端-......
  • docker踩坑之 device or resource busy
    问题描述linux服务器上运行了一个docker容器,在运行cp命令时报错dockercpredis.confmyadmin_redis:/data/redis.conf将服务器上的文件拷贝到docker容器内部时,报以下错误Errorresponsefromdaemon:Errorprocessingtarfile(exitstatus1):unlinkat/data/redi......
  • 4-3 docker隔离机制-cgroups
    ControlGroup控制组群使用CGroups限制这个环境的资源使用情况cgroup:比如一台16核32GB的机器上只让容器使用2核4GB。使用CGroups还可以为资源设置权重,计算使用量,操控任务(进程或线程)启停等;在/sys/fs/cgroup下面有很多如cpu、memory这样的子目录,也叫子系统,这些都是这台机器......
  • 4-2 docker隔离机制-namespace
    1、使用Namespaces实现了系统环境的隔离Docker实际上是在创建容器进程时,指定了这个进程所需要启用的一组Namespace参数,这样容器就只能看到当前Namespace所限定的资源、文件、设备、状态。而对于宿主机以及其他不相干的程序,就完全看不见了http://www.dockone.io/article/8148常......
  • 4-1 Docker容器实现原理
    Docker容器实现原理主要是namespace和cgroup控制资源的隔离。虽然Docker可透过Namespace的方式分隔出看似是独立的空间,然而Linux内核(Kernel)却不能Namespace,所以即使有多个Container,所有的systemcall其实都是通过主机的内核处理,这便为Docker留下了不可否认的安全问题。虚拟机......
  • 2-3、dockerfile之wordpress
    wordpress:4.2#cddocker-training/wordpress/#ls-a.license.txtwp-config-sample.phpwp-login.php..readme.htmlwp-contentwp-mail.phpDockerfilewp-activate.phpwp-cron.php......