Docker第八回(docker资源限制和验证)

一、docker资源限制

docker能够运行起来要依赖于内核中的两个特性,namespaces和CGroups。默认情况下,容器是没有任何资源限制的,因此它能够耗尽主机上内核能分配给该容器的所有资源。因此,为了防止一个容器的运行中耗尽主机所有的资源,就需要用到资源限制。而资源限制的一些功能特性需要linux 内核支持 Linux  Capabilities,在docker 1.13版本之前,只支持CFS schedule(Completely Fair Scheduler 完全公平调度器),之后的版本还支持realtime schedule

CFS schedule:每个进程都有优先级,非实时进程的优先级从100-139,CSF schedule是用来调度这些非实时进程的调度器,优先级高的进程会先被cpu执行

realtime schedule:实时进程调度器,进程的优先级从0-99,realtime schedule是专门调度实时进程的调度器

二、docker的memory、cpu资源限制参数

1、cpu限制

--cpus=<value>:指定一个容器可以使用多少可用cpu资源,如果是4核cpu,可以设置为1.5,那么该容器最多只能使用1.5核的cpu资源,如果没有设置--cpuset-cpus,那么可以使用的1.5核可以是任意一个核心的资源。此选项只能在docker1.3以上版本中使用

--cpu-shares:为容器按比例分配cpu资源,如果其他容器的cpu资源是空闲,那么容器1如果需要,将会使用所有cpu的资源,且将任务分配到任意核心处理

--cpuset-cpus:为容器指定可以使用的cpu核心是哪个,如果cpu是4和,那么按照编号0-3区分每一个核心,此参数设置为0,1即表示可以使用cpu的第一个和第二个核心。

2、memory以及swap限制

--memory=<value>:为容器指定最多可以使用多少内存,如果一个进程使用的内存超过了限制,那么可能会被kill掉

--memory-swap:为容器指定最多可以使用多少swap空间,此选项必须要在使用了--memory参数的前提下才能使用,如果没有设置--memory参数,那么这个参数不会生效

-- memory-swappiness:设置容器使用swap的倾向性有多大,0-100。

-- memory-reservation:容器使用内存的软限制,这个指一定要设置的比--memory小,当系统内存紧张时,会回收掉此容器的memory值-reservation值的内存,让容器的内存使用降到reservation的标准

--oom-kill-disable:当容器内进程发生oom时,是否杀掉该容器

三、使用压测工具进行测试

[[email protected] ~]# docker pull lorel/docker-stress-ng
Using default tag: latest
latest: Pulling from lorel/docker-stress-ng
c52e3ed763ff: Pull complete
a3ed95caeb02: Pull complete
7f831269c70e: Pull complete
Digest: sha256:c8776b750869e274b340f8e8eb9a7d8fb2472edd5b25ff5b7d55728bca681322
Status: Downloaded newer image for lorel/docker-stress-ng:latest

1、测试内存

1.1、不限制cpu使用

[[email protected] ~]# docker container run --name stress -it --rm lorel/docker-stress-ng:latest  --cpu 8
stress-ng: info: [1] defaulting to a 86400 second run per stressor
stress-ng: info: [1] dispatching hogs: 8 cpu

[[email protected] ~]# docker stats
CONTAINER ID        NAME                CPU %               MEM USAGE / LIMIT     MEM %               NET I/O             BLOCK I/O           PIDS
92b0b8d916c1        stress              101.54%             15.81MiB / 983.3MiB   1.61%               648B / 0B           0B / 0B             9

[[email protected] ~]# top
top - 19:15:49 up 2 days,  2:38,  2 users,  load average: 7.02, 3.00, 1.15
Tasks: 131 total,  10 running, 121 sleeping,   0 stopped,   0 zombie
%Cpu(s): 99.7 us,  0.3 sy,  0.0 ni,  0.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  1006892 total,   100680 free,   320704 used,   585508 buff/cache
KiB Swap:  2097148 total,  2096628 free,      520 used.   422732 avail Mem 

  PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND
