Docker之限制容器的资源使用过程

 更新时间:2024年07月04日 11:44:55   作者:小李学不完  
这篇文章主要介绍了Docker之限制容器的资源使用过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

一、容器所用内存资源的限制

容器可使用的内存:物理内存和交换空间(Swap)。

1.1、用户内存限制

Docker默认没有设置内存限制。

可以通过相关选项限制设置:

  • -m(--memory):设置容器可用的最大内存。该值最低为4MB。
  • --memory-swap:允许容器置入磁盘交换空间中的内存大小

Docker提供4种方式设置容器的用户内存使用:

  • 对容器内存使用无限制(两个选项都不使用)。
  • 设置内存限制并取消交换空间内存限制。
 #使用300内存和尽可能多的交换空间
 docker run -it -m 300M --memory-swap -1 ubuntu /bin/bash
  • 只设置内存限制。
 # 300MB的内存和300MB的交换空间(默认情况下虚拟内存总量将设置为内存大小的两倍,因此容器能使用300M的交换空间
 docker run –it -m 300M ubuntu /bin/bash
  • 同时设置内存和交换空间
 # 300MB的内存和700MB的交换空间
 docker run –it –m 300M --memory-swap 1G ubuntu/bin/bash

1.2、内核内存限制

内核内存不能交换到磁盘中,无法使用交换空间,消耗过多可能导致其阻塞系统服务。

 # 在500MB的内存中,可以使用最高50MB的内核内存
 docker run –it -m 500M --kemel-memory 50M ubuntu /bin/bash
 ​
 # 只可以使用50MB的内核内存
 docker run –it --kernel-memory 50M ubuntu /bin/bash

1.3、设置内存预留实现软限制

使用--memory-reservation选项设置内存预留。

它是一种内存软限制,允许更多的内存共享。设置后,Docker将检测内存争用或内存不足,并强制容器将其内存消耗限制为预留值。

内存预留值应当始终低于硬限制。作为一个软限制功能,内存预留并不能保证不会超过限制。

 # 限制内存为500MB,内存预留值(软限制)为200MB。
 # 当容器消耗内存大于200MB、小于500MB时,下一次系统内存回收将尝试将容器内存缩减到200MB以下。
 docker run –it –m 500M --memory-reservation 200M ubuntu /bin/bash
 ​
 # 设置内存软限制为1GB
 docker run –it —-memory-reservation 1G ubuntu /bin/bash

二、容器所用CPU资源的限制

默认情况为所有容器可以平等地使用主机CPU资源并且不受限制。

2.1、CPU份额限制

-c(--cpu-shares)选项将CPU份额权重设置为指定的值。

默认值为1024,如果设置为0,系统将忽略该值并使用默认值1024。

2.2、CPU周期限制

--cpu-period选项(以μs为单位)设置CPU周期以限制容器CPU 资源的使用。

默认的CFS(完全公平调度器)周期为100ms(100000μs)。

通常将--cpu-period与--cpu-quota这两个选项配合使用:

 # 如果只有1个CPU,则容器可以每50ms(50000μs)获得50%(25000/50000)的CPU运行时间。
 docker run -it --cpu-period=50000 -~cpu-quota=25000 ubuntu /bin/bash

可用--cpus选项指定容器的可用 CPU 资源来达到同样的目的。

--cpus 选项值是一个浮点数,默认值为 0.000,表示不受限制。

 # 上述可改为
 docker run -it --cpus=0.5 ubuntu /bin/bash

--cpu-period和--cpu-quota选项都是以1个CPU为基准。

2.3、CPU放置限制

--cpuset-cpus选项限制容器进程在指定的CPU上执行。

# 容器中的进程可以在cpu1和cpu3上执行
 docker run -it--cpuset-cpus="1, 3" ubuntu:14.04 /bin/bash
 ​
 # 容器中的进程可以在cpu0、cpu1和cpu 2上执行
 docker run -it --cpuset-cpus="0-2" ubuntu:14.04 /bin/bash

2.4、CPU配额限制

--cpu-quota选项限制容器的CPU配额,默认值为0表示容器占用 100%的CPU资源个CPU)。

CFS用于处理进程执行的资源分配,是由内核使用的默认 Linux 调度程序。

将此值设置50000意味着限制容器至多使用CPU资源的50%。对于多个CPU而言,调整--cpu-quota选项必要的。

三、容器所用块I/O带宽的限制

块I/O带宽(Block I/O Bandwidth,Blkio)是另一种可以限制容器使用的资源

块I/O指磁盘的写,Docker可通过设置权重、限制每秒字节数(B/s)和每秒I/O次数(IO/s)的方式控制容器读写盘的带宽。

3.1、设置块I/O权重

--blkio-weight选项更改比例(原默认为500),设置相对于所有其他正在运行的容器的块 I/O 带宽权重。

# 创建两个有不同块 I/O 带宽权重的容器。
docker run –it --name c1 --blkio-weight 300 ubuntu /bin/bash
docker run -it --name c2 --blkio-weight 600 ubuntu /bin/bash

3.2、限制设备读写速率

Docker 根据两类指标限制容器的设备读写速率:一类是每秒字节数,另一类是每秒I/O次数

  • 限制每秒字节数

--device-read-bps选项限制指定设备的读取速率,即每秒读取的字节数。

# 创建一个容器,并限制对/dev/sda设备的读取速率为每秒1MB
docker run -it --device-read-bps /dev/sda:1mb ubuntu

类似地,可使用--device-write-bps选项限制指定设备的写入速率

格式:

<设备>:<速率值>[单位]

  • 限制每秒I/O次数

