- 首页 >
- 问答 >
-
智能运维 >
- Ubuntu Swapper在LXC中如何使用
Ubuntu Swapper在LXC中如何使用
小樊
37
2026-01-08 10:32:57
概念澄清与总体思路
- Ubuntu 没有名为“Swapper”的官方工具,日常所说的“开 swap”通常指:启用内核交换(swap)、创建swap 文件/分区,或在容器环境中为容器提供可用的交换能力。
- 在 LXC 中有两种常见场景:
- LXD 容器:默认可能禁用容器内的 swap,需要在容器配置中显式开启。
- LXC(传统)容器:容器直接使用宿主机的内核与 swap,是否可用取决于宿主机与 cgroup 的内存限制策略。
LXD 容器的做法
- 检查与开启容器交换:
- 查看当前设置:lxc config get <容器名> limits.memory.swap
- 允许容器使用宿主机的 swap:lxc config set <容器名> limits.memory.swap true
- 如为全局策略:lxc profile set default limits.memory.swap true
- 重启容器:lxc restart <容器名>
- 在容器内验证:
- free -m 应能看到 Swap 容量非 0
- 注意:开启后,容器内存超限时可能触发 cgroup OOM,内核日志会出现类似“Memory cgroup out of memory … oom-kill …”的条目,这是预期行为(swap 只能缓解,不能消除 OOM 风险)。
LXC 传统容器的做法
- 原则:传统 LXC 容器共享宿主机内核,容器内的 swap 能力取决于宿主机是否启用 swap 以及是否对容器施加了内存限制。
- 步骤建议:
- 宿主机准备 swap(二者选其一或并用):
- 使用 swap 文件:fallocate -l 2G /swapfile && chmod 600 /swapfile && mkswap /swapfile && swapon /swapfile
- 使用 swap 分区:swapon /dev/sdX
- 容器资源配置(/var/lib/lxc/<容器名>/config 或 /etc/lxc/<容器名>.conf):
- 仅限制内存、允许使用 swap(推荐):
- lxc.cgroup.memory.limit_in_bytes = 2G
- lxc.cgroup.memory.memsw.limit_in_bytes = 4G
- 完全禁止容器使用 swap(严格模式):
- lxc.cgroup.memory.memsw.limit_in_bytes = <与 memory.limit_in_bytes 相同值>
- 在容器内验证:
- free -m 查看 Swap
- 生成压力测试观察是否被 OOM kill:stress-ng --vm 1 --vm-bytes 2.5G --timeout 60s
- 说明:
- 若未设置 memory.memsw.limit_in_bytes,容器在内存紧张时会利用宿主机的 swap;设置后则受“内存+swap”总和上限约束,超过会被 OOM kill。
常见问题与排查
- 已开启 swap 但容器内 free 仍显示 0:
- 对于 LXD:确认 limits.memory.swap 为 true 并已重启容器。
- 对于 LXC:确认宿主机确有可用 swap,且未用 memory.memsw.limit_in_bytes 将“内存+swap”限制为与内存相等。
- 容器被 OOM kill:
- 这是 cgroup 内存不足 的保护行为。可适度增大内存上限或允许更多 swap;若希望“绝对禁止 swap”,将 memory.memsw.limit_in_bytes 设为与 memory.limit_in_bytes 相同。
- 性能影响:
- swap 会显著降低性能,仅作为权宜之计;根本方案是增加物理内存或优化应用内存占用。