博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Docker资源限制
阅读量:6833 次
发布时间:2019-06-26

本文共 2762 字,大约阅读时间需要 9 分钟。

在默认的情况下,docker没有对容器进行硬件资源的限制,当容器负载过高时会尽肯能第占用宿主机资源。在这基础上,docker提供了针对容器的内存,CPUIO资源的控制方式。(真正可以控制的只有内存和cpu)

Docker内存控制OOME在linxu系统上,如果内核探测到当前宿主机已经没有可用内存使用,那么会抛出一个OOME(Out Of Memory Exception:内存异常 ),并且会开启killing去杀掉一些进程。
一旦发生OOME,任何进程都有可能被杀死,包括docker daemon在内,为此,docker特地调整了docker daemon的OOM_Odj优先级,以免他被杀掉,但容器的优先级并未被调整。经过系统内部复制的计算后,每个系统进程都会有一个OOM_Score得分,OOM_Odj越高,得分越高,(在docker run的时候可以调整OOM_Odj)得分最高的优先被kill掉,当然,也可以指定一些特定的重要的容器禁止被OMM杀掉,在启动容器时使用 –oom-kill-disable=true指定。
内存限制的部分参数

  • -m : 指定容器内存

  • --memory-swap : 设置容器交换分区大小,设置交换分区必须要设置 -m:依赖前者,容器内与交换分区的关系比较特别,如下:

--memory-swap --memory 功能
正数S 正数M 容器可用总空间为S,其中ram为M,swap为(S-M),若S=M,则无可用swap资源
O 正数M 相当于未设置swap (unset)
unset 正数M 若主机(Docker Host)启用了swap,则容器的可用swap为2*M
-l 正数M 若主机(Docker Host)启用了swap,则容器的可使用最大值主机上的所有swap空间的swap资源

注意:在容器内使用free命令可以看到的swap空间并不具有其所展现出的空间指示意义

  • --oom-kill-disable=true : 禁止容器被oom杀掉,使用该参数要与-m一起使用

CPU的限制

默认情况下,每一个容器可以使用宿主机上的所有cpu资源,但大多数系统使用的资源调度算法是CFS(完全公平调度器),它公平调度每一个工作进程。进程分cpu密集型io密集型两类。系统内核会实时监测系统进程,当某个进程占用cpu资源时间过长时,内核会调整该进程的优先级。

CPU资源分配策略

共享cpu资源

  • --cpu-share: cpu资源提供给一组容器使用,组内的容器按比例使用cpu资源,当容器处于空闲状态时,cpu资源被负载大的容器占用,(按压缩方式比例分配),当空闲进行运行起来时,cpu资源会被分配到其他容器
  • --cpus= value : 指定 cpu的核心数量,这种方式直接限定了容器可用的cpu资源
  • --cpuset-cpus: 指定容器只能运行在哪个cpu核心上(绑定cpu);核心使用0,1,2,3编号;–cpu-share会随机指定cpu

启动一个容器并限制资源

启动一个centos容器,限制其内存为1G ,可用cpu数为2

[root@localhost ~]# docker run --name os1 -it -m 1g --cpus=2 centos:latest bash

启动容器后,可以使用docker 的监控指令查看容器的运行状态

  • docker top 容器名: 查看容器的进程,不加容器名即查看所有
  • docker stats 容器名:查看容器的CPU,内存,IO 等使用信息
[root@localhost ~]# docker stats os1CONTAINER ID        NAME                CPU %               MEM USAGE / LIMIT   MEM %               NET I/O             BLOCK I/O           PIDSf9420cbbd2a9        os1                 45.94%              47.09MiB / 1GiB     4.60%               54.6MB / 352kB      0B / 21.1MB         3

在容器中安装docker容器压测工具 stress

#先安装一些基础工具[root@f9420cbbd2a9 /]# yum install wget gcc gcc-c++ make -y#下载stress[root@f9420cbbd2a9 ~]# wget http://people.seas.harvard.edu/~apw/stress/stress-1.0.4.tar.gz#安装[root@f9420cbbd2a9 ~]# tar zxf stress-1.0.4.tar.gz[root@f9420cbbd2a9 ~]# cd stress-1.0.4[root@f9420cbbd2a9 stress-1.0.4]./configure[root@f9420cbbd2a9 stress-1.0.4]# make[root@f9420cbbd2a9 stress-1.0.4]# make install

在容器使用stress指令进行负载压测

[root@f9420cbbd2a9 ~]# stress  -m 1204m --vm 2#模拟出4个繁忙的进程消耗cpu,然后使用-m 模拟进程最大使用的内存数1024,使用--vm 指定进程数#更多参数使用 stress --help查看

使用docker指令查看容器运行状态,可以os1容器的内存和cpu都得到了限制,即使给压测时超出了最大内存,也不会额外占用资源

[root@localhost ~]# docker stats os1CONTAINER ID       NAME       CPU %            MEM USAGE / LIMIT  MEM %         NET I/O              BLOCK I/O           PIDSf9420cbbd2a9        os1          127.46%          319.7MiB / 1GiB     31.22%        54.8MB / 356kB      0B / 33.6MB          9

转载于:https://www.cnblogs.com/tchroot/p/9441624.html

你可能感兴趣的文章
CSS常用属性
查看>>
搜索引擎开始「实体搜索」新领域竞争,Google、百度分别发力实体搜索产品
查看>>
让敏捷落地-软件研发管理最佳实践(上海站)
查看>>
【R】大型机Linux系统安装R及bsub提交R任务
查看>>
演练:创建并运行托管代码的单元测试 VS2012
查看>>
C#在托盘显示图标
查看>>
把老赵的页面缓存片断改一下,呵呵
查看>>
没有使用全局变量的必要时,就尽量不要使用全局变量。
查看>>
Extjs- Ext.extend函数的使用
查看>>
hdu 1172(暴力题)
查看>>
Oracle to_char()
查看>>
Lucene4Net以及盘古分词
查看>>
thickbox问题
查看>>
HttpApplication事件&ASP.NET页面周期
查看>>
Java事务之八——分布式事务(Spring+JTA+Atomikos+Hibernate+JMS)
查看>>
(转)S5PV210--1---210启动方式和代码前16字节
查看>>
Zlib与GZip - woaidongmao - C++博客
查看>>
ASP.NET那点不为人知的事(四)
查看>>
ExtJs 4.2 treePanel
查看>>
typeof和instanceof的区别
查看>>