容器内存相关知识

这篇文章是我研究容器内存整理出的相关内容. 前后内容并没有上下文关系, 每个知识点都可以单独查看.

内存控制

使用这样的命令启动一个容器docker run -d -m 300M xxx. 可以限制容器使用的内存最大为300M. 那么docker是如何实现容器的内存限制呢?

其实是操作系统已经做好了支持. Linux中实现容器的两大技术是:

  • namespace: 使用不同的命名空间实现资源的隔离. 包括:
    • PID: 进程隔离
    • Net: 网络环境隔离
    • VFS: 文件系统隔离
    • IPC: 进程通信隔离
    • 等等, 可查看维基百科
  • cgroups: 实现对进程资源的限制. 包括: cpu/内存/最大进程数量等等. 详情可查看官方文档

好, namespace实现了多个容器间不同进程的隔离, cgroups实现了对单个容器的资源限制. 就是这两个技术支撑了容器化的实现.

要查看一个进程的cgroups限制, 可查看文件/proc/<pid>/cgroup. 如果是一个容器进程, 你会看到类似于这样的内容:

...
10:memory:/docker/<docker_id>
9:cpuset:/docker/<docker_id>
8:blkio:/docker/<docker_id>
...

将限制指向了一个路径, 这个路径存放在/sys/fs/cgroup这里, 比如memory的限制路径为: /sys/fs/cgroup/memory/docker/<docker_id>. 在这里能够看到对此进程的所有内存限制. 其中每个文件的含义在官方文档中也有说明.

至于具体的原理, 这里不做深究.

这里额外说一点, /sys/fs/cgroup是一个树形结构, 子控制组的资源限制必定小于等于父控制组.

OOM Kill

如果一个进程的内存使用超过了限制, 会发生什么呢?

随便写一个脚本实验一下, 就会发现进程突然消失了, 被操作系统杀掉了.

使用docker inspect命令查看, 发现OOMKilled的值为true. 或者直接查看系统日志/sys/log/message也能够看到进程被杀掉的log.

Page Cache

我们可能会碰到这样奇怪的现象, 容器的内存限制为200M, 且已经使用200M内存, 此时再启动一个进程申请20M内存仍然成功, 且申请后总的内存仍然是200M.

造成这个奇怪现象的原因, 是因为在调用函数read读取文件的时候, 会将文件临时存放在内存中, 以加速后续读取. 我们使用free命令查看时, 其中的buff/cache就是文件的缓存, RSS则是实际使用的物理内存, VIRT则是进程申请的虚拟内存. 某个进程的具体内存分布可查看文件proc/<pid>/smaps.

容器RSSbuff/cache的和, 就是容器实际使用的物理内存总值. 应该与cgroup路径下的memory.usage_in_bytes值相同. (容器的内存分布也可以查看文件memory.stat)

这么一说, 这个奇怪的现象是不是就可以解释了? 当内存不足的时候, 系统会回收文件缓存以供进程使用.

交换内存

如果容器开启了交换内存, 你就会惊奇的发现, memory cgroup限制失效了. 容器申请了超过限制的内存仍然可以继续执行, 只不过部分内存被交换到磁盘上了.

如果同时又Page Cache和交换内存, 操作系统优先选择哪一个呢? 可以通过修改memory.swappiness的值来修改优先级, 其值为0-100, 值越大, 使用交换内存的概率越大. 当值为100时, 则Page Cache与叫换内存的概率相同. 官网介绍

不过一般启动容器的时候, 都是将swap关闭的, 应该没什么需要开启的场景吧.


还有一些内存相关的其他知识点, 大部分都可查看memory group的官方文档

原文地址: https://hujingnb.com/archives/865

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/508338.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

三星识别文字_比亚迪电子助力三星Galaxy Note 10系列霸气首发!

三星有子初长成气宇轩昂 秀美俊逸减之一分则嫌柔增之一分则嫌赘2019年8月7日于纽约巴克莱发布Galaxy Note 10系列用简约 重构美三星Galaxy Note 10与Galaxy Note 10分别搭载了6.3英寸和6.8英寸的超感官全视曲面屏&#xff0c;均采用单摄挖孔屏&#xff0c;开孔位于屏幕正上方。…

