本文简要介绍了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:/# psPID TTY          TIME CMD1 pts/0    00:00:00 bash8 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/sreal    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/sreal    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
文章会同步在公众号“牧羊人的方向”更新,感兴趣的可以关注公众号,谢谢!

容器云系列之Docker容器资源隔离相关推荐

  1. 容器云系列之Docker容器监控工具WeaveScope

    容器监控工具很多,本文主要对比了cAdvisor.Weave Scope和Prometheus几种监控工具的特性和功能,并结合环境部署测试了各工具的使用. 容器监控工具很多,下表对比了cAdvisor ...

  2. 容器云系列之Docker镜像和仓库管理

    Docker镜像是Docker容器运行时的只读模板,每一个镜像由一系列的层(layers)组成,对容器的更新操作只是对顶层的可写层操作,而镜像层并没有更改.本文简要介绍了容器镜像和仓库管理和操作,通过 ...

  3. 容器云系列之Docker网络管理及容器互联

    Docker网络有bridge.host.overlay.macvlan和none五种模式,本文对这几种网络模式进行验证并测试容器间的互联通信. 1.Docker网络管理 Docker有5种网络模式, ...

  4. Docker 从入门到实践系列四 - Docker 容器编排利器 Docker Compose

    文章目录 Compose简介 概念 组成 安装与卸载 二进制包方式安装 测试 卸载 docker-compose.yml 文件详解 概念 案例 version services image build ...

  5. 云原生尝试——docker容器域名绑定

    docker容器域名绑定 1.引言 2.为什么问题的关键变成了nginx? 3.简单聊聊nginx 4.首先给主站点配置域名 参考文章(已点赞): 1.引言     上一篇文章 主要是用实践的方式总结 ...

  6. Docker系列 五.Docker容器数据卷

    五.Docker容器数据卷 环境&工具: 阿里云轻量级服务器.CentOS 7系统.FinalShell(其他连接客户端也可以) 是什么 docker的理念将运行的环境打包形成容器运行,运行可 ...

  7. 【云原生】Docker容器详细讲解

    前言 大家好,本文是对 Docker 容器的详细讲解,讲解了如何启动容器.进入容器,以及操作容器的命令.希望对大家有所帮助~ 目录 前言 一.Docker 容器 - 操作 Docker 容器 1.启动 ...

  8. docker 查看已安装容器_WIN7下安装Docker容器

    一.Docker容器介绍 Docker 是一个开源的应用容器引擎,可以打包他们的应用以及依赖包到一个可移植的镜像中.一个完整的Docker由DockerClient客户端.Docker Daemon守 ...

  9. 容器安装java_在docker容器中安装Java(从宿主机向docker容器中拷贝文件)

    操作系统 [root@Optimus /]# uname -a Linux Optimus 2.6.32-504.el6.x86_64 #1 SMP Wed Oct 15 04:27:16 UTC 2 ...

最新文章

  1. java代码_阿里资深工程师教你如何优化 Java 代码!
  2. Interview:算法岗位面试—11.07早上上海某机器人公司(上市)面试之项目考察、比赛考察、图像算法的考察等
  3. 现在当兵有什么待遇复原以后_从今年征兵情况来看,以后当兵可能会越来越难,有6点原因...
  4. get与post区别
  5. mysql 触发器不能同时 insert or update or delete_MySQL6:触发器
  6. 开机时自动运行shell_病毒究竟是怎么自动执行的(上)?
  7. xor和路径(codevs 2412)
  8. 国产GPGPU如何赶超国外?这3条路最有希望
  9. c语言实现十进制转换其他进制的代码
  10. 解决Linux下无法利用shell脚本启动conda虚拟环境问题
  11. 云豹智能发布全功能云霄DPU网卡,引领数据中心新趋势
  12. Leetcode 2327. Number of People Aware of a Secret [Python]
  13. Windows 10 家庭中文版,电脑文件夹背景、Word背景全变成黑色的解决方案
  14. 阿德莱德计算机专业offer,2020年阿德莱德大学录取offer介绍及offer多久到
  15. HINSTANCE+hPreInstance
  16. special effects - 鼠标移动,出现自定义的表情拖尾
  17. Millumin 3 for mac(专业视频编辑软件)
  18. 简述TCP 三次握手
  19. 关于计算机的英语名言,行业英语:计算机英语名言警句 - 英语家园
  20. 最全Pycharm教程(13)——Pycharm部署

热门文章

  1. LCD背光驱动节电技术-LABC/CABC
  2. 城市内涝的解决措施,城市内涝积水监测预警系统解决方案
  3. 记录由于一次强制断电导致的服务器无法启动的恢复过程
  4. 【中间件安全】Apache 安全加固规范
  5. 战五渣系列之七(索引那点事)
  6. 记录通过台词搜索电影的工具
  7. SDO处理过程(一)
  8. springMVC去除web.xml的依赖
  9. 开心农场(happyfarm.pas/c/cpp)
  10. 一篇文章快速了解【无线电波如何传播】射频篇