docker资源限制

一、限制容器对内存使用

        一个docker host 上会运行若干容器,每个容器都需要CPU、内存和io资源。对于kvm,VMware等虚拟化技术,用户可以分配多少CPU、内存资源给每个虚拟资源给每个虚拟机。

        对于容器、docker也提供了类似的机制避免某个容器因占用太多资源而影响其他容器乃至整个host的性能。

    内存限额与操作系统类似、容器可使用的内存包括两部分:物理内存和swap。docker通过下面两组参数来控制容器内存的使用量。

          1.-m或--memory:设置内存的使用限额, 例如100M,2G

          2.--memory-swap:设置 内存+swap 的使用限额。

     例子:

docker run -m 200M --memory-swap=300M centos

          其含义是允许该容器最多可以使用200M的内存和100M的swap

          默认情况什么也不加时候,上面两组参数为 -1 也就是对容器的内存和swap没有限制

1.通过progrium/stress镜像来学习如何为容器分配内存。该镜像可用于对容器执行压力测试。

docker run -it -m 200M --memory-swap=300M progrium/stress --vm 1 --vm-bytes 350M

     运行内存过大直接结束,否则会一直运行

      --vm 1:启动1个内存工作线程

      --vm-bytes  280M : me每个线程分配280内存

工作过程:

     1.分配280M内存,
     2.释放280M内存,
     3.再分配280M内存,
     4.再释放280M内存,
     5.一直循环...../分配的内存超过限颗, stress线程端, 容器退出

如果在启动容器时只指定-m 而不指定--memory-swap,那么--memory-swap默认为-m的两倍

docker run -it -m 200M centos

   容器最多使用200M物理内存和200M swap

二、限制容器对cpu的使用

     默认设置下, 所有容器可以平等地使用host CPU资源井且没有限制。
     Docker可以通过-c或--cpu-shares设置容器使用CPU的权重, 如果不指定, 默认值为1024.
     与内存限颗不同, 通过-c设置的cpu s容器最烧hare井不是CPU资的绝对数量, 而是一个相对的权重值。某个能分配到的CPU资源取决于它的cpu share古所有容器cpu share总和的比例,
     换句话说:通过cpu share可以设置容器使用CPU的优先级。

 
docker run --name "container_A" -c 1024 centos
docker run --name "container_B" -c 512 centos

   container_A的cpu share 1024, 是container_B的两, 当两个器都需要CPU资源时, container_A可以得到的CPU是
container_B的两倍,
   需要特别注意的是, 这种接权重分配CPU只会发生在CPU资源素张的情况下, 如果container_A处于空闲状态, 这时, 为
了充分利用CPU资源, container_B也可以分配到全部可用的CPU,

 

1. 启动container_A, cpu share为1024:
 
docker run  -dit --name "container_A" -it -c 1024 progrium/stress --cpu 1

  

    --cpu用来设置工作线程的数量, 因为当前host只有1颗CPU, 所以一个工作线程就能将CPU压满。
   如果host有多CPU, 则需要相应增加--cpu的数量
 
 
2.启动container_B, cpu share为512:
 
docker run  -dit --name "container_B" -it -c 512 progrium/stress --cpu 1

 
   container_A消耗的CPU是container_B的两倍,
 
三、限制容器的Block IO
 
       Block IO是另一种可以限制容使用的资源。Block IO指的是础盘的读写, docker可通过设置权重, 限制bps和iops的方式控制陆读磁盘的带宽,下面分别讨论
 
   1.block  IO权重
        
     默认情况下, 所有容器能平等地读写磁盘, 可以通过设置--bilkio-weight参数来改变容器block IO的优先级,
     --bilkio-weight与-cpu-shares类似, 设置的是相对权重值, 默认为500, 在下面的例子中, container_A读写磁盘的带宽是container_A的两倍
docker run -it --name container_A --blkio-weight 600 centos
docker run -it --name container_B --blkio-weight 300 centos

