本文简要介绍了Docker容器对CPU、内存和IO等系统资源限制。
2、Docker容器资源限制 2.1 Namespace资源隔离
Docker使用Linux 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、内存、磁盘三大方面。
Docker 提供的内存限制功能有以下几点:
- 容器能使用的内存和交换分区大小。
- 容器的核心内存大小。
- 容器虚拟内存的交换行为。
- 容器内存的软性限制。
- 是否杀死占用过多内存的容器。
- 容器被杀死的优先级
执行docker run命令时能使用的和内存限制相关的所有选项如下:
docker run命令和CPU限制相关的所有选项如下:
其中–cpuset-cpus用于设置容器可以使用的 vCPU 核。-c,–cpu-shares用于设置多个容器竞争 CPU 时,各个容器相对能分配到的 CPU 时间比例。–cpu-period和–cpu-quata用于绝对设置容器能使用 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%左右
相对于CPU和内存的配额控制,docker对磁盘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。
参考资料
- https://docs.docker.com/storage/volumes/
- https://www.cnblogs.com/kevingrace/p/6238195.html
- https://www.cnblogs.com/zhuochong/p/9728383.html
- https://blog.csdn.net/songcf_faith/article/details/82749011
- https://blog.csdn.net/songcf_faith/article/details/82748987
转载请注明原文地址:https://blog.csdn.net/solihawk/article/details/121299888
文章会同步在公众号“牧羊人的方向”更新,感兴趣的可以关注公众号,谢谢!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)