You need to enable JavaScript to run this app.
文档中心
云服务器

云服务器

复制全文
下载 pdf
Linux内核调优
配置Memcg后台异步回收内存
复制全文
下载 pdf
配置Memcg后台异步回收内存
Memcg异步内存回收是veLinux内核在标准Memory Cgroup基础上提供的增强特性。本文主要介绍该功能的原理、配置及查询方法,帮助您在延迟敏感业务中通过后台异步回收降低内存回收对请求延迟的影响。​
注意​
Memcg异步内存回收功能不会扩大cgroup内存上限,也不能替代业务侧内存治理。如果业务长期接近或超过内存上限(memory.limit_in_bytes),仍需结合容量评估、缓存上限治理、内存泄漏排查和cgroup limit调整一起处理。​
背景信息​
Memory Cgroup(简称为Memcg)是Linux内核控制组(cgroup)的内存子系统,用于把一组进程的内存行为与系统其余部分隔离开,并对其内存用量进行统计和限制。常见用途包括隔离内存占用较高的应用、为容器或虚拟机划定内存配额,以及避免单个业务耗尽整机内存。了解更多​
  • 直接内存回收(direct reclaim):当Memcg用量达到上限时,内核会在业务线程申请内存的路径上同步回收内存,回收期间业务线程被阻塞,内存压力升高时表现为请求尾延迟抖动、内存分配耗时升高、服务偶发卡顿。​
  • 异步内存回收(async reclaim):为cgroup配置low、high两个内存水位,当可用内存降至low水位时,Memcg会提前唤醒后台kworker线程异步回收内存,直至可用内存回升至high水位后停止。回收过程不占用业务线程的内存分配路径,业务线程可继续运行不受阻塞,在用量触达上限前提前腾出内存空间,从而降低直接内存回收的触发概率(不能保证完全避免直接内存回收),减少请求延迟抖动。​
适用场景​
业务使用Memcg做内存隔离,并在内存压力升高时出现下列现象时,适合开启Memcg异步内存回收:​
  • 请求尾延迟(P99、P999)抖动明显。​
  • 内存分配(page fault、malloc)耗时升高。​
  • 服务偶发卡顿,但整机CPU、IO资源仍有余量。​
该功能尤其适合延迟敏感、内存分配突发明显、容器或进程组之间需要内存隔离的业务,例如在线服务、缓存服务、实时数据处理等。​
注意事项​
​
项目​
说明​
内核版本​
支持该特性的veLinux内核版本:​
  • veLinux:​
  • 5.4.250-1-velinux1 及以上版本​
  • 5.15.152.ve.7u1 及以上版本​
  • veLinux CentOS Compatible:​
  • 5.4.250-1.ve1 及以上版本​
  • 5.15.152-7.1.ve2 及以上版本​
说明​
若您的实例操作系统内不存在memory.watermark_scale_factor、memory.watermark接口或对应sysctl参数,表示当前内核版本不支持或未启用该功能。​
Cgroup版本​
支持 cgroup v1、cgroup v2。​
说明​
若您的操作系统使用 cgroup v2,建议优先参考 Linux 社区方案,通过 memory.reclaim 接口灵活控制回收时机和回收内存量,最大程度提升内存利用率,降低内存回收影响。​
风险提示​
异步回收特性会在内存水位达到阈值时自动触发,不评估当前回收时机及回收量的合理性,仍可能对业务延迟造成一定影响。​
​
操作步骤​
配置建议​
推荐您先使用cgroup接口对目标业务灰度开启异步内存回收功能,验证收益与CPU开销后,再使用sysctl(配置文件)为后续新建cgroup持久化默认值。仅在业务需要开机自动带入默认值时,考虑通过内核启动参数进行配置。​
​
配置项​
建议​
水位比例​
建议从较小值开始灰度,例如 100。若直接内存回收仍然较多,可逐步上调比例;若CPU开销升高或回收过于频繁,应下调比例。​
启用范围​
建议优先对延迟敏感、已观察到内存回收抖动的Memcg单独开启(cgroup 接口),不建议直接通过sysctl或内核启动参数全量开启。​
回收并发​
建议保持默认值 1。如需调大,应先在测试环境验证CPU开销和业务延迟。​
​
配置方案​
​
使用cgroup接口配置
配置全局sysctl参数
配置内核启动参数
​
该方式仅作用于单个已存在Memcg,配置后立即生效,系统重启或cgroup重建后失效。适合对个别延迟敏感业务先灰度开启,验证尾延迟收益和CPU开销后再扩大范围。​
  1. 执行如下命令,查询单个已存在Memcg的水位比例与实际水位。​
  • ​
    Cgroup v1
    Cgroup v2
    ​
    说明​
    请将 <memcg_path> 替换为目标Memcg的实际路径。​
    ​
    cat /sys/fs/cgroup/memory/<memcg_path>/memory.watermark_scale_factor​
    cat /sys/fs/cgroup/memory/<memcg_path>/memory.watermark​
    ​
    ​
    ​
  • 接口说明:​
  • ​
    接口名​
    属性​
    默认值​
    说明​
    memory.watermark_scale_factor​
    读写​
    0​
    配置当前Memcg的水位比例,取值范围为 0 ~ 1000。​
    • 取值为 0 时,表示关闭该cgroup的异步回收。​
    • ​​​
    • 取值为1000时,low水位按memory.limit_in_bytes的 10% 计算,high水位为low水位的 2 倍。​
    • ​​​
    memory.watermark​
    只读​
    0​
    查看当前cgroup计算得到的low和high水位值,用于确认配置是否生效。​
    ​​​
    ​
  1. 执行如下命令,为指定Memcg配置水位比例。​
  • ​
    Cgroup v1
    Cgroup v2
    ​
    说明​
    请将 <memcg_path> 替换为目标 Memcg 的实际路径,将 100 替换为期望值。​
    ​
    echo 100 > /sys/fs/cgroup/memory/<memcg_path>/memory.watermark_scale_factor​
    ​
    ​
    ​
​
最近更新时间:2026.08.12 11:35:49
这个页面对您有帮助吗?
有用
有用
无用
无用