--device-read-iops--device-write-iops选项制指定设备的读取和写入速率,用每秒I/O次数表示。

# 创建一个容器,限制它对1devsd3设备的读取速率为每秒1000次。
docker run -it --device-read-iops /dev/sda:1000 ubuntu

四、资源限制的实现机制

对容器使用的内存、CPU和块I/O带宽资源的限制具体是由控制组(Cgroup)的相应子系统来实现的

  • memory子系统设置控制组中的住务所使用的内存限制;
  • cpu子系统通过调度程序提供对CPU的控制组任务的访问;
  • blkio子系统为块设备(如磁盘、固态硬盘、USB等)设置输入和输出限制。

在docker run命令中使用--cpu-shares、--memory、--device-read-bps等选项实际上就是在配置控制组,相关的配置文件保存在/sys/fs/cgroup目录中。

五、示例

5.1、验证分析容器资源限制的实现机制

  • 启动一个容器,设置内存限额为300MB,CPU权重为512。
[root@docker ~]# docker run --rm -d -p 8080:80 -m 300M --cpu-shares=512 httpd
b8a03a3887f1f...
  • 查看/sys/fs/cgroup/cpu/docker目录,发现Linux为每个正在运行的容器创建一个Cgroup目录,以容器ID命名:
[root@docker ~]# ls -l /sys/fs/cgroup/cpu/docker/
total 0
drwxr-xr-x 2 root root 0 Apr 29 13:08 b8a03a3887f1f...
...
  • 进一步查看容器子目录,会发现每个容器的子目录中都包含所有与CPU相关的Cgroup配置:
[root@docker ~]# ls -l /sys/fs/cgroup/cpu/docker/b8a03a3887f1f...
total 0
...
-rw-r--r-- 1 root root 0 Apr 29 13:12 cpu.rt_runtime_us
-rw-r--r-- 1 root root 0 Apr 29 13:08 cpu.shares
...
  • 查看其中cpu.shares文件的内容,发现它保存的就是--cpu-shares选项的配置(512):
[root@docker-2322030238 ~]# cat /sys/fs/cgroup/cpu/docker/b8a03a3887f1f.../cpu.shares 
512
  • 类似,查看/sys/fs/cgroup/memory/docker目录中的内存Cgroup配置,发现memory.limit_in_bytes文件保存的就是-m选项的配置,本例设300MB,用字节表示为314572800:
[root@docker ~]# cat /sys/fs/cgroup/memory/docker/b8a03a3887f1f.../memory.limit_in_bytes 
314572800

5.2、动态更改容器的资源限制

docker update命令可以动态地更新容器配置,其语法:

docker update [选项] 容器 [容器...]

启动一个限制资源的容器后,再修改其资源限制:

[root@docker ~]# docker run --rm -d -p 8080:80 -m 300M --cpu-shares=512 httpd
29d3cb1392b8e...
[root@docker ~]# docker update -m 500M --cpu-shares=10245 29d3
29d3

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Docker启动镜像就自动退出问题及解决

    Docker启动镜像就自动退出问题及解决

    这篇文章主要介绍了Docker启动镜像就自动退出问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • docker命令中必须加上sudo的问题解决方法

    docker命令中必须加上sudo的问题解决方法

    本文主要介绍了docker命令中必须加上sudo的问题解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06
  • 安装Docker配置阿里云镜像加速(图文教程)

    安装Docker配置阿里云镜像加速(图文教程)

    dcker配置阿里云镜像加速,其目的是为了在提高docker镜像下载速度,本文主要介绍了安装Docker配置阿里云镜像加速,具有一定的参考价值,感兴趣的可以了解一下
    2022-04-04
  • docker如何运行一个python脚本

    docker如何运行一个python脚本

    这篇文章主要介绍了docker如何运行一个python脚本问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • 关于docker启动jenkins环境的问题

    关于docker启动jenkins环境的问题

    这篇文章主要介绍了docker启动jenkins环境的问题,文中提到了jenkins基本工作原理及管理员密码获取方法,对docker启动jenkins环境相关知识感兴趣的朋友一起看看吧
    2022-04-04
  • 3分钟带你学会docker搭建帕鲁服务器

    3分钟带你学会docker搭建帕鲁服务器

    幻兽帕鲁已经正式开服,目前在线人数已经超过7W+,很多玩家想自己创建服务器和朋友一起联机游玩,本文主要介绍了3分钟带你学会docker搭建帕鲁服务器,具有一定的参考价值,感兴趣的可以了解一下
    2024-01-01
  • k8s部署docker容器的实现

    k8s部署docker容器的实现

    这篇文章主要介绍了k8s部署docker容器的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-06-06
  • docker中安装elasticsarch 等镜像的过程

    docker中安装elasticsarch 等镜像的过程

    这篇文章主要介绍了docker中安装elasticsarch 等镜像,本文结合示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-12-12
  • docker容器配置启动参数

    docker容器配置启动参数

    通过添加参数,我们可以在启动 Docker 容器时灵活地配置容器的行为,本文介绍了通过命令行和 Dockerfile 两种方式添加参数的方法,并给出了常用参数的示例,希望本文能帮助您理解如何在 Docker 启动时添加参数,并正确地配置和管理 Docker容器
    2023-10-10
  • 常用的Docker基本命令及用法汇总

    常用的Docker基本命令及用法汇总

    Docker是一个用了一种新颖方式实现的超轻量虚拟机,在实现的原理和应用上还是和VM有巨大差别,专业的叫法是应用容器(Application Container)。今天给大家汇总介绍15个常用的docker命令以及用法
    2016-11-11

最新评论