限制bps和iops bps是byte per second, 每砂读写的数据量

iops是io per second, 每砂IO的次数。

 

可通过以下参数控制容器的bps和iops;

  --device-read-bps, 限制读个设备的bps.

 --device-write-bps, 限制写基个设备的bps,

 --device-read-iops, 限制读冥个设备的iops.

 --device-write-iops, 限制写某个设备的iops,
下面这个例子限制容器写/dev/sda的速率为30MB/s

docker run -it --device-write-bps /dev/vda:300MB centos
[root@1c590c32963f /]# time dd if=/dev/zero of=test.out bs=1M count=800 oflag=direct

 
通过dd测试在容器中写磁盘的速度, 因为容器的文件系统是在host  /dev/vda上的, 在容器中写文件相当于对host  /dev/vda进行写操作, 另外, oflag=direct指定用direct lO方式写文件, 这样--device-write-bps才能生效,
结果表明, bps 2.6MB/s没有超过30MB/s的限速。
 
作为对比测试结果,如果不限速:
 
docker run -it  centos
[root@ef6d74835a6d /]# time dd if=/dev/zero of=test.out bs=1M count=800 oflag=direct

  

 
四、实现容器的底层技术
 
cgroup和namespace是最重要的两种技术。cgroup实现资源限额, namespace实现资源隔离,
 
1.cgroup
    cgroup全称Control Group, Linux操作系统通过cgroup可以设置进程便用CPU, 内存和IO资源的限额,
    --cpu-shares, -m、--device-write-bps实际上就是在配置cgroup。
 
  cgroup到底长什么样子呢?我们可以在/sys/fs/c group中找到它,
 
   用例子来说明, 启动一个容器, 设置--cpu-shares=512:
docker run -it --cpu-shares 512 progrium/stress -c 1

 查看容器的ID:
 
 
在/sys/fs/cgroup/cpu/d locker目录中, Linux会为每个容器创建一个cgroup目录, 以容器长ID命名
 
目录中包含所有与cpu相关的cgroup配置, 文件cpu.shares保存的就是-cpu-shares的配置, 值为512.
同样的, /sys/fs/cgroup/memory/docker和/sys/fs/cgraup/blkia/docker中保存的是内存以及Block IO的cgroup配置,
 
2.namespace
 
   在每个容器中,我们都可以看到文件系统,网卡等资源,这些资源看上去是容器自己的。
   拿网卡来说,每个容器都会认为目己有一块独立的网卡, 即便host上只有一块物理网卡, 这种方式非常好, 它便得容更像一个独立的计算机,
   Linux实现这种方式的技术是namespace, namespace管理着host中全局唯一的资源, 并可以让每个容器部觉得只有真己在使用它, 换句话说, namespace实现了容器问资源的隔离,
Linux使用了六种namespace, 分别对应六种资源:Mount, UTS、IPC、PID.Network和User
 
1.Mount namespace
   Mount namespace让器看上去拥有整个文件系统。
  有自己的/目录, 可以执行mount和umount命令, 当然我们知道这些操作只在出前睿器中生效, 不会影响到host和
 
2.UTS namespace
 
    简单的说, UTS namespace让器有自己的hostname.默认情况下, 题的hostname是它的短ID, 可以通过 -h成--hostname参数设置
       
3.IPC namespace
    容器有自己的共享内存和信号量(semaphore)来实现进程间通,而不会与host和的容器的IPC混在一起。
 
4.PID namespace
   所有容器的进程都挂在docker d进程下, 同时也可以看到客端自己的子进程, 如果我们进入到某个器, ps就只能看到自
 
    
5.network namespace
    network namespace 让容器拥有自己独立的网卡 ip 路由器等资源
6.user namespace
    user namespace让容器能够管理自己的用户,host不能看到容器中创建的用户
   
 
在容器中创建了用户cloudman,单host中并不会创建相应的用户。
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值