40035 root      20   0    6908   4180    252 R 12.6  0.4   0:12.79 stress-ng-cpu
40037 root      20   0    6908   4180    252 R 12.6  0.4   0:12.78 stress-ng-cpu
40038 root      20   0    6908   2136    252 R 12.6  0.2   0:12.78 stress-ng-cpu
40040 root      20   0    6908   2136    252 R 12.6  0.2   0:12.78 stress-ng-cpu
40036 root      20   0    6908   2136    252 R 12.3  0.2   0:12.77 stress-ng-cpu
40039 root      20   0    6908   2136    252 R 12.3  0.2   0:12.78 stress-ng-cpu
40041 root      20   0    6908   4180    252 R 12.3  0.4   0:12.77 stress-ng-cpu
40042 root      20   0    6908   2136    252 R 12.3  0.2   0:12.77 stress-ng-cpu
    1 root      20   0  128484   7208   4196 S  0.0  0.7   0:10.12 systemd

可以看到,cpu使用已经满了

1.2、重新启动容器加入内存限制参数

[[email protected] ~]# docker container run --name stress --cpus=0.5 -it --rm lorel/docker-stress-ng:latest  --cpu 8
stress-ng: info: [1] defaulting to a 86400 second run per stressor
stress-ng: info: [1] dispatching hogs: 8 cpu

[[email protected] ~]# docker stats
CONTAINER ID        NAME                CPU %               MEM USAGE / LIMIT     MEM %               NET I/O             BLOCK I/O           PIDS
845220ef9982        stress              51.57%              20.05MiB / 983.3MiB   2.04%               648B / 0B           0B / 0B             9

设置的参数生效

2、测试内存

2.1、不限制内存使用,压测指定了2个内存,每个128m

[[email protected] ~]# docker container run --name stress -it --rm lorel/docker-stress-ng:latest  --vm 2 --vm-bytes 128m
stress-ng: info: [1] defaulting to a 86400 second run per stressor
stress-ng: info: [1] dispatching hogs: 2 vm

[[email protected] ~]# docker stats
CONTAINER ID        NAME                CPU %               MEM USAGE / LIMIT     MEM %               NET I/O             BLOCK I/O           PIDS
beb3cfa10748        stress              99.29%              256.2MiB / 983.3MiB   26.05%              648B / 0B           0B / 0B             5

而实际使用了256M内存

2.2、重新启动容器,加入内存限制

--memory限制容器只能使用128m内存

[[email protected] ~]# docker container run --name stress -it --memory=128m --rm lorel/docker-stress-ng:latest  --vm 2 --vm-bytes 128m
stress-ng: info: [1] defaulting to a 86400 second run per stressor
stress-ng: info: [1] dispatching hogs: 2 vm

[[email protected] ~]# docker stats
CONTAINER ID        NAME                CPU %               MEM USAGE / LIMIT   MEM %               NET I/O             BLOCK I/O           PIDS
decee18cb471        stress              99.47%              126.4MiB / 128MiB   98.77%              648B / 0B           3.19MB / 461MB      5

 

原文地址:https://www.cnblogs.com/baomaggie/p/11622769.html

时间: 2024-10-04 10:52:05

Docker第八回(docker资源限制和验证)的相关文章

docker 实践八:docker swarm

介绍了 docker 三剑客中的 docker-machine 和 docker-compose 之后,就剩下一个 docker swarm 了.那本篇的主角就是它了. 注:环境为 CentOS7,docker 19.03. docker-compose 为用户提供单节点中多容器的创建,docker-machine 让用户管理不同的 docker 环境.而 docker swarm 则帮助用户实现 docker 的集群管理.从单机走向集群. Swarm 的简介 Swarm 的前身是Beam项目和

Docker容器CPU、memory资源限制

背景 在使用 docker 运行容器时,默认的情况下,docker没有对容器进行硬件资源的限制,当一台主机上运行几百个容器,这些容器虽然互相隔离,但是底层却使用着相同的 CPU.内存和磁盘资源.如果不对容器使用的资源进行限制,那么容器之间会互相影响,小的来说会导致容器资源使用不公平:大的来说,可能会导致主机和集群资源耗尽,服务完全不可用. docker 作为容器的管理者,自然提供了控制容器资源的功能.正如使用内核的 namespace 来做容器之间的隔离,docker 也是通过内核的 cgrou

