BT

如何利用碎片时间提升技术认知与能力? 点击获取答案

可能影响容器化应用程序的cgroup内存管理问题

| 作者 Hrishikesh Barua 关注 15 他的粉丝 ,译者 谢丽 关注 11 他的粉丝 发布于 2016年9月6日. 估计阅读时间: 3 分钟 | CNUTCon 了解国内外一线大厂50+智能运维最新实践案例。

近日,LinkedIn工程团队发表了一篇题为“不要让Linux控制组不受控制地运行”的文章。控制组(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)这样的系统指标来估计。

新版本的cgroup已经发布。该版本包含若干改进,但尚未针对这些情况进行测试。

查看英文原文Memory Issues with Linux Control Groups Might Affect Containerized Applications

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我
社区评论

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

讨论

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT