第 4 章 容器 - 027 - 限制容器对内存的使用

限制容器对内存的使用

一个 docker host 上会运行若干容器,每个容器都需要 CPU、内存和 IO 资源。

对于 KVM,VMware 等虚拟化技术,用户可以控制分配多少 CPU、内存资源给每个虚拟机。

对于容器,Docker 也提供了类似的机制避免某个容器因占用太多资源而影响其他容器乃至整个 host 的性能。

内存限额

容器可使用的内存包括两部分:

  • 物理内存
  • swap

Docker 通过下面两组参数来控制容器内存的使用量。

  • -m 或 --memory:设置内存的使用限额,例如 100M, 2G。
  • --memory-swap:设置 内存+swap 的使用限额。

举例:

docker run -m 200M --memory-swap=300M ubuntu
  • 允许该容器最多使用 200M 的内存和 100M 的 swap。
  • 默认情况下,上面两组参数为 -1,即对容器内存和 swap 的使用没有限制。

  注:progrium/stress 镜像可用于对容器执行压力测试。

  • --vm 1:启动 1 个内存工作线程。
  • --vm-bytes 280M:每个线程分配 280M 内存。
 1 [email protected]:~# docker run -it -m 200M --memory-swap=300M progrium/stress --vm 1 --vm-bytes 280M
 2 Unable to find image ‘progrium/stress:latest‘ locally
 3 latest: Pulling from progrium/stress
 4 a3ed95caeb02: Pull complete
 5 871c32dbbb53: Pull complete
 6 dbe7819a64dd: Pull complete
 7 d14088925c6e: Pull complete
 8 58026d51efe4: Pull complete
 9 7d04a4fe1405: Pull complete
10 1775fca35fb6: Pull complete
11 5c319e267908: Pull complete
12 Digest: sha256:e34d56d60f5caae79333cee395aae93b74791d50e3841986420d23c2ee4697bf
13 Status: Downloaded newer image for progrium/stress:latest
14 WARNING: Your kernel does not support swap limit capabilities or the cgroup is not mounted. Memory limited without swap.
15 stress: info: [1] dispatching hogs: 0 cpu, 0 io, 1 vm, 0 hdd
16 stress: dbug: [1] using backoff sleep of 3000us
17 stress: dbug: [1] --> hogvm worker 1 [6] forked
18 stress: dbug: [6] allocating 293601280 bytes ...
19 stress: dbug: [6] touching bytes in strides of 4096 bytes ...
20 stress: dbug: [6] freed 293601280 bytes
21 stress: dbug: [6] allocating 293601280 bytes ...
22 stress: dbug: [6] touching bytes in strides of 4096 bytes ...
23 stress: dbug: [6] freed 293601280 bytes
24 stress: dbug: [6] allocating 293601280 bytes ...
25 stress: dbug: [6] touching bytes in strides of 4096 bytes ...
26 stress: dbug: [6] freed 293601280 bytes
27 stress: dbug: [6] allocating 293601280 bytes ...
  1. 分配 280M 内存。
  2. 释放 280M 内存。
  3. 再分配 280M 内存。
  4. 再释放 280M 内存。
  5. 一直循环......

如果让工作线程分配的内存超过 300M,结果如下:

 1 [email protected]:~# docker run -it -m 200M --memory-swap=300M progrium/stress --vm 1 --vm-bytes 380M
 2 WARNING: Your kernel does not support swap limit capabilities or the cgroup is not mounted. Memory limited without swap.
 3 stress: info: [1] dispatching hogs: 0 cpu, 0 io, 1 vm, 0 hdd
 4 stress: dbug: [1] using backoff sleep of 3000us
 5 stress: dbug: [1] --> hogvm worker 1 [6] forked
 6 stress: dbug: [6] allocating 398458880 bytes ...
 7 stress: dbug: [6] touching bytes in strides of 4096 bytes ...
 8 stress: dbug: [6] freed 398458880 bytes
 9 stress: dbug: [6] allocating 398458880 bytes ...
10 stress: dbug: [6] touching bytes in strides of 4096 bytes ...
11 stress: dbug: [6] freed 398458880 bytes
12 stress: dbug: [6] allocating 398458880 bytes ...
13 stress: dbug: [6] touching bytes in strides of 4096 bytes ...
14 stress: dbug: [6] freed 398458880 bytes
15 stress: dbug: [6] allocating 398458880 bytes ...
  • 分配的内存超过限额,stress 线程报错,容器退出。

ps:docker host 未设置swap 则不支持限制内存swap 

如果在启动容器时只指定 -m 而不指定 --memory-swap,那么 --memory-swap 默认为 -m 的两倍

比如:docker run -it -m 200M ubuntu  容器最多使用 200M 物理内存和 200M swap。

--------------引用来自---------------

