多租户服务器上实现CPU与内存物理隔离需依赖cgroups v2+systemd slice,而非子网划分;通过cpu.max、memory.max设硬性配额,配合PAM limits兜底,并用systemd-cgtop监控。

子网划分本身不隔离 CPU 和内存资源——它属于网络层技术,只管 IP 地址分配和三层通信边界。想在多租户服务器上真正隔离 CPU 与内存,得靠操作系统内核机制,不是靠划子网。
用 cgroups v2 做统一资源控制器
cgroups v2 是当前 Linux 多租户资源隔离的事实标准,支持 CPU 配额、内存上限、进程数限制,并与 systemd 深度集成。
- 确认启用:检查 /proc/sys/fs/cgroup/unified 是否存在,或内核启动参数含 systemd.unified_cgroup_hierarchy=1
- 为每个租户建 slice:比如在 /sys/fs/cgroup/user.slice/ 下创建 tenant-a.slice,写入:
cpu.max = 50000 100000(即最多用 50% CPU 时间)
memory.max = 2G(硬性内存上限) - 绑定登录会话:修改 /etc/systemd/logind.conf,设 UserSlice=tenant-a.slice,再重启 systemd-logind
配合 PAM limits 做会话级兜底
这是轻量但关键的补充,对所有 SSH 或本地终端生效,防止用户绕过 slice 启动高负载进程。
- 编辑 /etc/security/limits.conf,例如:
tenant-a soft nproc 200
tenant-a hard memory 2097152(单位 KB,即 2GB) - 确保 /etc/pam.d/sshd 和 /etc/pam.d/login 包含:
session required pam_limits.so
别混淆网络隔离和计算隔离
子网划分(如 192.168.10.0/24 和 192.168.20.0/24)只能让租户间无法直连,不能阻止:
- 一个租户的 Python 脚本吃光全部 CPU,导致其他租户命令卡住
- 某个租户启动 Java 进程占满 8GB 内存,触发 OOM killer 杀掉其他进程
- 同一台机器上不同租户的容器共享 CPU 时间片,互相抢占
这些必须由 cgroups 控制,不是防火墙或路由能解决的。
实际部署建议
生产环境推荐组合使用:
- 主控:cgroups v2 + systemd user slice(强制归组)
- 兜底:PAM limits(防 shell 层逃逸)
- 监控:用 systemd-cgtop 或 cgexec -g cpu,memory:tenant-a.slice top 实时查看配额使用
- 避免踩坑:不要混用 cgroups v1 和 v2;memory.max 设值要留余量,避免因 page cache 突增触发 OOM

















