博客
关于我
linux内核mem_cgroup浅析
阅读量:792 次
发布时间:2023-02-03

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

内核内存管理:深入理解内核mem_cgroup

mem_cgroup(内核内存控制组)是内核中用于实现进程内存隔离的一种重要机制。它为系统管理员提供了对内核空间内存的细粒度控制能力。通过将进程划分到不同的mem_cgroup,管理员可以根据需求限制每个组的内存使用范围。这一机制在内核空间内存管理中发挥着关键作用。

mem_cgroup的基本概念

mem_cgroup在内核中通过cgroup(控制组)框架实现。每个mem_cgroup都有自己的内存限制参数,包括:

  • res(物理内存):限制组内使用的物理内存总量。
  • memsw(内存+交换区):限制组内使用的物理内存加上其交换区中的内存总量。
  • 这两个限制参数共同决定了一个mem_cgroup能够占用的内存总量。需要注意的是,memsw总是大于或等于res,因为交换区可以为物理内存提供额外的内存空间。

    mem_cgroup的结构

    mem_cgroup在内核中采用树型结构管理。一个mem_cgroup可以包含多个子mem_cgroup(通过hierarchy参数控制),形成一个层级结构。这种结构使得内核在内存管理时能够按照树的层次逐步处理每个子组。

    mem_cgroup的计数机制

    为了实现内存隔离,mem_cgroup需要统计组内进程使用的内存量。内核通过以下方式实现这一功能:

  • page_cgroup:每个物理页面(page)都有一个page_cgroup结构体,其成员包括指向对应的mem_cgroup和lru(最近使用列表)。
  • swap_cgroup:每个交换区中的swap entry也有一个swap_cgroup结构体,其成员包括指向对应的mem_cgroup ID。
  • 通过这些结构体,内核可以跟踪每个内存页面和swap entry所属的mem_cgroup,进而统计每个mem_cgroup的内存使用情况。

    内存使用的计数方式

    内核对内存使用的计数分为两种类型:

  • 匿名映射(anon page):内核为进程分配的未建立映射的虚拟内存段。
  • 文件映射(page cache):进程通过文件操作加载到内存中的缓存数据。
  • 内核在进程使用或释放这些内存类型时,会分别触发对应的计数操作:

    • 匿名页:当进程分配或释放匿名页时,触发charge或uncharge操作。
    • 文件映射:当进程通过文件操作加载或释放文件缓存时,触发对应的计数操作。

    内存回收(reclaim)

    内核在内存不足时通过reclaim流程回收不再需要的内存页面。mem_cgroup的内存回收流程与全局内存管理方式类似,但增加了对 mem_cgroup的支持,使得回收过程可以按组别进行。

    lru(最近使用)机制

    每个 mem_cgroup维护一个lru列表,用于跟踪组内最不常用的页面。内核在需要回收内存时,首先尝试回收lru列表中的页面。

    内存不足(OOM)处理

    当 mem_cgroup的内存使用超出硬限制(hard_limit)时,内核会进入OOM流程,尝试回收足够的内存。如果无法回收足够的内存,内核会选择一个进程进行杀死,以释放内存空间。

    进程选择

    内核在选择要杀死的进程时,会综合考虑多个因素:

  • 进程的oom_score_adj分数(用户可以通过文件配置调整分数)。
  • 进程的内存使用情况,尤其是对软限制(soft_limit)的超限程度。
  • 配置变化与进程迁移

    mem_cgroup的删除

    删除一个 mem_cgroup需要满足以下条件:

  • mem_cgroup下没有进程。
  • mem_cgroup没有子 mem_cgroup。
  • 删除操作会将 mem_cgroup的计数添加到其父 mem_cgroup,同时释放组内的所有内存页面。

    进程迁移

    进程在 mem_cgroup之间迁移需要谨慎处理。默认情况下,迁移操作不会触发 charge或uncharge操作,但可以通过设置 move_charge_at_immigrate 参数来控制迁移时的计数行为。

    per-CPU缓存(stock cache)

    为了减少内核在多核系统中的竞争,内核引入了 per-CPU缓存机制。每个 CPU维护一个 memcg_stock_pcp 缓存,用于本地处理 charge和uncharge操作,避免多个 CPU同时对同一个 mem_cgroup进行操作带来的竞争。

    总结

    mem_cgroup作为内核中重要的内存管理机制,为系统管理员提供了强大的内存隔离能力。通过合理配置 mem_cgroup,管理员可以根据系统需求,限制不同组的内存使用范围,从而优化系统性能。

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

    你可能感兴趣的文章
    Linux学习笔记001---Windows下安装CentOS7_并且安装桌面UI
    查看>>
    Linux学习笔记003----linux yum命令详解
    查看>>
    Linux学习笔记004----CentOS7 提升普通用户权限到Root权限
    查看>>
    Linux学习笔记005----CentOS7 vi模式保存并退出
    查看>>
    Linux学习笔记006----Linux命令ps使用详解
    查看>>
    Linux学习笔记007---Centos7中配置静态ip
    查看>>
    Linux学习笔记008---Centos7中Couldn't resolve host 'mirrorlist.centos.org'
    查看>>
    Linux学习笔记009---Centos7安装vim ifconfig wget tree等基础命令
    查看>>
    Linux学习笔记010---CentOS7下安装FTP服务
    查看>>
    Linux学习笔记011---编译命令make的认识及使用
    查看>>
    Linux学习笔记013---CentOs7中vsftpd的安装和卸载
    查看>>
    Linux学习笔记014---文件及文件夹权限设置_以及文件、文件夹的删除_移动_复制操作
    查看>>
    Linux学习笔记015---Centos关机命令
    查看>>
    Linux学习笔记016---CentOS7虚拟机设置使用静态IP上网_配置集群的时候可以用
    查看>>
    Linux学习笔记018---Centos7 下安装JDK1.8
    查看>>
    Linux学习笔记019---Centos7下安装Maven
    查看>>
    Linux学习笔记020---CentOs7.3 搭建 Solr单机服务
    查看>>
    Linux学习笔记<二十>——系统裁剪之二
    查看>>
    Linux学习笔记<十七>——Linux系统启动流程
    查看>>
    Linux学习笔记(一)
    查看>>