https://mp.weixin.qq.com/s?__biz=MzIwMTM5MjUwMg==&mid=2653587660&idx=1&sn=9b2b36c378026cad974913e537e84aa4&chksm=8d3080d5ba4709c3b0efa550c89e511099a913746dc5d6ac3d38e925dd7663dac4f6d692c691&scene=21#wechat_redirect

原文地址:https://www.cnblogs.com/gsophy/p/10306789.html

时间: 2024-11-07 20:50:23

第 4 章 容器 - 027 - 限制容器对内存的使用的相关文章

第14章 multimap多重映照容器

/* 第14章 multimap多重映照容器 14.1 multimap技术原理 14.2 multimap应用基础 14.3 本章小结 */ // 第14章 multimap多重映照容器 // 14.1 multimap技术原理 ------------------------------------------------------------------------------ // 14.2 multimap应用基础 ----------------------------------

第12章 multiset多重集合容器

/* 第12章 multiset多重集合容器 12.1 multiset技术原理 12.2 multiset应用基础 12.3 本章小结 */ // 第12章 multiset多重集合容器 // 12.1 multiset技术原理 ---------------------------------------------------------------------------- // 12.2 multiset应用基础 ------------------------------------

第 4 章 容器 - 030 - 实现容器的底层技术

实现容器的底层技术 cgroup 和 namespace 是最重要的两种技术. cgroup 实现资源限额 namespace 实现资源隔离 cgroup cgroup 全称 Control Group. Linux 操作系统通过 cgroup 可以设置进程使用 CPU.内存 和 IO 资源的限额. 前面我们看到的--cpu-shares.-m.--device-write-bps 实际上就是在配置 cgroup. cgroup 存在 /sys/fs/cgroup 文件中. 举个例子:启动一个容

第七章 端口映射与容器互联

7.1 端口映射实现访问容器 7.1.1 从外部访问容器应用 在启动容器的时候,如果不指定对应的参数,在容器外部是无法通过网络来访问容器内的网络应用和服务的. 当容器中运行一些网络应用,要让外部访问这些应用时,可以通过-P或-p参数来指定端口映射.当使用-P标记时,Docker会随机映射一个端口到内部容器开放的网络端口: [[email protected] ~]# docker run -d -P training/webapp python app.py f48059b82c2cbf0109

第五章 云原生与容器技术

第一节 独角兽成功秘诀 成功秘诀 ·Speed of innovation-天下武功,唯快不破 ·Always-available services-随时.随地可用 ·Web scale-从0到1,快速扩展 ·Mobile-centric user experiences-移动为王又快又好! 第二节 云原生和现代应用12范式 现代应用的十二范式(The Twelve-Factor App) 1.基准代码:一份基准代码,多份部署.基准代码和应用之间总是保持一一对应的关系.所有部署的基准代码相同,但

第十三篇:multimap容器和multiset容器中的find操作

前言 multimap容器是map容器的“ 增强版 ”,它允许一个键对应多个值.对于map容器来说,find函数将会返回第一个键值匹配元素所在处的迭代器.那么对于multimap容器来说,find函数将如何运作呢?如果要实现和map容器的find函数同样的功能,则它将返回多个迭代器,这样太复杂了.本文将讲解C++中multimap容器的“ find实现 ”. 解决思路一 摒弃find函数,使用另外两个新函数,它们是专家们为了解决multimap中的“ find操作 ”问题专门设计的: 1. lo

web容器与servlet容器

1. web容器好比   电视机 servlet容器好比   VCD 没有VCD你可以看电视,对吧,但是有了VCD没有电视机,你从哪看起?:) 没有servlet容器,你也可以用web容器直接访问静态页面,比如安装一个apache等,但是如果要显示jsp/servlet,你就要安装一个  servlet容器了,但是光有servlet容器是不够的,因为它要被解析成html输出,所以你仍需要一个web容器. 大多数servlet容器同时提供了web容器的功能,也就是说大多servelt可以独立运行你

STL之vector,数组线性容器array,list容器,算法find,find_if,bind1st,仿函数

 1.STL(Standard Template Library,是用泛型技术来设计完成的实例)的概念与组成 Iterator(迭代器) Container(容器) Algorithm(算法) Adaptors(配接器) STL的六大组件分别是: 容器(Container) 算法(Algorithm) 迭代器(Iterator) 仿函数(Function object) 适配器(Adapter) 空间配置器(allocator):只能分配内存等 2.容器与算法 案例如下: #include<

C++之容器(关联容器)

C++之容器(关联容器) 关联容器和顺序容器的本质区别:关联容器是通过键存取和读取元素.顺序容器通过元素在容器中的位置顺序存储和访问元素.因此,关联容器不提供front.push_front.pop_front.back.push_back以及pop_back,此外对于关联容器不能通过容器大小来定义,因为这样的话将无法知道键所对应的值什么. 两个基本的关联容器类型是map和set.map的元素以键-值对的形式组织:键用作元素在map的索引,而值则表示所存储和读取的数据.set仅包含一个键,并有效