Docker资源管理
一台宿主机可以放多个容器,默认的情况下,
Docker
没有对容器进行硬件资源的限制,当容器负载过高时会尽可能的占用宿主机资源,所以有时候我们需要对容器的资源使用设置一个上限,今天我们就来看看如何管理 Docker 使用的资源。真正可以控制的只有内存和CPU
查看宿主机资源使用情况
Docker 使用 cgroups
归类运行在容器中的进程,这就使得我们可以管理一组进程使用的资源。运行 systemd-cgls
命令 就可以查看 cgroups
树 :
├─1 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
├─docker
│ ├─93d5ecbdf58ff840f737c41adff9d0f9506aac036a1fd2f0c3f31edf696ce7f1
│ │ ├─24291 mysqld
│ │ ├─29404 bash
│ │ └─29480 mysql -uroot -px xxxx
│ ├─b1f53779101af8778ba8e8dfd0946a84e8c69b3d8b0b35cd8753c46d966ffba5
│ │ ├─23893 mysqld
│ │ ├─25112 bash
│ │ └─28740 mysql -uroot -px xxxx
│ └─57aff029f6c65c6bbe0edcb3f9b61b4c3a6253bd1093d2dfc8ec318dd2cc4b9b
│ ├─23667 mysqld
│ ├─24709 bash
│ └─29649 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=2 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
测试
- 安装 Docker 容器
[root@VM_0_15_centos ~]# docker pull centos:latest
- 运行容器并指定CPU 和内存
[root@VM_0_15_centos ~]# docker run -di --name=os --cpus=0.3 -m=512MB centos:latest bash
- 进入容器并安装压测工具
[root@VM_0_15_centos ~]# docker exec -it os bash
[root@7a1de35f8a52 /]# yum install wget gcc gcc-c++ make -y
[root@7a1de35f8a52 /]# yum install -y epel-release
[root@7a1de35f8a52 /]# yum install stress -y
- 压测前观察 Docker 资源使用情况
docker stats
- 压测CPU
stress --cpu 2 --timeout 600
增加2个 CPU 进程,处理 sqrt()
函数函数,以提高系统CPU负荷,测试600S
- 观察 Docker 资源使用情况
docker stats
可以看到容器 CPU 基本上不能彪到 30%以上了。
7)压测内存
[root@ef431fea0e9e /]# stress --vm 1 --vm-bytes 1g --timeout 600
新增1个 IO 进程,内存大小为 1G,发现进程直接被 kill 掉了
stress: info: [162] dispatching hogs: 0 cpu, 0 io, 1 vm, 0 hdd
stress: FAIL: [162] (415) <-- worker 163 got signal 9
stress: WARN: [162] (417) now reaping child worker processes
stress: FAIL: [162] (451) failed run completed in 1s
Docker资源管理的更多相关文章
- Docker资源管理探秘:Docker背后的内核Cgroups机制
http://www.infoq.com/cn/articles/docker-resource-management-cgroups 随着Docker技术被越来越多的个人.企业所接受,其用途也越来越 ...
- Docker容器资源管理
本文作者是Red Hat的软件工程师 - Marek Goldmann,这篇文章详细介绍了Docker容器的资源管理,总共分了三大部分:CPU.内存以及磁盘IO.作者通过实践举例给读者勾勒出一幅清晰明 ...
- Docker资源限制实现——cgroup
摘要 随着Docker技术被越来越多的个人.企业所接受,其用途也越来越广泛.Docker资源管理包含对CPU.内存.IO等资源的限制,但大部分Docker使用者在使用资源管理接口时往往还比较模糊. 本 ...
- Docker - Docker 镜像 简介
概述 简单介绍一下 docker 镜像的概念 1. 背景 复习 docker 镜像是 docker 最基础, 最重要的概念之一 所以正式使用之前, 最好有所理解和认识 2. 镜像 概述 简单描述 理解 ...
- Docker进阶-资源管理Swarm+Portainer
Docker Swarm资源管理 Docker Swarm是Docker官方三剑客项目之一,提供Docker容器集群服务,是Docker官方对容器云生态进行支持的核心方案. 使用它,用户可以将多个Do ...
- Docker Swarm 资源管理
Docker Swarm Docker Swarm是Docker官方项目之一,是使用SwarmKit构建的Docker引擎内置的集群管理和编排工具,提供Docker容器集群服务,是Docker官方对容 ...
- 03 . Docker数据资源管理与网络
Docker数据卷 在容器中管理数据主要有两种方式 # 数据卷(Data volumes) # 数据卷容器(Data volume containers) # 数据卷是一个可供一个或多个容器使用的特殊 ...
- 微服务与Docker介绍
什么是微服务 微服务应用的一个最大的优点是,它们往往比传统的应用程序更有效地利用计算资源.这是因为它们通过扩展组件来处理功能瓶颈问题.这样一来,开发人员只需要为额外的组件部署计算资源,而不需要部署一个 ...
- 来自沪江、滴滴、蘑菇街架构师的 Docker 实践分享
架构师小组交流会是由国内知名公司架构师参与的技术交流会,每期选择一个时下最热门的技术话题进行实践经验分享. Docker 作为当前最具颠覆性的开源技术之一,其轻量虚拟化.可移植性是 CI/CD.Dev ...
随机推荐
- 关于keil警告/错误问题的解释和修正
- 版权声明:本文为博主 **乔勇刚-** 一字一句敲出来的原创作品,未经博主允许不得转载,多谢支持.- 本系列博客仅做经验交流分享,不能用作任何商业用途.本文中如有不足之处,请您留言,本人将及时更改 ...
- JavaScript数据结构——集合的实现与应用
与数学中的集合概念类似,集合由一组无序的元素组成,且集合中的每个元素都是唯一存在的.可以回顾一下中学数学中集合的概念,我们这里所要定义的集合也具有空集(即集合的内容为空).交集.并集.差集.子集的特性 ...
- 两份简单的logstash配置
input{http{port=>7474}} filter{ grok{ match =>{ #"message" => "%{COMBINEDAPA ...
- iview中page组件的跳转功能BUG解决方案
xl_echo编辑整理,欢迎转载,转载请声明文章来源.欢迎添加echo微信(微信号:t2421499075)交流学习. 百战不败,依不自称常胜,百败不颓,依能奋力前行.--这才是真正的堪称强大!! 在 ...
- Python中input()的使用方法
input()以字符串的方式获取用户输入: >>> x = input() 4.5 >>> type(x) <class 'str'> >> ...
- Go和Python学习计划
计划虽然不一定能实现,但还是要有的,万一实现了呢. 一.学习Go 1.先看尚雪谷https://www.bilibili.com/video/av48141461/?p=12的go语言全套,把基础的过 ...
- gRPC【RPC自定义http2.0协议传输】
gRPC 简介 gRPC是由Google公司开源的高性能RPC框架. gRPC支持多语言 gRPC原生使用C.Java.Go进行了三种实现,而C语言实现的版本进行封装后又支持C++.C#.Node.O ...
- eclipse插件——maven
项目开发中遇到的问题 都是同样的代码,为什么在我的机器上可以编译执行,而在他的机器上就不行? 为什么在我的机器上可以正常打包,而配置管理员却打不出来? 项目组加入了新的人员,我要给他说明编译环境如何设 ...
- AOSP 预置 APP
Android 系统预置 APP 是做 Framework 应用开发经常经常会遇到的工作,预置 APP 分为两种,一种是直接预置 APK,一种是预置带有源码的 APP. 预置 apk 示例说明 以 . ...
- Django2.2中间件详解
中间件是 Django 用来处理请求和响应的钩子框架.它是一个轻量级的.底层级的"插件"系统,用于全局性地控制Django 的输入或输出,可以理解为内置的app或者小框架. 在dj ...