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

近日,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已经发布。该版本包含若干改进,但尚未针对这些情况进行测试。

本文转自d1net(转载)

时间: 2024-09-20 05:29:16

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

Java实时应用程序中的内存管理

使用Java的一个主要优点就是无需担心废弃对象,即,让Java运行时负责Java对象的内存管理. 这是通过让Java运行时对不再使用的Java对象进行垃圾收集而实现的. 垃圾收集是一个比较复杂的过程.通常,Java运行时会遍历堆,检查不再被其他对象引用.从而可以安全删除的对象,然而,由于垃圾收集占用CPU周期,所以它可能会影响应用程序代码的执行.即,如果在执行应用程序代码的过程中执行垃圾收集,则应用程序代码的响应时间可能延长.这会导致用户事务延迟的延长.更为糟糕的是,因为用户不知道何时会进行垃圾

Docker生态系统系列之二:容器化综述

本文讲的是Docker生态系统系列之二:容器化综述,[编者的话]本篇文章是介绍Docker生态系统的第二篇,该文章首先简要介绍了Linux容器化的历史,然后介绍容器化的优点,再讨论Dockerfile的优点,最后讨论了容器化应用的架构. 应用的迁移部署是一件非常复杂的事情.我们不仅要针对每个环境单独调整,可能还会面临其它的问题,比如检查依赖.扩展应用.在不影响整体应用的情况下单独更新组件. Docker容器化的思想和面向服务式的设计模式试图解决这些问题.应用程序可以拆分为可管理的且按功能划分的组

使用 Kubernetes 管理容器化的有状态应用

  编者按:本文转载自"才云 Caicloud",作者 Josh Berkus. 目前,几乎所有关于容器和微服务的谈论都跟"无状态"的应用挂钩.这完全可以理解,因为无状态应用程序更简单.而且容器和编排技术已经成熟到能够承工作负载的程度:即有状态的应用. Kubernetes 是一个用于自动部署.扩展和管理容器化应用程序的开源系统,我之前做过两次关于 Kubernetes.数据库以及容器的演讲. 什么是"无状态"应用? 无状态服务,即 Web 服务

Arista发布容器化、开放EOS版本

本周四,Arista Networks推出了可以在白盒服务器上运行的可扩展操作系统(EOS)版本,之前的EOS版本只能在Arista硬件上运行. Arista的容器化EOS被称为cEOS,现在不仅能运行在Arista自身的商用芯片为基础的平台上,还能运行在其他的裸机交换机和业界标准的虚拟机或容器上. 由于cEOS只能作为另一个容器执行,因此用户将能够在同一个平台上运行其他容器化应用程序,例如自动化或监控工具.Broadcom.HPE和Microsoft Azure已经支持cEOS这样的应用. c

容器化应用的服务可用性

本文讲的是容器化应用的服务可用性[编者的话]高可用性的容器化应用是指服务可用性(连续运行时间).本文介绍了如何借助于容器管理工具来监控和测量服务. [烧脑式Kubernetes实战训练营]本次培训理论结合实践,主要包括:Kubernetes架构和资源调度原理.Kubernetes DNS与服务发现.基于Kubernetes和Jenkins的持续部署方案 .Kubernetes网络部署实践.监控.日志.Kubernetes与云原生应用.在CentOS中部署Kubernetes集群.Kubernet

DockOne微信分享(七十五):应用容器化之Kubernetes实践

本文讲的是DockOne微信分享(七十五):应用容器化之Kubernetes实践[编者的话]本次分享主要以ZooKeeper.Redis.Kafka.MongoDB等应用容器化在Kubernetes平台上面实践.从计算.网络.存储方面解析应用在集成中的问题,以及部分传统应用在容器化过程中设计的应用二次开发等问题.首先介绍应用Docker化的需求和局限.接着介绍基础平台,整体环境包括Kubernetes和ECP,然后介绍具体应用如ZooKeeper在集成中的实践,最后介绍部分开源应用在容器化过程中

从容器化技术到现代云计算有多远?

在接下来的几周,我们将会发布一个新的系列博客,在这个系列中,我们想阐述Google对于容器技术的一些观点,此外我们还会和读者分享Google在过去十年间,在容器中运行服务的一些经验.我们是一支由Google的产品经理.一线技术员以及架构师组成的团队,团队共同的目标是要帮助读者了解"容器技术革命"如何能更有效的构建和运行服务.这次我们邀请了"Google 云平台全球解决方案"的专家Miles Ward来做分享,作为这一系列博客的开篇. 各位好!欢迎来到我们新的系列博客

DockOne微信分享(九十九):海航生态科技舆情大数据平台容器化改造

本文讲的是DockOne微信分享(九十九):海航生态科技舆情大数据平台容器化改造[编者的话]海航舆情监控系统能够为海航集团内部提供监控网络舆情信息,对负面信息.重大舆情及时预警,研判具体舆情或者某一舆情专题事件的发展变化趋势,生成图标报告和各种统计数据,提高舆情工作效率和辅助领导决策.然而,随着项目的持续运行,许多问题逐渐暴露出来,为了解决这些难题,对整个项目重新规划设计,迁移到Hadoop.Spark大数据平台,引进持续化Docker容器部署和发布,开发和运营效率得到显著提升. 一. 舆情平台

阿里搜索业务容器化中的一些经验和思考

概要 参加了上一次CNUTCON 大会,有来自coreos的李响,分享了很多关于etcd的事情,以及关于k8s包括自己和coreos公司的一些观点:还有来自mesos的tim chen, 他分享了很多mesos的思路以及一些接入容器过程中踩过的一些坑:swarm kit的负责人陈东洛也分享了swarm的思路,这方面由于刚出来没多久以及分享的同学也只有他,所以东西并不多:总的来说,感触很深. 关于容器和编排,想到开源和创业 从会议分享者来看.相比去年,容器技术有了更大的发展:docker很热,每一