lisp 设计盘形齿轮铣刀_机械设计基础——周转轮系传动比的计算

点击上方蓝色字体&#xff0c;关注我们15(视频来源于网络&#xff0c;仅供学习交流&#xff0c;侵权请联系删除)机械计重点学习指导机械原理全书重点提要轴的结构改错机械设计作业集01机械设计作业集02机械设计作业集答案机械原理作业集机械原理作业集答案轴的强度计算院校推荐…

b+树阶怎么确定_B站公布年度弹幕,这个排名我不太服气

也忘记了是从什么时候开始&#xff0c;B站开始公布自己的年度弹幕了&#xff0c;今年的年度弹幕排名前五的分别是&#xff1a;爷青回、武汉加油、有内味了、双厨狂喜、禁止套娃。话说今年真的是不容易啊&#xff0c;过年那段时间以及上半年不会忘记那一幕幕感人深邃的瞬间&…

css打印适应纸张_从生态平衡到打印机故障分析

生态平衡(ecological equilibrium)是指在一定时间内生态系统中的生物和环境之间、生物各个种群之间&#xff0c;通过能量流动、物质循环和信息传递&#xff0c;使它们相互之间达到高度适应、协调和统一的状态。也就是说当生态系统处于平衡状态时&#xff0c;系统内各组成成分之…

html5调用系统声音1s响一次_20款奔驰GLC260提车改柏林之声音响,音乐诉请,为爱发声!...

奔驰GLC车型在2020上半年可谓是风生水起&#xff0c;尤其是2020年1-5月份的豪华品牌SUV排名中&#xff0c;奔驰GLC车型以58982的销售量遥遥领先&#xff0c;同比增长了2%&#xff0c;奔驰GLC5月销量高达15275辆&#xff0c;再次打败老对手奥迪Q5L&#xff0c;夺得豪华SUV销量冠…

js排序的时间复杂度_冒泡排序最好时间复杂度为什么是O

展开全部冒泡排序的基本思想是&#xff0c;对相邻的元素进行两两比较&#xff0c;顺序相反则进行交换&#xff0c;这样&#xff0c;每一趟会e68a8462616964757a686964616f31333433616161将最小或最大的元素“浮”到顶端&#xff0c;最终达到完全有序代码实现在冒泡排序的过程中…

kotlin将对象转换为map_将网站转换为Photoshop文档

WebToLayers是一款能够帮助大家将网页转换成图像格式的软件&#xff0c;能够Web页面转换成PNG&#xff0c;JPG以及PSD格式的图片。当网页转换为PSD的时候&#xff0c;网页的各个要素都会自动转换为相应的图层&#xff0c;使得大家能够对PSD格式的网页进行设计与管理。WebToLaye…

centos更换网卡后怎么更新配置_CentOS安装

服务器使用的Linux操作系统都使用了CentOS来进行安装&#xff0c;CentOS是一个开源的Linux发行版&#xff0c;具有很好的稳定性和更多的可扩展行。为了能够正常使用Docker&#xff0c;我们将使用CentOS7及以上版本。​下载地址&#xff1a;https://www.centos.org/download/ ​…

串口485接法图_rs485接口接线怎样操作?

展开全部RS485采用差分62616964757a686964616fe58685e5aeb931333365633939信号负逻辑&#xff0c;2V&#xff5e;6V表示“0”&#xff0c;- 6V&#xff5e;- 2V表示“1”。RS485有两线制和四线制两种接线&#xff0c;四线制是全双工通讯方式&#xff0c;两线制是半双工通讯方式…

centos普通用户修改文件权限_Linux实战014:Centos创建用户并添加root授权

刚收到在腾讯云申请的云服务器8台&#xff0c;现在准备分配给不同项目组来使用。为了确保系统及账号的安全&#xff0c;root账号不能直接给到他们。因为root的权限太大&#xff0c;任何的误操作就可能导致系统异常或者数据丢失找不回来。而且我们这是生产环境&#xff0c;账号会…

mongodb 导出txt_(干货)前端实现导出excel的功能