Docker学习总结(11)——八个Docker的真实应用场景

[编者的话]Flux 7介绍了常用的8个Docker的真实使用场景,分别是简化配置.代码流水线管理.提高开发效率.隔离应用.整合服务器.调试能力.多租户环境.快速部署.我们一直在谈Docker,Docker怎么使用,在怎么样的场合下使用?也许本文可以帮到你.有需要交流的地方,可以通过评论与我们交流. 几周前我们参加了DockerCon ,Dockercon是首个以Docker为中心的技术大会.它面向开发者以及对在Docker开放平台上构建.交付.运行分布式应用感兴趣的从业者,不论这些开放平台是运

八个Docker的真实应用场景

1.简化配置 这是Docker公司宣传的Docker的主要使用场景.虚拟机的最大好处是能在你的硬件设施上运行各种配置不一样的平台(软件.系统),Docker在降低额外开销的情况下提供了同样的功能.它能让你将运行环境和配置放在代码中然后部署,同一个Docker的配置可以在不同的环境中使用,这样就降低了硬件要求和应用环境之间耦合度. 2. 代码流水线(Code Pipeline)管理 前一个场景对于管理代码的流水线起到了很大的帮助.代码从开发者的机器到最终在生产环境上的部署,需要经过很多的中间环境.

Docker数据管理、网络通信以及资源控制

Docker的安装及镜像.容器的基本操作详见博客http://blog.51cto.com/11134648/2160257下面介绍Docker数据管理.网络通信以及资源控制的方法,详细如下: Doker数据管理 容器的数据管理操作可以方便查看容器内产生的数据或者将多个容器中的数据实现共享.管理Docker容器中数据主要有两种方式:数据卷(Data Volumes)和数据卷容器(Data Volumes Containers). 一.数据卷 数据卷是一个供容器使用的特殊目录,位于容器中,可将宿主

Docker系列-第八篇Docker常用安装

一.总体步骤 1.搜索镜像 2.拉取镜像 3.查看镜像 4.启动镜像 5.停止容器 6.移除容器 二.安装Tomcat 2.1 docker push方式安装tomcat https://hub.docker.com/_/tomcat docker hub上每个镜像怎么使用,都有对应的说明,这个说明对于每个镜像的安装和使用都很有帮助 2.1.1.docker hub上面查找tomcat镜像 2.1.2.从docker hub上拉取tomcat镜像到本地 2.1.3.docker images查看

【VMCloud云平台】拥抱Docker(八)Mesos入门

我们一直在说Docker是革命性的技术,那到底如何体现出它的革命性?就好像Hyper-V一样,单一的Hyper-V无非就是虚拟机,那如何利用System Center构造一套IaaS私有云就是重头戏了,而Docker,一个最适合作为PaaS的载体,要利用什么来构造它的重头戏呢? 今天开始,将以全新的视角来介绍Docker如何利用Mesos+Marathon来调度Docker,本篇涉及架构如下: 环境介绍: HostName IP Role CVM01 *.132 Master CVM02 *.2

Docker(八)用docker compose部署服务

用docker compose部署服务 docker compose可以方便我们快捷高效地管理容器的启动.停止.重启等操作,它类似linux下的shell脚本,基于yaml语法,在该文件里我们可以描述应用的架构,比如用什么镜像.数据卷.网络模式.监听端口等信息.我们可以在一个compose文件中定义一个多容器的应用,然后通过该compose来启动这个应用. 下载安装docker-compose # curl -L https://github.com/docker/compose/release

八、Docker 网络配置

Dokcer 通过使用 Linux 桥接提供容器之间的通信,docker0 桥接接口的目的就是方便 Docker 管理.当 Docker daemon 启动时需要做以下操作: 1)如果 docker0 不存在则创建 2)搜索一个与当前路由不冲突的 ip 段 3)在确定的范围中选择 ip 4)绑定 ip 到 docker0 8.1 Docker 四种网络模式 使用docker run创建Docker容器时,可以用--net选项指定容器的网络模式,Docker有以下 4 种网络模式: host模式,