Docker管理控制相关资源
一台宿主机可以放多个容器,默认的情况下,Docker
没有对容器进行硬件资源的限制,当容器负载过高时会尽可能的占用宿主机资源,所以有时候我们需要对容器的资源使用设置一个上限,这里就需要管理 Docker 使用的资源。真正可以控制的只有内存和CPU。
查看宿主机资源使用情况
Docker 使用 cgroups
归类运行在容器中的进程,这就使得我们可以管理一组进程使用的资源。运行 systemd-cgls
命令 就可以查看 cgroups
树 :
├─ /usr/lib/systemd/systemd --switched-root --system --deserialize
├─docker
│ ├─93d5ecbdf58ff840f737c41adff9d0f9506aac036a1fd2f0c3f31edf696ce7f1
│ │ ├─ mysqld
│ │ ├─ bash
│ │ └─ mysql -uroot -px xxxx
│ ├─b1f53779101af8778ba8e8dfd0946a84e8c69b3d8b0b35cd8753c46d966ffba5
│ │ ├─ mysqld
│ │ ├─ bash
│ │ └─ mysql -uroot -px xxxx
│ └─57aff029f6c65c6bbe0edcb3f9b61b4c3a6253bd1093d2dfc8ec318dd2cc4b9b
│ ├─ mysqld
│ ├─ bash
│ └─ mysql -uroot -px xxxx
......
使用 systemd-cgtop
命令可以看到使用最多资源的进程。
一、CPU
默认情况下,每一个容器可以使用宿主机上的所有 CPU 资源,但大多数系统使用的资源调度算法是CFS
(完全公平调度器),它公平调度每一个工作进程。进程分CPU密集型
和IO密集型
两类。系统内核会实时监测系统进程,当某个进程占用 CPU 资源时间过长时,内核会调整该进程的优先级。
参数
参数名 | 作用 |
---|---|
--cpu-share | cpu资源提供给一组容器使用,组内的容器按比例使用cpu资源,当容器处于空闲状态时,cpu资源被负载大的容器占用,(按压缩方式比例分配),当空闲进行运行起来时,cpu资源会被分配到其他容器 |
--cpus= value | 指定 cpu的核心数量 |
--cpuset-cpus | 指定容器只能运行在哪个cpu核心上(绑定cpu);核心使用0,1,2,3编号; |
–cpu-share | 随机指定cpu |
实例:
docker run -di --name=os --cpus= centos:latest bash
二、设置内存
默认情况下,docker 并没有对容器内存进行限制,也就是说容器可以使用主机提供的所有内存。这当然是非常危险的事情,如果某个容器运行了恶意的内存消耗软件,或者代码有内存泄露,很可能会导致主机内存耗尽,因此导致服务不可用。对于这种情况,docker 会设置 docker daemon 的 OOM(out of memory) 值,使其在内存不足的时候被杀死的优先级降低。另外,就是你可以为每个容器设置内存使用的上限,一旦超过这个上限,容器会被杀死,而不是耗尽主机的内存。
限制内存上限虽然能保护主机,但是也可能会伤害到容器里的服务。如果为服务设置的内存上限太小,会导致服务还在正常工作的时候就被 OOM 杀死;如果设置的过大,会因为调度器算法浪费内存。因此,合理的做法包括:
- 为应用做内存压力测试,理解正常业务需求下使用的内存情况,然后才能进入生产环境使用
- 一定要限制容器的内存使用上限
- 尽量保证主机的资源充足,一旦通过监控发现资源不足,就进行扩容或者对容器进行迁移
- 如果可以(内存资源充足的情况),尽量不要使用 swap,swap 的使用会导致内存计算复杂,对调度器非常不友好
docker 限制容器内存使用量
在 docker 启动参数中,和内存限制有关的包括(参数的值一般是内存大小,也就是一个正数,后面跟着内存单位 b
、k
、m
、g
,分别对应 bytes、KB、MB、和 GB):
参数 | 作用 |
---|---|
-m 或 --memory |
容器能使用的最大内存大小,最小值为 4m |
--memory-swap | 容器能够使用的 swap 大小 |
--memory-swappiness | 默认情况下,主机可以把容器使用的匿名页(anonymous page)swap 出来,你可以设置一个 0-100 之间的值,代表允许 swap 出来的比例 |
--memory-reservation | 设置一个内存使用的 soft limit,如果 docker 发现主机内存不足,会执行 OOM 操作。这个值必须小于 --memory 设置的值 |
--kernel-memory | 容器能够使用的 kernel memory 大小,最小值为 4m。 |
--oom-kill-disable | 是否运行 OOM 的时候杀死容器。只有设置了 -m ,才可以把这个选项设置为 false,否则容器会耗尽主机内存,而且导致主机应用被杀死 |
关于 --memory-swap
的设置必须解释一下,--memory-swap
必须在 --memory
也配置的情况下才能有用。
- 如果
--memory-swap
的值大于--memory
,那么容器能使用的总内存(内存 + swap)为--memory-swap
的值,能使用的 swap 值为--memory-swap
减去--memory
的值 - 如果
--memory-swap
为 0,或者和--memory
的值相同,那么容器能使用两倍于内存的 swap 大小,如果--memory
对应的值是200M
,那么容器可以使用400M
swap - 如果
--memory-swap
的值为 -1,那么不限制 swap 的使用,也就是说主机有多少 swap,容器都可以使用
实例:
docker run -di --name=os -m=1g centos:latest bash
三、测试
1) 安装 Docker 容器
$ docker pull centos:latest
2) 运行容器并指定CPU 和内存
$ docker run -di --name=os --cpus=0.2 -m=512MB centos:latest bash
3) 进入容器并安装压测工具
$ docker exec -it os bash $ yum install wget gcc gcc-c++ make -y
$ yum install -y epel-release
$ yum install stress -y
4) 压测前观察 Docker 资源使用情况
$ docker stats
5) 压测CPU
stress --cpu --timeout
增加2个 CPU 进程,处理 sqrt()
函数函数,以提高系统CPU负荷,测试600S
6) 观察 Docker 资源使用情况
$ docker stats
可以看到容器 CPU 基本上不能彪到 20%以上了。
7)压测内存
$ stress --vm --vm-bytes 1g --timeout
新增1个 IO 进程,内存大小为 1G,发现进程直接被 kill 掉了
Docker管理控制相关资源的更多相关文章
- Docker运行时资源限制
Docker 运行时资源限制Docker 基于 Linux 内核提供的 cgroups 功能,可以限制容器在运行时使用到的资源,比如内存.CPU.块 I/O.网络等. 内存限制概述Docker 提供的 ...
- iOS之在写一个iOS应用之前必须做的7件事(附相关资源)
本文由CocoaChina--不再犹豫(tao200610704@126.com)翻译 作者:@NIkant Vohra 原文:7 Things you must absolutely do befo ...
- 《玩转D语言系列》二、D语言现状、基本规定和相关资源介绍
这算是本系列文章的一个序吧,主要是为以后的学习做铺垫,文本分为三个部分,第一部分是对于网上一些比较旧的资料的问题的一些更正,当然我也不可能看过所有的资料,难免会有遗漏.第二部分是D语言最基本的规定,第 ...
- AngularJS的学习网站及相关资源整理
学习angularjs的网站及相关资源的整理,会不断更新. angularJs的官网:https://angularjs.org/ API文档:https://docs.angularjs ...
- ArcGis 在线地图相关资源
原文:ArcGis 在线地图相关资源 世界边界和地点:http://services.arcgisonline.com/ArcGIS/rest/services/Reference/World_Bou ...
- (原)Struts 相关资源下载
官网:http://struts.apache.org 点击[Download],进入页面如下,可以看到下载的资源: 点击[struts-2.3.20-all.zip],就能获取Struts2项目所有 ...
- C++相关资源
http://www.cnblogs.com/xi52qian/p/4186983.html语言ISO/IEC JTC1/SC22/WG21 - The C++ Standards Committee ...
- NLP相关资源
一 NLP相关资源站点 Rouchester大学NLP/CL会议列表 一个非常好的会议时间信息网站,将自然语言处理和计算语言学领域的会议,按照时间月份顺序列出. NLPerJP 一个日本友好人士维护的 ...
- 转载——web前端相关资源总结
前端牛人博客:张克军.阮一峰.拔赤(李晶).拔赤(李晶)2.张鑫旭.梦想天空.阿当.泽飞.刘杰(嗷嗷).为之漫笔(李松峰).goddyzhao.hax的技术部落.周爱民.随网之舞.子鼠.司徒正美.ju ...
随机推荐
- centos 启动 oracle
source .bash_profile su - oracle //切换到自己的oracle账户 lsnrctl start //启动oracle监听 sqlplus /nolog //登录 ...
- jmeter 测试带token的请求
https://blog.csdn.net/wd1282988143/article/details/88048114 如果有一个登录接口需要服务端返回参数,再带着这个参数去请求才能完成登录,请问jm ...
- 20180516模拟赛T1——queen
题解 这题显然是\(总方案数不可行方案数总方案数-不可行方案数\)(直接算是无规则的).总方案数是\(n^2m^2\),于是问题就在于不可行的方案数. 若queen落在一个点上,则横竖是十分好求的(\ ...
- python基础语法11 内置模块time,datatime,random,os,sys,hashlib模块
time模块 在python的三种时间表现形式: 1.时间戳: 给电脑看的. - 自1970-01-01 00:00:00到当前时间,按秒计算,计算了多少秒. 2.格式化时间(Format Strin ...
- Mysql五大约束
Mysql五大约束 约束:对表中数据的限制.保证表中数据的准确和可靠 (1)NOT NULL:非空,用于保证该字段的值不能为空 (2)DEFAULT:默认,用于保证该字段有默认值(3)PRIMARY ...
- signed Unsigned Compare
// signUnsignCompare.cpp : Defines the entry point for the console application. // #include "st ...
- CAN通信帧ID的含义解析? (转载)
https://www.cnblogs.com/isAndyWu/p/10298695.html这个文章解答了我的一个id使用的疑惑,因此谢谢作者,转载. CAN总线ID是包含在报文帧中的. 1.主要 ...
- @EnableFeignClients 客户端详细
在Spring cloud应用中,当我们要使用feign客户端时,一般要做以下三件事情 : 1.使用注解@EnableFeignClients启用feign客户端: 示例 : @SpringBootA ...
- jupyter的补充
目录 jupyter 的使用 常用命令模式快捷键: 常用编辑模式快捷键: jupyter 的使用 Cells状态分为命令模式和编辑模式,Enter进入编辑模式,ESC进入命令模式,命令模式和编辑模式下 ...
- 你向 Mysql 数据库插入 100w 条数据用了多久?
阅读本文大概需要 2 分钟. ▌目录 多线程插入(单表) 多线程插入(多表) 预处理 SQL 多值插入 SQL 事务( N 条提交一次) ▌多线程插入(单表) 问:为何对同一个表的插入多线程会比单线程 ...