前言 导出功能其实在开发过程中是很常见的,平时我们做导出功能的时候基本都是后台生成&#xff0c;我们直接只需要调一支接口后台把生成的文件放到服务器或者数据库mongodb中,如果是放到mongodb中的话,我们需要从mongodb中通过唯一生成的id去拿到文件,最后window.location.href…

1971旗舰cpu intel_CPU的历史

很多人都对电脑硬件有一点的了解&#xff0c;本人也算略懂一二&#xff0c;所以今天来为大家说说电脑的主要硬件之一––CPU(中央处理器)。那么我们知道世界上造CPU的公司主要就是Intel和AMD。其实仔细想想&#xff0c;CPU的主要成分是什么?是硅(Si)&#xff0c;硅从那里来&am…

文本显示变量_【RPA课堂】UiPath中的变量、数据类型和组件

自动化出现的那一天起&#xff0c;就有了各种各样的工具来满足自动化的需要。无论是用于windows桌面自动化的简单工具&#xff0c;还是用于企业自动化大量任务的工具&#xff0c;它们都有自己的功能。UiPath就是这样的工具&#xff0c;在本文中&#xff0c;我们介绍一些非常基本…

linux挂载cifs磁盘_CentOS7.4_1708挂载CIFS报错

CentOS7.41708操作系统&#xff0c;Windows_Server2012做1TB的网络共享磁盘(没有域)。今天在项目做软件加密的部署&#xff0c;现场环境是Vsphere虚拟化需要用CIFS共享来传输文件、软件等。CRT、Putty等工具的传输工具无法传输字符集&#xff01;CentOS操作系统终端界面无任务信…

bootstrap上传图片可实现查看上一张图片和下一张图片_如何实现像人民日报微信推文一样的的点亮效果?...

如何实现向人民日报微信推文一样的的点亮效果&#xff1f;有两种方法&#xff1a;方法一&#xff1a;就是使用代码在编辑器进行编辑emmmmmm这个方法贼麻烦&#xff0c;需要调至HTML模式……方法二&#xff1a;在现有编辑器模板下利用SVG动画进行编辑&#xff0c;因为点亮效果本…

python加载项向导_Python安装与环境变量的配置,Python安装向导

我下载的是Python2.7.17Python安装包下载地址&#xff1a;https://www.python.org/downloads/release/python-2717/根据实际的操作系统&#xff0c;安装合适的安装版本Python安装&#xff1a;1.双击下载包&#xff0c;进入Python安装向导。2.选择安装目录。博主安装目录为 D:…

python 单例模式 redis_python 单例模式实现多线程共享连接池

我们经常使用数据库连接池&#xff0c;但那是有时候有些库并没有实现线程安全的连接池&#xff0c;这个时候&#xff0c;该如何自己封装&#xff1f;多进程和多线程甚至协程模式下&#xff0c;如何控制数据库连接数量或者是socket连接数。这个问题很有意义。

python中的return和print的区别_python中return和print的区别(详细)

Huskiesir python最近正在研究。今天,我面临一个问题,那就是,返回和印刷的区别。双方都能输出结果。的区别是什么?闲话少说,看下面的例子。# Code1: def break_words(东西):\u201C这个函数将为我们分手的话。\u201D\u201C单词()返回#输入字符串,输出生成切片列表句 \话说(\u20…

mvc 怎么把后台拼接好的div写到前台_MVC 从后台页面 取前台页面传递过来的值的几种取法...

<1>前台页面 Index视图注意&#xff1a;用户名表单的name值为txtName密码表单的name值为txtPasswordTest用户名密 码<2>后台页面&#xff0c;Home控制器 (为了测试&#xff0c;分别将视图页中的from表单的action设为 action"/Home/Test" &#xff0c;act…

ear的英语怎么念_ear英语怎么读

展开全部英式读法 [ɪə(r)] 。美式读法[ɪr] 。作名词意思是听觉&#xff1b;耳朵&#xff1b;倾听。麦穗。作动词意思是抽穗32313133353236313431303231363533e59b9ee7ad9431333431336661。形容词是earless。过去式是eared。过去分词是eared。现在分词是earing。第三人称单数…