Docker Cgroup 容器资源限制

Linux Cgroups 的全称是 Linux Control Group。
`

  1. 是限制一个进程组能够使用的资源上限,包括 CPU内存磁盘
    网络带宽等等。
  2. 对进程进行优先级设置、审计,以及将进程挂起和恢复等操作。
    Linux Cgroups 给用户暴露出来的操作接口是文件系统
  3. 它以文件和目录的方式组织在操作系统的 /sys/fs/cgroup 路径下。 执行此命令查看:mount -t cgroup这里的t表示type
     root@server1 ~]# mount -t cgroup

Docker Cgroup 容器资源限制_第1张图片

/sys/fs/cgroup 下面有很多诸如 cpusetcpumemory 这样
的子目录,也叫子系统。
Docker Cgroup 容器资源限制_第2张图片
cpu.cfs_period_us
表示将cpu时间片分成100000份
cpu.cfs_quota_us
表示当前这个组中的task中的PID将分配多少比例的cpu时间片
tasks
这个文件里面可以写入一个或多个pid,配额设置将影响这些task
cpu.shares
优先级,只有在争抢时候生效,数字越大,优先级越高

  • 在每个子系统下面,为每个容器创建一个控制组(即创建一 个新目录)。控制组下面的资源文件里填上什么值,就靠用户执行 docker run 时的参数指
    1.CPU限额
    对物理机cpu限额

  • 不限额的情况:

    dd if=/dev/zero of=/dev/null &   #开启一个进程使该进程独占cpu
    top   #查看cpu资源分配

Docker Cgroup 容器资源限制_第3张图片

  • 限额:
    root@server1 cpu]# mkdir x1
   [root@server1 cpu]# ls
  cgroup.clone_children  cgroup.sane_behavior  cpuacct.usage_percpu  cpu.rt_period_us    cpu.stat  notify_on_release  tasks
   cgroup.event_control   cpuacct.stat          cpu.cfs_period_us     cpu.rt_runtime_us  docker    release_agent      user.slice
   cgroup.procs           cpuacct.usage         cpu.cfs_quota_us      cpu.shares         kubepods  system.slice       x1
   [root@server1 cpu]# cd x1
   [root@server1 x1]# echo 20000 > cpu.cfs_quota_us#限制control group占用时间为20000微秒
[root@server1 x1]# dd if=/dev/zero of=/dev/null &#通过命令使整个cpu资源分配个一个进程
[2] 28391
[root@server1 x1]# top#仍为100

Docker Cgroup 容器资源限制_第4张图片

  [root@server1 x1]# top#查看id

在这里插入图片描述

[root@server1 x1]# echo 1085 > tasks 
[root@server1 x1]# top #再次查看

在这里插入图片描述
对容器cpu限额

  docker run -it --cpu-period=100000 --cpu-quota=20000 ubuntu /bin/bash

cpu_periodcpu_quota 这两个参数需要组合使用,用来限制进程在
长度为 cpu_period 的一段时间内,只能被分配到总量为cpu_quota
CPU 时间,以上设置表示20%的cpu时间。

    #在容器中通过命令使整个cpu资源分配个一个进程
    root@9b535e3a4378:/# dd if=/dev/zero of=/dev/null &
    [1] 15
    root@9b535e3a4378:/# top查看cpu占用情况

Docker Cgroup 容器资源限制_第5张图片
查看容器cpu限额的配置文件

[root@server1 x1]# docker run -it --cpu-period=100000 --cpu-quota=20000 ubuntu bash
root@86d58b5a31dc:/#         容器不结束进程    
[root@server1 docker]# pwd
/sys/fs/cgroup/cpu/docker
[root@server1 docker]# ls
86d58b5a31dc26e90bc7182ff532fe8ece979076cf2e5eed3307830c3b53c2f4  cpuacct.stat          cpu.cfs_quota_us   cpu.stat
cgroup.clone_children                                             cpuacct.usage         cpu.rt_period_us   notify_on_release
cgroup.event_control                                              cpuacct.usage_percpu  cpu.rt_runtime_us  tasks
cgroup.procs                                                      cpu.cfs_period_us     cpu.shares
[root@server1 docker]# cd 86d58b5a31dc26e90bc7182ff532fe8ece979076cf2e5eed3307830c3b53c2f4/
[root@server1 86d58b5a31dc26e90bc7182ff532fe8ece979076cf2e5eed3307830c3b53c2f4]# ls

在这里插入图片描述

    [root@server1 86d58b5a31dc26e90bc7182ff532fe8ece979076cf2e5eed3307830c3b53c2f4]# cat cpu.cfs_quota_us #容器cpu限额文件
    20000
    [root@server1 86d58b5a31dc26e90bc7182ff532fe8ece979076cf2e5eed3307830c3b53c2f4]# cat cpu.cfs_period_us 
    100000

2.内存限制
容器可用内存包括两个部分:物理内存swap交换分区
对物理机的内存限制

 [root@server1 memory]# pwd
/sys/fs/cgroup/memory
[root@server1 memory]# ls

Docker Cgroup 容器资源限制_第6张图片默认情况下,cgroup在系统中对内存的限制是默认很大的,如果不作限制,当系统中跑的某个进程占用非常大时候,将有可能影响其他进程的运行,甚至可能会不断消耗系统内存,导致系统崩溃。

[root@server1 memory]# cat memory.limit_in_bytes 
9223372036854771712   #默认值
#做限制:
[root@server1 memory]# mkdir x2
[root@server1 memory]# cd x2
[root@server1 x2]# ls
[root@server1 x2]# pwd
/sys/fs/cgroup/memory/x2
[root@server1 x2]# echo  314572800 > memory.limit_in_bytes

当截取一个大小为200M的文件时,可用内存减少200M:
在这里插入图片描述

[root@server1 ~]# dd if=/dev/zero of=file1 bs=1M count=200
200+0 records in
200+0 records out
209715200 bytes (210 MB) copied, 0.203291 s, 1.0 GB/s
[root@server1 shm]# free -m

在这里插入图片描述
当截取文件大于300M时候,直接杀死进程:

对内存限制并没有生效,因此需要安装cgexec管理工具来使用,安装libcgroup-tools.x86_64软件包,对指定控制器做限制

[root@server1 ~]# cgexec -g memory:x2 dd if=/dev/zero of=file bs=1M count=400
400+0 records in
400+0 records out
419430400 bytes (419 MB) copied, 0.46192 s, 908 MB/s

docker run -it --memory 200M --memory-swap=200M ubuntu

--memory设置内存使用限额--memory-swap设置swap交换分区限额

你可能感兴趣的:(Docker Cgroup 容器资源限制)