容器云系列之Docker容器资源隔离

本文简要介绍了Docker容器对CPU、内存和IO等系统资源限制。


2、Docker容器资源限制
2.1 Namespace资源隔离

Docker使用Linux namespace技术实现容器间的资源隔离
在这里插入图片描述

>>以PID namespace为例<<

1)启动一个容器

[root@tango-01 /]# docker run -it  --name pidtest ubuntu /bin/bash

2)查看容器中的进程id(可以看到/bin/sh的pid=1)

root@e9fcfb4c6f17:/# ps
   PID TTY          TIME CMD
     1 pts/0    00:00:00 bash
     8 pts/0    00:00:00 ps

3)查看宿主机中的该/bin/sh的进程id

[root@tango-01 /]# ps -ef|grep ubuntu
root       3079   1671  0 14:48 pts/0    00:00:00 docker run -it --name pidtest ubuntu /bin/bash
root       3146   2387  0 14:49 pts/1    00:00:00 grep --color=auto ubuntu

可以看到,在Docker里最开始执行的/bin/sh,就是这个容器内部的第1号进程(PID=1),而在宿主机上看到它的PID=3709。这就意味着,前面执行的/bin/sh,已经被Docker隔离在了一个跟宿主机完全不同的世界当中。这就是Docker在启动一个容器(创建一个进程)时使用了PID namespace

2.2 Cgroup资源限制

cgroup是Control Groups的缩写,是Linux 内核提供的一种可以限制、记录、隔离进程组所使用的物理资源(如 cpu、memory、磁盘IO等等) 的机制。docker 也是通过内核的 cgroups 来做容器的资源限制;包括CPU、内存、磁盘三大方面。
在这里插入图片描述

2.2.1 内存限制

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

  • 容器能使用的内存和交换分区大小。
  • 容器的核心内存大小。
  • 容器虚拟内存的交换行为。
  • 容器内存的软性限制。
  • 是否杀死占用过多内存的容器。
  • 容器被杀死的优先级

执行docker run命令时能使用的和内存限制相关的所有选项如下:
在这里插入图片描述

2.2.2 CPU限制

docker run命令和CPU限制相关的所有选项如下:
在这里插入图片描述
其中–cpuset-cpus用于设置容器可以使用的 vCPU 核。-c,–cpu-shares用于设置多个容器竞争 CPU 时,各个容器相对能分配到的 CPU 时间比例。–cpu-period和–cpu-quata用于绝对设置容器能使用 CPU 时间。

>>CPU限制例子<<

1)配置控制组

[root@tango-01 cgroup]# cd /sys/fs/cgroup/cpu
[root@tango-01 cpu]# mkdir testcpulimit
[root@tango-01 cpu]# cd testcpulimit/
[root@tango-01 testcpulimit]# ls
cgroup.clone_children  cgroup.procs  cpuacct.usage         cpu.cfs_period_us  cpu.rt_period_us   cpu.shares  notify_on_release
cgroup.event_control   cpuacct.stat  cpuacct.usage_percpu  cpu.cfs_quota_us   cpu.rt_runtime_us  cpu.stat    tasks
[root@tango-01 testcpulimit]# cat /sys/fs/cgroup/cpu/testcpulimit/cpu.cfs_quota_us
-1
[root@tango-01 testcpulimit]# cat /sys/fs/cgroup/cpu/testcpulimit/cpu.cfs_period_us
100000

创建的这个目录testcpulimit就称为一个“控制组”,操作系统会在新创建的目录下,自动生成该子系统对应的资源限制文件。可以看到testlimit控制组里的CPU quota还没有任何限制(即:-1),CPU period则是默认的100000us。

2)配置一个只能使用30%cpu的限制,即长度为cfs_period的一段时间内,只能被分配到总量为cfs_quota的CPU时间。

[root@tango-01 testcpulimit]# echo 30000 > /sys/fs/cgroup/cpu/testcpulimit/cpu.cfs_quota_us
[root@tango-01 testcpulimit]# cat /sys/fs/cgroup/cpu/testcpulimit/cpu.cfs_quota_us
30000

3)在容器中执行脚本

[root@tango-01 /]# docker run -it  --name cputest ubuntu /bin/bash
root@be59c323f3ad:/# 
root@be59c323f3ad:/# while : ; do : ; done &
[1] 10
root@be59c323f3ad:/# top
top - 07:24:47 up  1:04,  0 users,  load average: 0.08, 0.44, 0.31
Tasks:   3 total,   2 running,   1 sleeping,   0 stopped,   0 zombie
%Cpu(s): 30.0 us,  0.3 sy,  0.0 ni, 69.7 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
MiB Mem :    976.3 total,    136.2 free,    440.4 used,    399.7 buff/cache
MiB Swap:   2048.0 total,   2048.0 free,      0.0 used.    362.4 avail Mem 

   PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND                                                                                              
    10 root      20   0    4232    748    180 R  30.3   0.1   3:39.46 bash                                                                                                 
     1 root      20   0    4232   2208   1640 S   0.0   0.2   0:00.13 bash                                                                                                 
    11 root      20   0    6100   1812   1292 R   0.0   0.2   0:00.07 top

