接口是什么
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 无输出),该接口设置得再严格也不会产生实际效果,此时应把重点放在限额与限流的配置上。