Linux的memcg残留问题导致系统卡顿或内存不足的解决方案

本文介绍了Linux的memcg残留问题导致系统卡顿或内存不足的原因及解决方案。

问题现象

系统在长时间运行后出现卡顿或内存不足等问题,同时也会出现大量不可回收的unreclaimable slabpercpu内核内存占用。尽管memcg的数量较大,但在/sys/fs/cgroup/memory/目录下的文件夹数量却相对较少。

问题原因

Linux的memcg子系统中的kmem存在设计缺陷。当memcg kmem功能被启用时,如果用户删除该memcg,内核内部某些结构数据仍会保留,这将导致系统在长时间运行后出现卡顿或内存不足等问题。

符合以下条件的系统会出现此问题。

  • Alibaba Cloud Linux 3(内核5.10.134-12.2之前版本)。

  • Alibaba Cloud Linux 2(内核4.19.91-26.6之前版本)。

  • 其它主流Linux发行版本。

解决方案

  1. 禁用memcg kmem功能。

    sudo grubby --update-kernel=ALL --args='cgroup.memory=nokmem'
  2. 重启系统使配置生效。

    sudo reboot
  3. 查看执行结果。

    cat /proc/cmdline

    结果如下图所示,表示禁用memcg kmem功能成功。

    image

  4. 若在执行上述步骤后问题依然存在,则执行以下步骤,尝试通过memcg的周期性后台回收功能来解决该问题。

    重要
    • 此功能仅适用于Alibaba Cloud Linux系统。

    • 此功能开启后,会带来一定的CPU资源开销,根据实际情况评估后确定是否开启,如有问题请关闭后台回收功能。

    • 开启后台回收功能。

      sudo sh -c 'echo 1 > /sys/kernel/mm/memcg_reaper/reap_background'
    • 关闭后台回收功能。

      sudo sh -c 'echo 0 > /sys/kernel/mm/memcg_reaper/reap_background'