首页/系统/Linux 内核与性能调优速查/cgroup v2 memory.swap.max 限制
内存与 OOM58 条

cgroup v2 memory.swap.max 限制

限制该组可使用 swap 的上限;设为 0 表示该组不使用 swap,让内存压力以更早的 OOM 暴露而非长期抖动。

接口是什么

memory.swap.max 限制该 cgroup 能使用的 swap 上限,与 memory.max 一起决定内存压力如何表现:设为 0 表示该组完全不换出,进程触及硬限额时会更快 OOM,而不是长期靠换页勉强运行。它对应的用量接口是 memory.swap.current,可以判断容器是否已经把数据换到磁盘上、性能是否受磁盘制约。是否使用 swap 本身还受全局 vm.swappiness 影响。

基本信息

接口路径/sys/fs/cgroup/<组>/memory.swap.current 与 memory.swap.max
取值字节数或 max(不限制);设为 0 即禁止该组换出
systemd 对应MemorySwapMax=
前提条件宿主必须有可用 swap,可用 swapon --show 确认
相关参数vm.swappiness(全局换出倾向)
cgroup 版本cgroup v2 接口;v1 使用 memory.memsw 系列字段

典型使用场景

  • 在线服务要求延迟可预测:禁止换出,避免请求路径上出现磁盘等待
  • 防止某容器大量换出导致磁盘 IO 飙升,进而影响同机其他服务
  • 排查「内存看着够但延迟偏高」:检查 swap.current,可能是换出后在等磁盘
  • 核算真实内存压力:swap.current 与 memory.current 相加才是该组的总内存占用
  • 评估关闭 swap 的影响:OOM 会更早出现,通常需要同步确认 memory.max 是否要放宽

查看与设置

查看与设置
cat /sys/fs/cgroup/myapp.slice/memory.swap.current  # 该组已使用的 swap
cat /sys/fs/cgroup/myapp.slice/memory.swap.max  # swap 上限,max 表示不限制
echo 0 | sudo tee /sys/fs/cgroup/myapp.slice/memory.swap.max  # 禁止该组换出
cat /sys/fs/cgroup/myapp.slice/memory.current  # 与 swap.current 一起看总压力
swapon --show  # 确认宿主 swap 设备与容量
systemctl set-property myapp.service MemorySwapMax=0  # 通过 systemd 持久化

取值与含义

取值含义适用场景
0该组完全不使用 swap延迟敏感、要求行为可预测的在线服务
有限值超出后不再分配 swap,压力转为回收与 OOM需要一点缓冲余量的服务
max不限制 swap 用量对延迟不敏感、优先避免 OOM 的场景
禁用 swap 不会减少内存需求,只是把内存不足更早、更明确地表现为 OOM。做这项调整时通常要同时评估 memory.max:原本靠换页勉强支撑的服务,限制换出后可能直接被终止。
宿主机如果没有启用 swap(swapon --show 无输出),该接口设置得再严格也不会产生实际效果,此时应把重点放在限额与限流的配置上。

易错点

  • 宿主没有 swap 仍然花时间调该接口:没有换出可用时,参数不产生任何实际作用
  • 以为设 0 能省内存:它不减少内存占用,只是改变了压力表现方式
  • 禁止换出却不调 memory.max:OOM 提前发生,服务可用性下降且现象像是「突然被杀」
  • 忽略残留换出数据的 IO 影响:已换出的页在回收路径上仍要读回,磁盘压力依旧存在
  • 在 cgroup v1 环境套用 v2 字段名:v1 用 memory.memsw 系列,读不到对应文件会误导排查

数据来源与参考

  • Linux 内核 Documentation/admin-guide/cgroup-v2.rst
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