在这里插入图片描述
在这里插入图片描述

4)使用cgroup限制该进程的cpu

[root@tango-01 testcpulimit]# echo 3564 > /sys/fs/cgroup/cpu/testcpulimit/tasks 
[root@tango-01 testcpulimit]# 
[root@tango-01 testcpulimit]# top
top - 15:23:21 up  1:03,  2 users,  load average: 0.38, 0.59, 0.34
Tasks: 130 total,   2 running, 128 sleeping,   0 stopped,   0 zombie
%Cpu(s): 29.6 us,  0.3 sy,  0.0 ni, 70.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :   999696 total,   138896 free,   378192 used,   482608 buff/cache
KiB Swap:  2097148 total,  2097148 free,        0 used.   370456 avail Mem 

   PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND                                                                                                
  3564 root      20   0    4232    748    180 R 29.9  0.1   3:13.66 bash

在这里插入图片描述
在这里插入图片描述
看到使用刚才创建的testcpulimit控制组,将cpu被限制到了30%左右

2.2.3 磁盘IO配额控制

相对于CPU和内存的配额控制,docker对磁盘IO的控制相对不成熟,大多数都必须在有宿主机设备的情况下使用。主要包括以下参数:
在这里插入图片描述

>>磁盘IO配额控制示例<<

1)blkio-weight

要使–blkio-weight生效,需要保证IO的调度算法为CFQ。可以使用下面的方式查看:

[root@tango-01 /]# cat /sys/block/sda/queue/scheduler
noop [deadline] cfq

使用下面的命令创建两个–blkio-weight值不同的容器:

[root@tango-01 /]# docker run -ti --rm --blkio-weight 10 ubuntu 
[root@tango-01 /]# docker run -ti --rm --blkio-weight 1000 ubuntu

在容器中同时执行下面的dd命令,进行测试:

time dd if=/dev/zero of=test.out bs=1M count=1024 oflag=direct

最终输出如下所示:

##--blkio-weight 10
[root@tango-01 /]# docker run -ti --rm --blkio-weight 10 ubuntu
root@8f5bd8c7b853:/# time dd if=/dev/zero of=test.out bs=1M count=1024 oflag=direct
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB, 1.0 GiB) copied, 10.6883 s, 100 MB/s

real    0m10.690s
user    0m0.001s
sys     0m0.633s
root@8f5bd8c7b853:/#
##--blkio-weight 1000
[root@tango-01 testcpulimit]# docker run -ti --rm --blkio-weight 1000 ubuntu
root@0248a935fa36:/# time dd if=/dev/zero of=test.out bs=1M count=1024 oflag=direct
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB, 1.0 GiB) copied, 9.74697 s, 110 MB/s

real    0m9.839s
user    0m0.001s
sys     0m0.673s
root@0248a935fa36:/#

2)device-write-bps

使用下面的命令创建容器,并执行命令验证写速度的限制。

docker run -tid –name disk1 –device-write-bps /dev/sda:1mb ubuntu

通过dd来验证写速度,输出如下图示:

[root@tango-01 /]# docker run -tid --name disk1 --device-write-bps /dev/sda:1mb ubuntu
33c0cac7c8966e2d16850f9239b2e354c169a275199ed2c5900dfe1959232c19
[root@tango-01 /]# docker exec -ti disk1 bash
root@33c0cac7c896:/#  dd if=/dev/zero of=test.out bs=1M count=100 oflag=direct
100+0 records in
100+0 records out
104857600 bytes (105 MB, 100 MiB) copied, 100.003 s, 1.0 MB/s

在这里插入图片描述
可以看到容器的写磁盘速度被成功地限制到了1MB/s。


参考资料

  1. https://docs.docker.com/storage/volumes/
  2. https://www.cnblogs.com/kevingrace/p/6238195.html
  3. https://www.cnblogs.com/zhuochong/p/9728383.html
  4. https://blog.csdn.net/songcf_faith/article/details/82749011
  5. https://blog.csdn.net/songcf_faith/article/details/82748987

转载请注明原文地址:https://blog.csdn.net/solihawk/article/details/121299888
文章会同步在公众号“牧羊人的方向”更新,感兴趣的可以关注公众号,谢谢!
在这里插入图片描述

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值