博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
可能影响容器化应用程序的cgroup内存管理问题
阅读量:6430 次
发布时间:2019-06-23

本文共 1099 字,大约阅读时间需要 3 分钟。

近日,LinkedIn发表了一篇题为“”的文章。控制组(cgroup)是Linux的一项特性,像Docker和CoreOS这样的项目使用该特性限制进程的资源使用。该文概括地介绍了cgroup在内存管理方面存在的几个可能导致性能退化的问题以及可能的解决方案。

\\

cgroup是一种可以确保应用程序使用的资源不超出限额的机制,但不保证隔离性。一个操作系统实例中可以运行多个cgroup,其中每一个所使用的内存、CPU等都有不同的限额。不过,当有额外的内存需求(文章作者称之为“内存压力”)时,操作系统的行为可能会导致在cgroup中运行的应用程序出现意料之外的不良结果。

\\

cgroup是按层次组织的,操作系统在“根”cgroup中运行,其他cgroup都是根cgroup的子节点。例如,Docker容器会运行在根cgroup的一个子cgroup中。

\\

该文探讨的问题涉及“匿名内存”和“”,前者是程序请求的内存,后者用来存储程序数据的缓存版本。通常,这些数据是保存在类似硬盘这样的永久性存储上,供程序执行时使用。缓存用于提高那些数据的访问速度。这两种内存类型的分配总是可以被根cgroup或操作系统作废。

\\

当主存可用时,操作系统会将页面缓存加载到RAM,但当应用程序请求额外的内存时,它会回收内存。内存回收会导致页面缓存被删除,这是跨cgroup的,因为在这种情况下,OS不会遵守cgroup自己的设置。这可能导致cgroup的页面缓存被回收,影响了应用程序的性能。

\\

当通过回收页面缓存满足了cgroup的内存需求时,另一个问题出现了。用于存储页面缓存的内存是cgroup内存限额的一部分。因此,如果cgroup(在Docker环境里,则是容器)分得了8GB内存,则它需要将这8GB的空间同时用于页面缓存和匿名内存。这一点很容易忽视,因而可能会导致错误的性能预期。

\\

当需要的主存超过系统可用的内存时,操作系统会执行交换操作,将存储在主存中的程序数据写入辅存,如硬盘。操作系统可以从任意子cgroup把用户内存交换出去,导致那些组中的应用程序性能退化。

\\

对于这些问题,文章作者提出了几项建议,其中包括“预触(pre-touching)”内存,即确保内存在进程启动时分配,而不是在程序请求时。在不同的平台上,具体的做法也不相同。另外,也可以更好地估计应用程序的内存占用,那样,内存分配就可以更准确。页面缓存不容易估计,但匿名内存很容易。匿名内存可以通过类似(RSS)这样的系统指标来估计。

\\

。该版本包含若干改进,但尚未针对这些情况进行测试。

\\

查看英文原文

转载地址:http://vdiga.baihongyu.com/

你可能感兴趣的文章
mysql数据库查询pdo的用法
查看>>
System.load()与System.loadLibrary()
查看>>
Spring websocket 使用
查看>>
1.2魔术方法和延迟静态绑定
查看>>
windows下程序调用jar cvf 时通过动态传参导致生成的文件跑到其他盘符
查看>>
AdminLTE 学习笔记
查看>>
面试时,当你有权提问时,别客气,这是个逆转的好机会(内容摘自Java Web轻量级开发面试教程)...
查看>>
学习本身不难,难得是了解该学哪些——总结下我在架构师升级过程中的那些坑以及各种体会...
查看>>
poj 3216 Repairing Company
查看>>
npm install 错误 安装 chromedriver 失败的解决办法
查看>>
设计模式学习笔记之生成器模式
查看>>
jsp入门
查看>>
ORM之轻量级框架--Dapper
查看>>
asp.net mvc 强类型视图中传入List 数据到控制器
查看>>
自动化邮件报告平台-邮件发送highchart图表
查看>>
进程池的返回值
查看>>
053(二十一)
查看>>
ADO.NET笔记——执行事务
查看>>
QueryString 传值
查看>>
小谈一下反射
查看>>