Docker容器资源控制

Docker资源配置

简介

Docker 通过 cgroup 来控制容器使用的资源配额,包括 CPU、内存、磁盘三大方面,基本覆盖了常见的资源配额和使用量控制。

cgroup

cgroup 是 Control Groups 的缩写,是 Linux 内核提供的一种可以限制、记录、隔离进程组所使用的物理资源(如 cpu、memory、磁盘 IO 等等) 的机制,被 LXC、docker 等很多项目用于实现进程资源控制。cgroup 将任意进程进行分组化管理的 Linux 内核功能。cgroup 本身是提供将进程进行分组化管理的功能和接口的基础结构,I/O 或内存的分配控制等具体的资源管理功能是通过这个功能来实现的。

资源分配的优点

  1. 不同的容器承担不同的业务 根据业务的重要性分配不同的资源份额
  2. 通过更好的分配服务器资源 能高加高效稳定的保证容器运行

控制Docker执行任务CPU

配置容器权重

  1. 默认cpu份额都是1024 在同一个cpu容器运行多个
  2. cpu份额分配结果取决于容器运行时候的状态 假如:容器A分配的份额为1024容器B分配的份额为512 此时容器A处于空闲状态 那么容器B也会独占整个cpu资源
  3. cgroups 只在多个容器同时争抢同一个 cpu 资源时,cpu 配额才会生效
[root@SR ~]# docker run -it --cpu-shares 521 centos:7.6.1810 /bin/bash		# 分配512的权重

[root@4a808316880a /]# cat /sys/fs/cgroup/cpu/cpu.shares 	# 查看权重

配置容器cpu的亲和力

# 配置容器对cpu 0 1亲和力
[root@SR ~]# docker run -it --name cpu_set --cpuset-cpus 0,1 centos:7.6.1810 /bin/bash

[root@10b7a20b1515 /]# cat /sys/fs/cgroup/cpuset/cpuset.cpus

混合使用

# 使用stress进行压测

# 创建两个实例 权重分别为512和1024
[root@SR ~]# docker run --name docker10 -idt --cpuset-cpus 0,1 --cpu-shares 512 centos:7.6.1810 /bin/bash

[root@SR ~]# docker run --name docker20 -itd --cpuset-cpus 0,1 --cpu-shares 1024 centos:7.6.1810 /bin/bash

[root@557ca1c90049 /]# stress -c 2 -v -t 10m 	# 容器开启压测

[root@85715d5cac37 /]# stress -c 2 -v -t 10m 	# 容器开启压测

PS:此处只有cpu 0 1被调度 同时docker20的cpu使用率是docker10的2倍

周期控制

  1. --cpu-period 是用来指定容器对 CPU 的使用,要在多长时间内做一次重新分配。 指定周期
  2. --cpu-quota 是用来指定在这个周期内,最多可以有多少时间片断用来跑这个容器。 指定在这个周
    期中使用多少时间片
  3. 跟--cpu-shares 不同的,--cpu-period 和--cpu-quota 是指定一个绝对值,而且没有弹性在里
    面,容器对 CPU 资源的使用绝对不会超过配置的值
# 设置 docker 实例每 1 秒只能使用单个 CPU 的 0.2 秒时间,可以将 cpu-period 设置为1000000(即 1 秒),cpu-quota 设置为 200000(0.2 秒)

[root@SR ~]# docker run -it --cpu-period 1000000 --cpu-quota 2000000 centos /bin/bash

[root@7150d481dbf1 /]# cat /sys/fs/cgroup/cpu/cpu.cfs_period_us # 查看周期

[root@7150d481dbf1 /]# cat /sys/fs/cgroup/cpu/cpu.cfs_quota_us  # 查看周期内时间片

释放容器实例

当容器运行命令结束后 自动删除容器 释放资源

[root@SR ~]# docker run -it --rm --name test_rm centos:7.6.1810 sleep 5 # 使用rm进行删除

[root@SR ~]# docker ps | grep test_rm

控制容器的内存

Docker 提供参数-m, --memory=""限制容器的内存使用量

# 允许容器使用的内存上限为 125M
[root@SR ~]#  docker run -it -m 125m centos:7.6.1810

[root@e05e5e6a881c /]# cat /sys/fs/cgroup/memory/memory.limit_in_bytes # 查看内存

控制容器的I/O

防止容器吃光物理机磁盘

[root@SR ~]# docker run -it -v /var/www/html/:/var/www/html --devic/dev/sda:/dev/sda --device-write-bps /dev/sda:1mb centos /bin/bash

[root@bd79042dbdc9 /]# time dd if=/dev/sda of=/var/www/html/test.out bs=1M count=50 oflag=direct,nonblock


dd参数解释
direct:读写数据采用直接 IO 方式,不走缓存。直接从内存写硬盘上

nonblock:读写数据采用非阻塞 IO 方式,优先写 dd 命令的数据

Docker数据映射

  1. Docker存储属于弱项 需要通过外挂进行实现
  2. 通过映射此时docker损坏 数据存在

物理机与容器数据映射

# 通过-v 进行数据映射
[root@SR ~]# echo "测试Docker的数据映射" /var/www/html/test.html
	
[root@SR ~]# docker run -it --name test_web -v /var/www/html/:/var/www/html centos /bin/bash	# 数据映射

[root@da7eb360b3f4 /]# ls /var/www/html/	# 查看映射目录

[root@da7eb360b3f4 /]# cat /var/www/html/test.html 	# 查看内容

容器与物理机进行数据映射

[root@da7eb360b3f4 html]# vim test.html 
	test
 
[root@SR ~]# cat /var/www/html/test.html 

posted @ 2020-10-24 18:17  SR丶  阅读(673)  评论(0编辑  收藏  举报